summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2018-09-04 15:27:45 +0300
committerRobert Mustacchi <rm@joyent.com>2018-09-21 18:44:40 +0000
commit2017dcb08b21dd2f977954ddb50394ba3010137c (patch)
tree68538fc3ee1847c2d3e0c508fac2d2bb3800bc17
parent63e2133b60ad42fc1b90a89825378dc1cdc82f85 (diff)
downloadillumos-joyent-2017dcb08b21dd2f977954ddb50394ba3010137c.tar.gz
9789 loader: tftp should not read past file end
Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Andy Fiddaman <omnios@citrus-it.co.uk> Reviewed by: Igor Kozhukhov <igor@dilos.org> Approved by: Robert Mustacchi <rm@joyent.com>
-rw-r--r--usr/src/boot/lib/libstand/tftp.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/usr/src/boot/lib/libstand/tftp.c b/usr/src/boot/lib/libstand/tftp.c
index ad3e89d448..46ce5f16b2 100644
--- a/usr/src/boot/lib/libstand/tftp.c
+++ b/usr/src/boot/lib/libstand/tftp.c
@@ -487,11 +487,19 @@ tftp_read(struct open_file *f, void *addr, size_t size,
size_t *resid /* out */)
{
struct tftp_handle *tftpfile;
+ size_t res;
int rc;
rc = 0;
+ res = size;
tftpfile = (struct tftp_handle *) f->f_fsdata;
+ /* Make sure we will not read past file end */
+ if (tftpfile->tftp_tsize > 0 &&
+ tftpfile->off + size > tftpfile->tftp_tsize) {
+ size = tftpfile->tftp_tsize - tftpfile->off;
+ }
+
while (size > 0) {
int needblock, count;
@@ -539,6 +547,7 @@ tftp_read(struct open_file *f, void *addr, size_t size,
addr = (char *)addr + count;
tftpfile->off += count;
size -= count;
+ res -= count;
if ((tftpfile->islastblock) && (count == inbuffer))
break; /* EOF */
@@ -551,8 +560,8 @@ tftp_read(struct open_file *f, void *addr, size_t size,
}
- if (resid)
- *resid = size;
+ if (resid != NULL)
+ *resid = res;
return (rc);
}