summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}