build: Require latest released libraries
[gnupg.git] / common / iobuf.c
index a0d48c6..f3d67b4 100644 (file)
@@ -1683,10 +1683,10 @@ iobuf_push_filter2 (iobuf_t a,
 /****************
  * Remove an i/o filter.
  */
-static int
-pop_filter (iobuf_t a, int (*f) (void *opaque, int control,
-                              iobuf_t chain, byte * buf, size_t * len),
-           void *ov)
+int
+iobuf_pop_filter (iobuf_t a, int (*f) (void *opaque, int control,
+                                       iobuf_t chain, byte * buf, size_t * len),
+                  void *ov)
 {
   iobuf_t b;
   size_t dummy_len = 0;
@@ -1716,12 +1716,13 @@ pop_filter (iobuf_t a, int (*f) (void *opaque, int control,
     if (b->filter == f && (!ov || b->filter_ov == ov))
       break;
   if (!b)
-    log_bug ("pop_filter(): filter function not found\n");
+    log_bug ("iobuf_pop_filter(): filter function not found\n");
 
   /* flush this stream if it is an output stream */
   if (a->use == IOBUF_OUTPUT && (rc = filter_flush (b)))
     {
-      log_error ("filter_flush failed in pop_filter: %s\n", gpg_strerror (rc));
+      log_error ("filter_flush failed in iobuf_pop_filter: %s\n",
+                 gpg_strerror (rc));
       return rc;
     }
   /* and tell the filter to free it self */
@@ -2227,8 +2228,8 @@ size_t
 iobuf_copy (iobuf_t dest, iobuf_t source)
 {
   char *temp;
-  /* Use a 1 MB buffer.  */
-  const size_t temp_size = 1024 * 1024;
+  /* Use a 32 KB buffer.  */
+  const size_t temp_size = 32 * 1024;
 
   size_t nread;
   size_t nwrote = 0;
@@ -2268,7 +2269,7 @@ iobuf_flush_temp (iobuf_t temp)
   if (temp->use == IOBUF_INPUT || temp->use == IOBUF_INPUT_TEMP)
     log_bug ("iobuf_flush_temp called on an input pipeline!\n");
   while (temp->chain)
-    pop_filter (temp, temp->filter, NULL);
+    iobuf_pop_filter (temp, temp->filter, NULL);
 }
 
 
@@ -2467,9 +2468,9 @@ iobuf_seek (iobuf_t a, off_t newpos)
 
   /* remove filters, but the last */
   if (a->chain)
-    log_debug ("pop_filter called in iobuf_seek - please report\n");
+    log_debug ("iobuf_pop_filter called in iobuf_seek - please report\n");
   while (a->chain)
-    pop_filter (a, a->filter, NULL);
+    iobuf_pop_filter (a, a->filter, NULL);
 
   return 0;
 }
@@ -2515,32 +2516,35 @@ iobuf_get_fname_nonnull (iobuf_t a)
 
 
 /****************
- * enable partial block mode as described in the OpenPGP draft.
- * LEN is the first length byte on read, but ignored on writes.
+ * Enable or disable partial body length mode (RFC 4880 4.2.2.4).
+ *
+ * If LEN is 0, this disables partial block mode by popping the
+ * partial body length filter, which which must be the most recently
+ * added filter.
+ *
+ * If LEN is non-zero, it pushes a partial body length filter.  If
+ * this is a read filter, LEN must be the length byte from the first
+ * chunk and A should be position just after this first partial body
+ * length header.
  */
 void
 iobuf_set_partial_body_length_mode (iobuf_t a, size_t len)
 {
-  block_filter_ctx_t *ctx = xcalloc (1, sizeof *ctx);
-
-  ctx->use = a->use;
   if (!len)
+    /* Disable partial body length mode.  */
     {
       if (a->use == IOBUF_INPUT)
-       log_debug ("pop_filter called in set_partial_block_mode"
+       log_debug ("iobuf_pop_filter called in set_partial_block_mode"
                   " - please report\n");
-      /* XXX: This pop_filter doesn't make sense.  Since we haven't
-        actually added the filter to the pipeline yet, why are we
-        popping anything?  Moreover, since we don't report an error,
-        the caller won't directly see an error.  I think that it
-        would be better to push the filter and set a->error to
-        GPG_ERR_BAD_DATA, but Werner thinks it's impossible for len
-        to be 0 (but he doesn't want to remove the check just in
-        case).  */
-      pop_filter (a, block_filter, NULL);
+
+      log_assert (a->filter == block_filter);
+      iobuf_pop_filter (a, block_filter, NULL);
     }
   else
+    /* Enabled partial body length mode.  */
     {
+      block_filter_ctx_t *ctx = xcalloc (1, sizeof *ctx);
+      ctx->use = a->use;
       ctx->partial = 1;
       ctx->size = 0;
       ctx->first_c = len;