summaryrefslogtreecommitdiff
path: root/net-misc/iputils/files/iputils-20200821-fclose.patch
diff options
context:
space:
mode:
Diffstat (limited to 'net-misc/iputils/files/iputils-20200821-fclose.patch')
-rw-r--r--net-misc/iputils/files/iputils-20200821-fclose.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/net-misc/iputils/files/iputils-20200821-fclose.patch b/net-misc/iputils/files/iputils-20200821-fclose.patch
new file mode 100644
index 000000000000..cc370f0a5561
--- /dev/null
+++ b/net-misc/iputils/files/iputils-20200821-fclose.patch
@@ -0,0 +1,45 @@
+From e1c3d09b412ad0d022178344b8cbf748dc60f17f Mon Sep 17 00:00:00 2001
+From: Mike Gilbert <floppym@gentoo.org>
+Date: Sun, 24 Jan 2021 23:29:27 -0500
+Subject: [PATCH] tftpd: recvfile: avoid closing the file twice
+
+The close_stream function calls fclose, so don't call it again.
+
+This resolves an abort in glibc:
+
+ Message: Process 1038079 (tftpd) of user 65534 dumped core.
+
+ Stack trace of thread 1038079:
+ #0 0x00007f5f650ed204 raise (libc.so.6 + 0x39204)
+ #1 0x00007f5f650d6547 abort (libc.so.6 + 0x22547)
+ #2 0x00007f5f6512f25f n/a (libc.so.6 + 0x7b25f)
+ #3 0x00007f5f651372fa n/a (libc.so.6 + 0x832fa)
+ #4 0x00007f5f65138dc2 n/a (libc.so.6 + 0x84dc2)
+ #5 0x00007f5f65124b2f fclose (libc.so.6 + 0x70b2f)
+ #6 0x000055571a50de73 recvfile (tftpd + 0x2e73)
+ #7 0x000055571a50e064 tftp (tftpd + 0x3064)
+ #8 0x000055571a50e387 tftpd_inetd (tftpd + 0x3387)
+ #9 0x000055571a50e50f main (tftpd + 0x350f)
+ #10 0x00007f5f650d7e6d __libc_start_main (libc.so.6 + 0x23e6d)
+ #11 0x000055571a50d3ca _start (tftpd + 0x23ca)
+
+Fixes: 5d6be65 ("tftpd: remove global variables by using a run state struct")
+
+Reviewed-by: Petr Vorel <pvorel@suse.cz>
+Signed-off-by: Mike Gilbert <floppym@gentoo.org>
+---
+ tftpd/tftpd.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/tftpd/tftpd.c b/tftpd/tftpd.c
+index 42998f9b..a09d32ba 100644
+--- a/tftpd/tftpd.c
++++ b/tftpd/tftpd.c
+@@ -387,7 +387,6 @@ void recvfile(struct run_state *ctl, struct formats *pf)
+ write_behind(ctl->file, pf->f_convert);
+ if (close_stream(ctl->file))
+ syslog(LOG_ERR, "tftpd: write error: %s\n", strerror(errno));
+- fclose(ctl->file); /* close data file */
+
+ ap->th_opcode = htons((uint16_t)ACK); /* send the "final" ack */
+ ap->th_block = htons(block);