Great! Thanks a lot for your help
Regards Steven Enderle Hrvoje Niksic wrote: > Hack Kampbj�rn <[EMAIL PROTECTED]> writes: > > >>>assertion "percentage <= 100" failed: file "progress.c", line 552 >>>zsh: abort (core dumped) wget -m -c --tries=0 >>>ftp://ftp.scene.org/pub/music/artists/nutcase/mp3/timeofourlives.mp3 >> >>progress.c >> int percentage = (int)(100.0 * size / bp->total_length); >> >> assert (percentage <= 100); >>Of course the assert will fail, size is bigger than total_length ! > > [...] > >>To reproduce with wget-1.8.1 >>$ wget ftp://sunsite.dk/disk1/gnu/wget/wget-1.8{,.1}.tar.gz >>$ cat wget-1.8.tar.gz >> wget-1.8.1.tar.gz >>$ wget -d -c ftp://sunsite.dk/disk1/gnu/wget/wget-1.8.1.tar.gz > > > Thanks for looking into this. There are two problems here, and most > likely two separate bugs. > > First, I cannot repeat your test case. Maybe sunsite.dk changed their > FTP server since Feb 15; anyway, what I get is: > > --> REST 2185627 > > 350 Restarting at 2185627 > --> RETR wget-1.8.1.tar.gz > > 451-Restart offset 2185627 is too large for file size 1097780. > 451 Restart offset reset to 0 > > Wget (bogusly) considers the 451 response to be "error in server > response" and retries. That's bug number one, but it also means that > I cannot repeat your test case. > > > Bug number two is the one the reporter saw. At first I didn't quite > understand how it can happen, since bar_update() explicitly guards > against such a condition: > > if (bp->total_length > 0 > && bp->count + bp->initial_length > bp->total_length) > /* We could be downloading more than total_length, e.g. when the > server sends an incorrect Content-Length header. In that case, > adjust bp->total_length to the new reality, so that the code in > create_image() that depends on total size being smaller or > equal to the expected size doesn't abort. */ > bp->total_length = bp->count + bp->initial_length; > > The problem is that the same guard is not implemented in bar_create() > and bar_finish(), which also call create_image(). In the FTP case, > the crash comes from bar_create. This patch should fix it. > > 2002-04-11 Hrvoje Niksic <[EMAIL PROTECTED]> > > * progress.c (bar_create): If INITIAL is larger than TOTAL, fix > TOTAL. > (bar_finish): Likewise. > > Index: src/progress.c > =================================================================== > RCS file: /pack/anoncvs/wget/src/progress.c,v > retrieving revision 1.27 > diff -u -r1.27 progress.c > --- src/progress.c 2002/04/11 17:49:32 1.27 > +++ src/progress.c 2002/04/11 18:49:08 > @@ -461,6 +461,11 @@ > > memset (bp, 0, sizeof (*bp)); > > + /* In theory, our callers should take care of this pathological > + case, but it can sometimes happen. */ > + if (initial > total) > + total = initial; > + > bp->initial_length = initial; > bp->total_length = total; > > @@ -493,7 +498,7 @@ > adjust bp->total_length to the new reality, so that the code in > create_image() that depends on total size being smaller or > equal to the expected size doesn't abort. */ > - bp->total_length = bp->count + bp->initial_length; > + bp->total_length = bp->initial_length + bp->count; > > /* This code attempts to determine the current download speed. We > measure the speed over the interval of approximately three > @@ -564,6 +569,11 @@ > bar_finish (void *progress, long dltime) > { > struct bar_progress *bp = progress; > + > + if (bp->total_length > 0 > + && bp->count + bp->initial_length > bp->total_length) > + /* See bar_update() for explanation. */ > + bp->total_length = bp->initial_length + bp->count; > > create_image (bp, dltime); > display_image (bp->buffer); > > >
