[ostree] static-delta: Handle LZMA_BUF_ERROR returned by zlib



commit dd35e1b9cdb4b8abf0ffd15263ae33db3e729d75
Author: John Hiesey <john hiesey com>
Date:   Wed Oct 7 13:30:33 2015 -0700

    static-delta: Handle LZMA_BUF_ERROR returned by zlib
    
    zlib can return LZMA_BUF_ERROR, which indicates that either
    the input or output buffer has size zero. This case should cause
    the correct error to be passed back from g_converter_convert
    to expand the relevant buffer. Since this error is ambiguous
    as to which buffer is too small, an explicit check on the
    output buffer size is added as well.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=756260

 src/libostree/ostree-lzma-common.c       |    4 ++++
 src/libostree/ostree-lzma-compressor.c   |    7 +++++++
 src/libostree/ostree-lzma-decompressor.c |    7 +++++++
 3 files changed, 18 insertions(+), 0 deletions(-)
---
diff --git a/src/libostree/ostree-lzma-common.c b/src/libostree/ostree-lzma-common.c
index 3600efd..61f3a2a 100644
--- a/src/libostree/ostree-lzma-common.c
+++ b/src/libostree/ostree-lzma-common.c
@@ -62,6 +62,10 @@ _ostree_lzma_return (lzma_ret   res,
       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                           "Data is corrupt");
       return G_CONVERTER_ERROR;
+    case LZMA_BUF_ERROR:
+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT,
+         "Input buffer too small");
+      return G_CONVERTER_ERROR;
     default:
       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                           "Unrecognized LZMA error");
diff --git a/src/libostree/ostree-lzma-compressor.c b/src/libostree/ostree-lzma-compressor.c
index ce429f9..1ec03c4 100644
--- a/src/libostree/ostree-lzma-compressor.c
+++ b/src/libostree/ostree-lzma-compressor.c
@@ -173,6 +173,13 @@ _ostree_lzma_compressor_convert (GConverter *converter,
   int res;
   lzma_action action; 
 
+  if (inbuf_size != 0 && outbuf_size == 0)
+    {
+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
+         "Output buffer too small");
+      return G_CONVERTER_ERROR;
+    }
+
   if (!self->initialized)
     {
       res = lzma_easy_encoder (&self->lstream, 8, LZMA_CHECK_CRC64);
diff --git a/src/libostree/ostree-lzma-decompressor.c b/src/libostree/ostree-lzma-decompressor.c
index 5163013..b46e8fb 100644
--- a/src/libostree/ostree-lzma-decompressor.c
+++ b/src/libostree/ostree-lzma-decompressor.c
@@ -104,6 +104,13 @@ _ostree_lzma_decompressor_convert (GConverter *converter,
   OstreeLzmaDecompressor *self = OSTREE_LZMA_DECOMPRESSOR (converter);
   int res;
 
+  if (inbuf_size != 0 && outbuf_size == 0)
+    {
+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
+         "Output buffer too small");
+      return G_CONVERTER_ERROR;
+    }
+
   if (!self->initialized)
     {
       res = lzma_stream_decoder (&self->lstream, G_MAXUINT64, 0);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]