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