gpg: default to AES-256.
[gnupg.git] / g10 / compress.c
index 5dd3591..61bb756 100644 (file)
@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 /* Note that the code in compress-bz2.c is nearly identical to the
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <assert.h>
 #include <errno.h>
 #ifdef HAVE_ZIP
 # include <zlib.h>
 # if defined(__riscos__) && defined(USE_ZLIBRISCOS)
 #  include "zlib-riscos.h"
-# endif 
+# endif
 #endif
 
 #include "gpg.h"
-#include "util.h"
+#include "../common/util.h"
 #include "packet.h"
 #include "filter.h"
 #include "main.h"
@@ -48,7 +47,7 @@
 
 #ifdef __riscos__
 #define BYTEF_CAST(a) ((Bytef *)(a))
-#else 
+#else
 #define BYTEF_CAST(a) (a)
 #endif
 
@@ -140,7 +139,7 @@ init_uncompress( compress_filter_context_t *zfx, z_stream *zs )
      * PGP uses a windowsize of 13 bits. Using a negative value for
      * it forces zlib not to expect a zlib header.  This is a
      * undocumented feature Peter Gutmann told me about.
-     *    
+     *
      * We must use 15 bits for the inflator because CryptoEx uses 15
      * bits thus the output would get scrambled w/o error indication
      * if we would use 13 bits.  For the uncompressing this does not
@@ -164,7 +163,8 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
               IOBUF a, size_t *ret_len )
 {
     int zrc;
-    int rc=0;
+    int rc = 0;
+    int leave = 0;
     size_t n;
     int nread, count;
     int refill = !zs->avail_in;
@@ -182,13 +182,14 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
            nread = iobuf_read( a, zfx->inbuf + n, count );
            if( nread == -1 ) nread = 0;
            n += nread;
-           /* If we use the undocumented feature to suppress
-            * the zlib header, we have to give inflate an
-            * extra dummy byte to read */
-           if( nread < count && zfx->algo == 1 ) {
-               *(zfx->inbuf + n) = 0xFF; /* is it really needed ? */
-               zfx->algo1hack = 1;
+           /* Algo 1 has no zlib header which requires us to give
+            * inflate an extra dummy byte to read. To be on the safe
+            * side we allow for up to 4 ff bytes.  */
+           if( nread < count && zfx->algo == 1 && zfx->algo1hack < 4) {
+               *(zfx->inbuf + n) = 0xFF;
+               zfx->algo1hack++;
                n++;
+                leave = 1;
            }
            zs->avail_in = n;
        }
@@ -208,7 +209,8 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
            else
                log_fatal("zlib inflate problem: rc=%d\n", zrc );
        }
-    } while( zs->avail_out && zrc != Z_STREAM_END && zrc != Z_BUF_ERROR );
+    } while (zs->avail_out && zrc != Z_STREAM_END && zrc != Z_BUF_ERROR
+             && !leave);
 
     *ret_len = zfx->outbufsize - zs->avail_out;
     if( DBG_FILTER )
@@ -285,7 +287,7 @@ compress_filter( void *opaque, int control,
           zfx->release (zfx);
     }
     else if( control == IOBUFCTRL_DESC )
-       *(char**)buf = "compress_filter";
+        mem2str (buf, "compress_filter", *ret_len);
     return rc;
 }
 #endif /*HAVE_ZIP*/
@@ -293,6 +295,10 @@ compress_filter( void *opaque, int control,
 static void
 release_context (compress_filter_context_t *ctx)
 {
+  xfree(ctx->inbuf);
+  ctx->inbuf = NULL;
+  xfree(ctx->outbuf);
+  ctx->outbuf = NULL;
   xfree (ctx);
 }
 
@@ -307,7 +313,7 @@ handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd,
     int rc;
 
     if(check_compress_algo(cd->algorithm))
-      return G10ERR_COMPR_ALGO;
+      return GPG_ERR_COMPR_ALGO;
     cfx = xmalloc_clear (sizeof *cfx);
     cfx->release = release_context;
     cfx->algo = cd->algorithm;