From: Michael Meffie Date: Thu, 24 Apr 2014 19:27:38 +0000 (-0400) Subject: libafs: check afs_InitReq return code X-Git-Tag: upstream/1.6.10_pre1^2~85 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=23cb83b45f70186fa97b9e7d2a1a8b44272579d8;p=packages%2Fo%2Fopenafs.git libafs: check afs_InitReq return code Do not ignore the return code from afs_InitReq everywhere it is called. If afs_InitReq fails, the vrequest could not be initialized for some reason. Reviewed-on: http://gerrit.openafs.org/11097 Tested-by: BuildBot Reviewed-by: Chas Williams - CONTRACTOR Reviewed-by: D Brashear (cherry picked from commit cdbf49f06baf33abd803b5d1ec245e58a94eec52) Change-Id: Ia8c0368f50f77b148a1e3f41b0538b0ec7c4123d Reviewed-on: http://gerrit.openafs.org/11163 Tested-by: BuildBot Reviewed-by: Chas Williams - CONTRACTOR Reviewed-by: Gergely Madarasz Reviewed-by: Benjamin Kaduk Reviewed-by: Andrew Deason Reviewed-by: Stephan Wiesand --- diff --git a/src/afs/IRIX/osi_vnodeops.c b/src/afs/IRIX/osi_vnodeops.c index 70dac93f2..6808d3a35 100644 --- a/src/afs/IRIX/osi_vnodeops.c +++ b/src/afs/IRIX/osi_vnodeops.c @@ -384,7 +384,10 @@ afsrwvp(struct vcache *avc, struct uio *uio, enum uio_rw rw, ICL_TYPE_INT32, ioflag, ICL_TYPE_INT32, rw, ICL_TYPE_INT32, 0); /* get a validated vcache entry */ - afs_InitReq(&treq, cr); + error = afs_InitReq(&treq, cr); + if (error) + return afs_CheckCode(error, NULL, 63); + error = afs_VerifyVCache(avc, &treq); if (error) return afs_CheckCode(error, &treq, 51); @@ -953,8 +956,11 @@ OSI_VC_DECL(avc); /* * mimic afs_close */ - afs_InitReq(&treq, acred); - if (afs_BBusy()) { + code = afs_InitReq(&treq, acred); + if (code) { + code = afs_CheckCode(code, NULL, 64); + AFS_RWUNLOCK(vp, VRWLOCK_WRITE); + } else if (afs_BBusy()) { /* do it yourself if daemons are all busy */ ObtainWriteLock(&avc->lock, 239); code = afs_StoreOnLastReference(avc, &treq); @@ -1027,7 +1033,10 @@ OSI_VC_DECL(avc); int error; /* get a validated vcache entry */ - afs_InitReq(&treq, cr); + error = afs_InitReq(&treq, cr); + if (error) + return afs_CheckCode(error, NULL, 65); + error = afs_VerifyVCache(avc, &treq); if (error) return afs_CheckCode(error, &treq, 53); diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 03caf1c5e..86905c737 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -1144,6 +1144,9 @@ afs_linux_dentry_revalidate(struct dentry *dp, int flags) credp = crref(); code = afs_InitReq(&treq, credp); + if (code) { + goto bad_dentry; + } if ( (strcmp(dp->d_name.name, ".directory") == 0)) { tryEvalOnly = 1; diff --git a/src/afs/UKERNEL/afs_usrops.c b/src/afs/UKERNEL/afs_usrops.c index a9825e8ea..d07930200 100644 --- a/src/afs/UKERNEL/afs_usrops.c +++ b/src/afs/UKERNEL/afs_usrops.c @@ -2403,7 +2403,13 @@ uafs_pread_nocache_r(int fd, char *buf, int len, off_t offset) bparms = afs_osi_Alloc(sizeof(struct nocache_read_request)); bparms->areq = afs_osi_Alloc(sizeof(struct vrequest)); - afs_InitReq(bparms->areq, get_user_struct()->u_cred); + code = afs_InitReq(bparms->areq, get_user_struct()->u_cred); + if (code) { + afs_osi_Free(bparms->areq, sizeof(struct vrequest)); + afs_osi_Free(bparms, sizeof(struct nocache_read_request)); + errno = code; + return -1; + } bparms->auio = &uio; bparms->offset = offset; diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index e0a744d28..d3ff50906 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -1805,6 +1805,7 @@ DECL_PIOCTL(PSetTokens) int stLen, stLenOld; struct vrequest treq; afs_int32 flag, set_parent_pag = 0; + int code; AFS_STATCNT(PSetTokens); if (!afs_resourceinit_flag) { @@ -1880,7 +1881,10 @@ DECL_PIOCTL(PSetTokens) *acred = crref(); crfree(old_cred); #endif - afs_InitReq(&treq, *acred); + code = afs_InitReq(&treq, *acred); + if (code) { + return code; + } areq = &treq; } } diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 64d69a6b3..73cc13bfb 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -1016,7 +1016,11 @@ afs_FlushActiveVcaches(afs_int32 doflocks) ReleaseReadLock(&afs_xvcache); ObtainWriteLock(&tvc->lock, 51); do { - afs_InitReq(&treq, afs_osi_credp); + code = afs_InitReq(&treq, afs_osi_credp); + if (code) { + code = -1; + break; /* shutting down: do not try to extend the lock */ + } treq.flags |= O_NONBLOCK; tc = afs_Conn(&tvc->f.fid, &treq, SHARED_LOCK, &rxconn); @@ -1069,11 +1073,13 @@ afs_FlushActiveVcaches(afs_int32 doflocks) /* XXXX Find better place-holder for cred XXXX */ cred = (afs_ucred_t *)tvc->linkData; tvc->linkData = NULL; /* XXX */ - afs_InitReq(&ureq, cred); + code = afs_InitReq(&ureq, cred); afs_Trace2(afs_iclSetp, CM_TRACE_ACTCCORE, ICL_TYPE_POINTER, tvc, ICL_TYPE_INT32, tvc->execsOrWriters); - code = afs_StoreOnLastReference(tvc, &ureq); + if (!code) { /* avoid store when shutting down */ + code = afs_StoreOnLastReference(tvc, &ureq); + } ReleaseWriteLock(&tvc->lock); #ifdef AFS_BOZONLOCK_ENV afs_BozonUnlock(&tvc->pvnLock, tvc); diff --git a/src/afs/afs_volume.c b/src/afs/afs_volume.c index e3b31c7fe..54717e9e2 100644 --- a/src/afs/afs_volume.c +++ b/src/afs/afs_volume.c @@ -765,6 +765,11 @@ afs_NewVolumeByName(char *aname, afs_int32 acell, int agood, return NULL; } + code = afs_InitReq(&treq, afs_osi_credp); /* *must* be unauth for vldb */ + if (code) { + return NULL; + } + /* allow null request if we don't care about ENODEV/ETIMEDOUT distinction */ if (!areq) areq = &treq; @@ -776,7 +781,6 @@ afs_NewVolumeByName(char *aname, afs_int32 acell, int agood, tve = (struct vldbentry *)(tbuffer + 1024); ntve = (struct nvldbentry *)tve; utve = (struct uvldbentry *)tve; - afs_InitReq(&treq, afs_osi_credp); /* *must* be unauth for vldb */ do { tconn = afs_ConnByMHosts(tcell->cellHosts, tcell->vlport, tcell->cellNum,