svn commit: r339992 - head/stand/libsa

Toomas Soome tsoome at FreeBSD.org
Thu Nov 1 13:12:06 UTC 2018


Author: tsoome
Date: Thu Nov  1 13:12:05 2018
New Revision: 339992
URL: https://svnweb.freebsd.org/changeset/base/339992

Log:
  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.

Modified:
  head/stand/libsa/tftp.c

Modified: head/stand/libsa/tftp.c
==============================================================================
--- head/stand/libsa/tftp.c	Thu Nov  1 11:41:40 2018	(r339991)
+++ head/stand/libsa/tftp.c	Thu Nov  1 13:12:05 2018	(r339992)
@@ -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);
 }
 


More information about the svn-src-head mailing list