(write_plaintext_packet): Fixed the detection of too
authorWerner Koch <wk@gnupg.org>
Fri, 7 May 2004 09:31:29 +0000 (09:31 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 7 May 2004 09:31:29 +0000 (09:31 +0000)
large files in the same way as in encode.c.

g10/ChangeLog
g10/sign.c

index 2328a28..918798d 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-07  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (write_plaintext_packet): Fixed the detection of too
+       large files in the same way as in encode.c.
+
 2004-05-04  David Shaw  <dshaw@jabberwocky.com>
 
        * keylist.c (show_notation): Use bits to select which sort of
index 8e99548..44c53f8 100644 (file)
@@ -544,19 +544,24 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
 
     /* try to calculate the length of the data */
     if (fname && *fname && !(*fname=='-' && !fname[1])) {
-        if( !(filesize = iobuf_get_filelength(inp)) )
+        off_t tmpsize;
+       
+        if( !(tmpsize = iobuf_get_filelength(inp)) )
             log_info (_("WARNING: `%s' is an empty file\n"), fname);
 
-        /* we can't yet encode the length of very large files,
-         * so we switch to partial length encoding in this case */
-        if (filesize >= IOBUF_FILELENGTH_LIMIT)
-            filesize = 0;
+        /* We can't encode the length of very large files because
+           OpenPGP uses only 32 bit for file sizes.  So if the size of
+           a file is larger than 2^32 minus some bytes for packet
+           headers, we switch to partial length encoding. */
+        if ( tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536) )
+          filesize = tmpsize;
+        else
+          filesize = 0;
 
-        /* because the text_filter modifies the length of the
+        /* Because the text_filter modifies the length of the
          * data, it is not possible to know the used length
          * without a double read of the file - to avoid that
-         * we simple use partial length packets.
-         */
+         * we simple use partial length packets. */
         if ( ptmode == 't' )
             filesize = 0;
     }