libsa: tftp should not read past file end
When we have the file size via tsize option, use it to make sure we will not attempt to read past file end.
This commit is contained in:
parent
6999f6975c
commit
f442898fe7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=339992
@ -498,11 +498,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;
|
||||
|
||||
@ -550,6 +558,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 */
|
||||
@ -562,8 +571,8 @@ tftp_read(struct open_file *f, void *addr, size_t size,
|
||||
|
||||
}
|
||||
|
||||
if (resid)
|
||||
*resid = size;
|
||||
if (resid != NULL)
|
||||
*resid = res;
|
||||
return (rc);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user