Interesting. snprintf should not matter. Something else is going on. I think we should investigate why it fails instead of using the big signal hammer. christos > On Jul 3, 2021, at 5:17 AM, RVP <rvp%SDF.ORG@localhost> wrote: > > On Thu, 1 Jul 2021, RVP wrote: > >> Can you try the patch below? >> > > Well, fixing this in the obvious manner seems to have uncovered > a more serious bug: stream corruption, due to, I suspect, using > stdio functions (snprintf) inside the SIGALRM handler for the > progress-bar: > > > > $ for i in base comp games modules man misc text > do sudo mkdir X > (cd X; ftp -o "| pax -zrvpe" http://localhost:8080/ftp/$i.tar.xz) > sudo rm -rf X > done > > [...] > ./usr/lib/libssl.a > ./usr/lib/libssl_p.a > 42% |*********** | 25504 KiB 3.54 MiB/s 00:09 ETA > gzip: File is corrupt > ftp: Writing `| pax -zrvpe': Broken pipe > > pax: End of archive volume 1 reached > pax: ustar vol 1, 2599 files, 186306685 bytes read, 0 bytes written in 7 secs (26615240 bytes/sec) > > ATTENTION! pax archive volume change required. > Ready for archive volume: 2 > Input archive name or "." to quit pax. > > > > Until that is fixed, either a) disable the progress-bar using > -V, or b) use the hack below. Apply patch to the original ftp > source. > > ---START--- > diff -urN ftp.orig/fetch.c ftp/fetch.c > --- ftp.orig/fetch.c 2020-07-11 00:29:38.000000000 +0000 > +++ ftp/fetch.c 2021-07-02 13:36:14.816477000 +0000 > @@ -61,6 +61,7 @@ > #include <errno.h> > #include <netdb.h> > #include <fcntl.h> > +#include <signal.h> > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > @@ -1641,6 +1642,9 @@ > bufrem = MIN(chunksize, bufrem); > while (bufrem > 0) { > size_t nr = MIN((off_t)bufsize, bufrem); > + sigset_t sig, osig; > + sigemptyset(&sig); > + sigaddset(&sig, SIGALRM); > flen = fetch_read(xferbuf, sizeof(char), > nr, fin); > if (flen == 0) { > @@ -1650,11 +1654,14 @@ > } > bytes += flen; > bufrem -= flen; > + sigprocmask(SIG_BLOCK, &sig, &osig); > if (fwrite(xferbuf, sizeof(char), flen, fout) > != flen) { > warn("Writing `%s'", savefile); > + sigprocmask(SIG_SETMASK, &osig, NULL); > goto cleanup_fetch_url; > } > + sigprocmask(SIG_SETMASK, &osig, NULL); > if (hash && !progress) { > while (bytes >= hashbytes) { > (void)putc('#', ttyout); > ---END--- > > -RVP
Attachment:
signature.asc
Description: Message signed with OpenPGP