Hello developers,

I'm Yasuoka Masahiko from Japan.  I sent 2 messages about a bug on
token.c.  It appears like bellow,

   dev1: {79} % rsync -Iz install-disk2.iso 127.0.0.1:/var/tmp/install-disk2.iso
   deflate on token returned 0 (16384 bytes left)
   rsync error: error in rsync protocol data stream (code 12) at token.c(288)
   dev1: {80} % 

I think this is serious.  I hope you will fix this problem.

Previous patch I sent last week is still buggy,

On Sun, 29 Jun 2003 10:32:33 +0900 (JST)
Yasuoka Masahiko <[EMAIL PROTECTED]> wrote:
> > Let's looked at token.c.
> > 
> >     280      tx_strm.next_in = (Bytef *) map_ptr(buf, offset, toklen);
> >     281      tx_strm.avail_in = toklen;
> >     282      tx_strm.next_out = (Bytef *) obuf;
> >     283      tx_strm.avail_out = MAX_DATA_COUNT;
> >     284      r = deflate(&tx_strm, Z_INSERT_ONLY);
> >     285      if (r != Z_OK || tx_strm.avail_in != 0) {
> >     286              rprintf(FERROR, "deflate on token returned %d (%d bytes 
> > left)\n",
> >     287                      r, tx_strm.avail_in);
> >     288              exit_cleanup(RERR_STREAMIO);
> >     289      }
> > 
> > MAX_DATA_COUNT is 16383 and toklen may be 16384.  So, when deflate()'s
> > outputs data length is bigger than input, then above code will fail.
> > Normally output data length is smaller than input, but it is not true
> > to already compressed data.

In addition to, tx_strm context keeps pending output.  It must be
flushed here.

Please check bellow patch.
***
Index: token.c
===================================================================
RCS file: /vol/cvs/datacube/src/auxcmd/rsync/token.c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 token.c
--- token.c     8 Apr 2002 08:35:30 -0000       1.1.1.1
+++ token.c     3 Jul 2003 07:50:44 -0000
@@ -279,14 +279,25 @@ send_deflated_token(int f, int token,
                   history and hash table */
                tx_strm.next_in = (Bytef *) map_ptr(buf, offset, toklen);
                tx_strm.avail_in = toklen;
-               tx_strm.next_out = (Bytef *) obuf;
-               tx_strm.avail_out = MAX_DATA_COUNT;
-               r = deflate(&tx_strm, Z_INSERT_ONLY);
-               if (r != Z_OK || tx_strm.avail_in != 0) {
+               do {
+                       tx_strm.next_out = (Bytef *) obuf;
+                       tx_strm.avail_out = MAX_DATA_COUNT;
+                       r = deflate(&tx_strm, Z_INSERT_ONLY);
+                       if (r != Z_OK) {
+                               rprintf(FERROR, "deflate on token returned %d "
+                                   "(%d bytes left)\n", r, tx_strm.avail_in);
+                               exit_cleanup(RERR_STREAMIO);
+                       }
+               } while (tx_strm.avail_out == 0 && tx_strm.avail_in > 0);
+               if (tx_strm.avail_in != 0) {
                        rprintf(FERROR, "deflate on token returned %d (%d bytes 
left)\n",
                                r, tx_strm.avail_in);
                        exit_cleanup(RERR_STREAMIO);
                }
+               /* flush out pending output */
+               tx_strm.next_out = (Bytef *) obuf;
+               tx_strm.avail_out = MAX_DATA_COUNT;
+               r = deflate(&tx_strm, Z_SYNC_FLUSH);
        }
 }
 
***
 
--yasuoka

    Yasuoka Masahiko ([EMAIL PROTECTED])
    Second Software Inc.   http://www.second-software.com/
-- 
To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to