1From bd5773947af5ca80ca546ad5625818fc912bdd60 Mon Sep 17 00:00:00 2001 2From: "Roy.Li" <rongqing.li@windriver.com> 3Date: Thu, 22 Aug 2013 08:56:09 +0800 4Subject: [PATCH] tftp-hpa: add error check for disk filled up 5 6Upstream-status: Pending [Sent to http://www.syslinux.org/archives/2013-August/020765.html] 7 8Add error check when the write-buffer is finally flushed to the file, 9the caller can detect if the disk filled up (or had an i/o error) and 10return a NOSAPCE nak to the other side. 11 12Signed-off-by: Ming Liu <ming.liu@windriver.com> 13Signed-off-by: Roy.Li <rongqing.li@windriver.com> 14--- 15 common/tftpsubs.c | 8 +++++--- 16 tftpd/tftpd.c | 12 ++++++++++-- 17 2 files changed, 15 insertions(+), 5 deletions(-) 18 19diff --git a/common/tftpsubs.c b/common/tftpsubs.c 20index 8c999f6..b4d4ffe 100644 21--- a/common/tftpsubs.c 22+++ b/common/tftpsubs.c 23@@ -206,20 +206,22 @@ int write_behind(FILE * file, int convert) 24 25 p = buf; 26 ct = count; 27+ count = 0; 28 while (ct--) { /* loop over the buffer */ 29 c = *p++; /* pick up a character */ 30 if (prevchar == '\r') { /* if prev char was cr */ 31 if (c == '\n') /* if have cr,lf then just */ 32- fseek(file, -1, 1); /* smash lf on top of the cr */ 33+ count = count - 1; 34 else if (c == '\0') /* if have cr,nul then */ 35 goto skipit; /* just skip over the putc */ 36 /* else just fall through and allow it */ 37 } 38- putc(c, file); 39+ buf[count] = c; 40+ count ++; 41 skipit: 42 prevchar = c; 43 } 44- return count; 45+ return write(fileno(file), buf, count); 46 } 47 48 /* When an error has occurred, it is possible that the two sides 49diff --git a/tftpd/tftpd.c b/tftpd/tftpd.c 50index 1873e70..c2adbda 100644 51--- a/tftpd/tftpd.c 52+++ b/tftpd/tftpd.c 53@@ -1681,7 +1681,11 @@ static void tftp_recvfile(const struct formats *pf, struct tftphdr *oap, int oac 54 syslog(LOG_WARNING, "tftpd: write(ack): %m"); 55 goto abort; 56 } 57- write_behind(file, pf->f_convert); 58+ if(write_behind(file, pf->f_convert) < 0) { 59+ nak(ENOSPACE, NULL); 60+ (void)fclose(file); 61+ goto abort; 62+ } 63 for (;;) { 64 n = recv_time(peer, dp, PKTSIZE, 0, &r_timeout); 65 if (n < 0) { /* really? */ 66@@ -1712,7 +1716,11 @@ static void tftp_recvfile(const struct formats *pf, struct tftphdr *oap, int oac 67 goto abort; 68 } 69 } while (size == segsize); 70- write_behind(file, pf->f_convert); 71+ if(write_behind(file, pf->f_convert) < 0) { 72+ nak(ENOSPACE, NULL); 73+ (void)fclose(file); 74+ goto abort; 75+ } 76 (void)fclose(file); /* close data file */ 77 78 ap->th_opcode = htons((u_short) ACK); /* send the "final" ack */ 79-- 801.7.10.4 81 82