See ChangeLog: Mon Jan 24 22:24:38 CET 2000 Werner Koch
[gnupg.git] / g10 / compress.c
index 5aad678..478da56 100644 (file)
@@ -28,7 +28,7 @@
 #include <zlib.h>
 
 #include "util.h"
-#include "memory.h"
+#include <gcrypt.h>
 #include "packet.h"
 #include "filter.h"
 #include "options.h"
@@ -63,7 +63,7 @@ init_compress( compress_filter_context_t *zfx, z_stream *zs )
     }
 
     zfx->outbufsize = 8192;
-    zfx->outbuf = m_alloc( zfx->outbufsize );
+    zfx->outbuf = gcry_xmalloc( zfx->outbufsize );
 }
 
 static int
@@ -121,7 +121,7 @@ init_uncompress( compress_filter_context_t *zfx, z_stream *zs )
     }
 
     zfx->inbufsize = 2048;
-    zfx->inbuf = m_alloc( zfx->inbufsize );
+    zfx->inbuf = gcry_xmalloc( zfx->inbufsize );
     zs->avail_in = 0;
 }
 
@@ -132,8 +132,7 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
     int zrc;
     int rc=0;
     size_t n;
-    byte *p;
-    int c;
+    int nread, count;
     int refill = !zs->avail_in;
 
     if( DBG_FILTER )
@@ -145,10 +144,17 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
            n = zs->avail_in;
            if( !n )
                zs->next_in = zfx->inbuf;
-           for( p=zfx->inbuf+n; n < zfx->inbufsize; n++, p++ ) {
-               if( (c=iobuf_get(a)) == -1 )
-                   break;
-               *p = c & 0xff;
+           count = zfx->inbufsize - n;
+           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;
+               n++;
            }
            zs->avail_in = n;
        }
@@ -190,7 +196,7 @@ compress_filter( void *opaque, int control,
 
     if( control == IOBUFCTRL_UNDERFLOW ) {
        if( !zfx->status ) {
-           zs = zfx->opaque = m_alloc_clear( sizeof *zs );
+           zs = zfx->opaque = gcry_xcalloc( 1, sizeof *zs );
            init_uncompress( zfx, zs );
            zfx->status = 1;
        }
@@ -215,7 +221,7 @@ compress_filter( void *opaque, int control,
            pkt.pkt.compressed = &cd;
            if( build_packet( a, &pkt ))
                log_bug("build_packet(PKT_COMPRESSED) failed\n");
-           zs = zfx->opaque = m_alloc_clear( sizeof *zs );
+           zs = zfx->opaque = gcry_xcalloc( 1, sizeof *zs );
            init_compress( zfx, zs );
            zfx->status = 2;
        }
@@ -227,18 +233,18 @@ compress_filter( void *opaque, int control,
     else if( control == IOBUFCTRL_FREE ) {
        if( zfx->status == 1 ) {
            inflateEnd(zs);
-           m_free(zs);
+           gcry_free(zs);
            zfx->opaque = NULL;
-           m_free(zfx->outbuf); zfx->outbuf = NULL;
+           gcry_free(zfx->outbuf); zfx->outbuf = NULL;
        }
        else if( zfx->status == 2 ) {
            zs->next_in = buf;
            zs->avail_in = 0;
            do_compress( zfx, zs, Z_FINISH, a );
            deflateEnd(zs);
-           m_free(zs);
+           gcry_free(zs);
            zfx->opaque = NULL;
-           m_free(zfx->outbuf); zfx->outbuf = NULL;
+           gcry_free(zfx->outbuf); zfx->outbuf = NULL;
        }
     }
     else if( control == IOBUFCTRL_DESC )
@@ -250,7 +256,7 @@ compress_filter( void *opaque, int control,
  * Handle a compressed packet
  */
 int
-handle_compressed( PKT_compressed *cd,
+handle_compressed( void *procctx, PKT_compressed *cd,
                   int (*callback)(IOBUF, void *), void *passthru )
 {
     compress_filter_context_t cfx;
@@ -265,7 +271,7 @@ handle_compressed( PKT_compressed *cd,
     if( callback )
        rc = callback(cd->buf, passthru );
     else
-       rc = proc_packets(cd->buf);
+       rc = proc_packets(procctx, cd->buf);
   #if 0
     iobuf_pop_filter( cd->buf, compress_filter, &cfx );
     if( cd->len )