DF-3211 / fix.diff
--- 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) { |