gpg: Allow the caller to write the contents of a plaintext packet.
authorNeal H. Walfield <neal@g10code.com>
Wed, 2 Mar 2016 14:35:39 +0000 (15:35 +0100)
committerNeal H. Walfield <neal@g10code.com>
Wed, 2 Mar 2016 19:36:14 +0000 (20:36 +0100)
* g10/build-packet.c (do_plaintext): Change the semantics such that if
PT->BUF is NULL, it is the caller's responsibility to write the
content (and disable partial body length mode, if appropriate).

--
Signed-off-by: Neal H. Walfield <neal@g10code.com>
g10/build-packet.c

index 623533f..40c466b 100644 (file)
@@ -618,7 +618,12 @@ calc_plaintext( PKT_plaintext *pt )
    after this much data has been read.)  If PT->LEN is 0 and CTB
    indicates that this is a new format packet, then partial block mode
    is assumed to have been enabled on OUT.  On success, partial block
-   mode is disabled.  */
+   mode is disabled.
+
+   If PT->BUF is NULL, the the caller must write out the data.  In
+   this case, if PT->LEN was 0, then partial body length mode was
+   enabled and the caller must disable it by calling
+   iobuf_set_partial_body_length_mode (out, 0).  */
 static int
 do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
 {
@@ -637,13 +642,16 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
     if (rc)
       return rc;
 
-    nbytes = iobuf_copy (out, pt->buf);
-    if(ctb_new_format_p (ctb) && !pt->len)
-      /* Turn off partial body length mode.  */
-      iobuf_set_partial_body_length_mode (out, 0);
-    if( pt->len && nbytes != pt->len )
-      log_error("do_plaintext(): wrote %lu bytes but expected %lu bytes\n",
-               (ulong)nbytes, (ulong)pt->len );
+    if (pt->buf)
+      {
+        nbytes = iobuf_copy (out, pt->buf);
+        if(ctb_new_format_p (ctb) && !pt->len)
+          /* Turn off partial body length mode.  */
+          iobuf_set_partial_body_length_mode (out, 0);
+        if( pt->len && nbytes != pt->len )
+          log_error("do_plaintext(): wrote %lu bytes but expected %lu bytes\n",
+                    (ulong)nbytes, (ulong)pt->len );
+      }
 
     return rc;
 }