Patrick Williams | b48b7b4 | 2016-08-17 15:04:38 -0500 | [diff] [blame] | 1 | From bd5773947af5ca80ca546ad5625818fc912bdd60 Mon Sep 17 00:00:00 2001 |
| 2 | From: "Roy.Li" <rongqing.li@windriver.com> |
| 3 | Date: Thu, 22 Aug 2013 08:56:09 +0800 |
| 4 | Subject: [PATCH] tftp-hpa: add error check for disk filled up |
| 5 | |
| 6 | Upstream-status: Pending [Sent to http://www.syslinux.org/archives/2013-August/020765.html] |
| 7 | |
| 8 | Add error check when the write-buffer is finally flushed to the file, |
| 9 | the caller can detect if the disk filled up (or had an i/o error) and |
| 10 | return a NOSAPCE nak to the other side. |
| 11 | |
| 12 | Signed-off-by: Ming Liu <ming.liu@windriver.com> |
| 13 | Signed-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 | |
| 19 | diff --git a/common/tftpsubs.c b/common/tftpsubs.c |
| 20 | index 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 |
| 49 | diff --git a/tftpd/tftpd.c b/tftpd/tftpd.c |
| 50 | index 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 | -- |
| 80 | 1.7.10.4 |
| 81 | |