X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/13f56ec4e58bf8687e2a68032c093c0213dd519b..15129b1c8dbb3650c63b70adb1cad9af601c6c17:/bsd/nfs/nfs4_subs.c diff --git a/bsd/nfs/nfs4_subs.c b/bsd/nfs/nfs4_subs.c index 84d0aa9f7..50c657b94 100644 --- a/bsd/nfs/nfs4_subs.c +++ b/bsd/nfs/nfs4_subs.c @@ -439,7 +439,7 @@ out: * get the list of supported security flavors * * How we get them depends on what args we are given: - * + * * FH? Name? Action * ----- ----- ------ * YES YES Use the fh and name provided @@ -1666,6 +1666,8 @@ nfs4_parsefattr( nfsm_chain_get_32(error, nmc, ace_flags); nfsm_chain_get_32(error, nmc, ace_mask); nfsm_chain_get_32(error, nmc, len); + if (!error && len >= NFS_MAX_WHO) + error = EBADRPC; acl->acl_ace[i].ace_flags = nfs4_ace_nfstype_to_vfstype(ace_type, &error); acl->acl_ace[i].ace_flags |= nfs4_ace_nfsflags_to_vfsflags(ace_flags); acl->acl_ace[i].ace_rights = nfs4_ace_nfsmask_to_vfsrights(ace_mask); @@ -1675,16 +1677,12 @@ nfs4_parsefattr( s = sbuf; slen = sizeof(sbuf); } - if (len >= NFS_MAX_WHO) { - error = EBADRPC; - } else { - /* Let's add a bit more if we can to the allocation as to try and avoid future allocations */ - MALLOC(s, char*, (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO, M_TEMP, M_WAITOK); - if (s) - slen = (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO; - else - error = ENOMEM; - } + /* Let's add a bit more if we can to the allocation as to try and avoid future allocations */ + MALLOC(s, char*, (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO, M_TEMP, M_WAITOK); + if (s) + slen = (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO; + else + error = ENOMEM; } if (error2) nfsm_chain_adv(error, nmc, nfsm_rndup(len)); @@ -1999,22 +1997,20 @@ nfs4_parsefattr( } if (NFS_BITMAP_ISSET(bitmap, NFS_FATTR_OWNER)) { nfsm_chain_get_32(error, nmc, len); + if (!error && len >= NFS_MAX_WHO) + error = EBADRPC; if (!error && (len >= slen)) { if (s != sbuf) { FREE(s, M_TEMP); s = sbuf; slen = sizeof(sbuf); } - if (len >= NFS_MAX_WHO) { - error = EBADRPC; - } else { - /* Let's add a bit more if we can to the allocation as to try and avoid future allocations */ - MALLOC(s, char*, (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO, M_TEMP, M_WAITOK); - if (s) - slen = (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO; - else - error = ENOMEM; - } + /* Let's add a bit more if we can to the allocation as to try and avoid future allocations */ + MALLOC(s, char*, (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO, M_TEMP, M_WAITOK); + if (s) + slen = (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO; + else + error = ENOMEM; } nfsm_chain_get_opaque(error, nmc, len, s); if (!error) { @@ -2036,22 +2032,20 @@ nfs4_parsefattr( } if (NFS_BITMAP_ISSET(bitmap, NFS_FATTR_OWNER_GROUP)) { nfsm_chain_get_32(error, nmc, len); + if (!error && len >= NFS_MAX_WHO) + error = EBADRPC; if (!error && (len >= slen)) { if (s != sbuf) { FREE(s, M_TEMP); s = sbuf; slen = sizeof(sbuf); } - if (len >= NFS_MAX_WHO) { - error = EBADRPC; - } else { - /* Let's add a bit more if we can to the allocation as to try and avoid future allocations */ - MALLOC(s, char*, (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO, M_TEMP, M_WAITOK); - if (s) - slen = (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO; - else - error = ENOMEM; - } + /* Let's add a bit more if we can to the allocation as to try and avoid future allocations */ + MALLOC(s, char*, (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO, M_TEMP, M_WAITOK); + if (s) + slen = (len + 16 < NFS_MAX_WHO) ? len+16 : NFS_MAX_WHO; + else + error = ENOMEM; } nfsm_chain_get_opaque(error, nmc, len, s); if (!error) { @@ -2486,7 +2480,7 @@ restart: if (now.tv_sec == nmp->nm_recover_start) { printf("nfs recovery throttled for %s, 0x%x\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nmp->nm_stategenid); lck_mtx_unlock(&nmp->nm_lock); - tsleep(&lbolt, (PZERO-1), "nfsrecoverrestart", hz); + tsleep(nfs_recover, (PZERO-1), "nfsrecoverrestart", hz); goto restart; } nmp->nm_recover_start = now.tv_sec; @@ -2576,7 +2570,7 @@ restart: if ((error == ETIMEDOUT) || nfs_mount_state_error_should_restart(error)) { if (error == ETIMEDOUT) nfs_need_reconnect(nmp); - tsleep(&lbolt, (PZERO-1), "nfsrecoverrestart", 0); + tsleep(nfs_recover, (PZERO-1), "nfsrecoverrestart", hz); printf("nfs recovery restarting for %s, 0x%x, error %d\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nmp->nm_stategenid, error); goto restart; @@ -2632,7 +2626,7 @@ reclaim_locks: if ((error == ETIMEDOUT) || nfs_mount_state_error_should_restart(error)) { if (error == ETIMEDOUT) nfs_need_reconnect(nmp); - tsleep(&lbolt, (PZERO-1), "nfsrecoverrestart", 0); + tsleep(nfs_recover, (PZERO-1), "nfsrecoverrestart", hz); printf("nfs recovery restarting for %s, 0x%x, error %d\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nmp->nm_stategenid, error); goto restart; @@ -2657,7 +2651,7 @@ reclaim_locks: nfs4_delegation_return(nofp->nof_np, R_RECOVER, thd, noop->noo_cred); if (!(nmp->nm_sockflags & NMSOCK_READY)) { /* looks like we need a reconnect */ - tsleep(&lbolt, (PZERO-1), "nfsrecoverrestart", 0); + tsleep(nfs_recover, (PZERO-1), "nfsrecoverrestart", hz); printf("nfs recovery restarting for %s, 0x%x, error %d\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nmp->nm_stategenid, error); goto restart; @@ -2696,4 +2690,3 @@ recheckdeleg: vfs_statfs(nmp->nm_mountp)->f_mntfromname, nmp->nm_stategenid, error); } } -