⬢ DragonFlyBSD Kernel Audit
DF-3211 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/nfs/nfs_mountrpc.c
+++ b/sys/vfs/nfs/nfs_mountrpc.c
@@ -227,6 +227,7 @@
 	int size = -1;
 	int attribs_present;
 	int status;
+	u_quad_t qsize;
 	union {
 		u_int32_t v2[17];
 		u_int32_t v3[21];
@@ -283,13 +284,17 @@
 			if (xdr_opaque_decode(&m, (u_char *) &fattribs.v3,
 					      sizeof(u_int32_t) * 21) != 0)
 				goto bad;
-			size = fxdr_unsigned(u_int32_t, fattribs.v3[6]);
+			qsize = fxdr_hyper(&fattribs.v3[5]);
+			if (qsize <= INT_MAX)
+				size = (int)qsize;
 		}
 	} else {
 		if (xdr_opaque_decode(&m,(u_char *) &fattribs.v2,
 				      sizeof(u_int32_t) * 17) != 0)
 			goto bad;
-		size = fxdr_unsigned(u_int32_t, fattribs.v2[5]);
+		qsize = fxdr_unsigned(u_int32_t, fattribs.v2[5]);
+		if (qsize <= INT_MAX)
+			size = (int)qsize;
 	}
 
 	if (nfsv3_diskless.swap_nblks == 0 && size != -1) {