From: Mark Vitale Date: Thu, 26 May 2016 20:53:47 +0000 (-0400) Subject: SOLARIS: support mmap() over 4GiB X-Git-Tag: upstream/1.6.18.3^2~4 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=60e113d66d5c8d7b6b53055d541996550e3d29d4;p=packages%2Fo%2Fopenafs.git SOLARIS: support mmap() over 4GiB When mmap() is issued for exactly 4GiB of a large AFS-resident file, mmap() fails with ENOMEM. This is because the AFS code is handling the requested length as u_int instead of size_t, resulting in a 0 being passed back to the caller. When mmap() is issued for non-multiples of 4GiB, the subsequent mapping will not contain all the requested pages, and for the same reason - the mapped size has been truncated to 32 bits. This results in SIGSEGV when accessing the non-mapped page(s). Fix the signature of afs_map() to specify the correct type for the length. Thanks to Robert Milkowski for the report and diagnosis. Reviewed-on: https://gerrit.openafs.org/12291 Tested-by: BuildBot Tested-by: Mark Vitale Reviewed-by: Benjamin Kaduk (cherry picked from commit 75325fc9ab1cec4a338e1aaf1b32de1922492b12) Change-Id: I8677aebf3afa6a6c0596f7d9afc06fe36d728fd3 Reviewed-on: https://gerrit.openafs.org/12349 Reviewed-by: Mark Vitale Tested-by: BuildBot Reviewed-by: Stephan Wiesand --- diff --git a/src/afs/SOLARIS/osi_vnodeops.c b/src/afs/SOLARIS/osi_vnodeops.c index b31f1a08b..a0c40a6fd 100644 --- a/src/afs/SOLARIS/osi_vnodeops.c +++ b/src/afs/SOLARIS/osi_vnodeops.c @@ -1040,7 +1040,7 @@ afs_nfsrdwr(struct vcache *avc, struct uio *auio, enum uio_rw arw, } int -afs_map(struct vnode *vp, offset_t off, struct as *as, caddr_t *addr, u_int len, u_char prot, u_char maxprot, u_int flags, afs_ucred_t *cred) +afs_map(struct vnode *vp, offset_t off, struct as *as, caddr_t *addr, size_t len, u_char prot, u_char maxprot, u_int flags, afs_ucred_t *cred) { struct segvn_crargs crargs; afs_int32 code;