From cdbf49f06baf33abd803b5d1ec245e58a94eec52 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Thu, 24 Apr 2014 15:27:38 -0400 Subject: [PATCH] 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. Change-Id: Ibae9f93c1e20a9fcae812f047da14106e6717454 Reviewed-on: http://gerrit.openafs.org/11097 Tested-by: BuildBot Reviewed-by: Chas Williams - CONTRACTOR Reviewed-by: D Brashear --- src/afs/IRIX/osi_vnodeops.c | 17 +++++++++++++---- src/afs/UKERNEL/afs_usrops.c | 8 +++++++- src/afs/afs_pioctl.c | 11 +++++++++-- src/afs/afs_vcache.c | 12 +++++++++--- src/afs/afs_volume.c | 6 +++++- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/afs/IRIX/osi_vnodeops.c b/src/afs/IRIX/osi_vnodeops.c index c55474a7f..4d8aa6206 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/UKERNEL/afs_usrops.c b/src/afs/UKERNEL/afs_usrops.c index e0ad0bb51..8bd8433b7 100644 --- a/src/afs/UKERNEL/afs_usrops.c +++ b/src/afs/UKERNEL/afs_usrops.c @@ -2420,7 +2420,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 7f0329adf..4be603833 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -1928,7 +1928,10 @@ DECL_PIOCTL(PSetTokens) if (set_parent_pag) { if (_settok_setParentPag(acred) == 0) { - afs_InitReq(&treq, *acred); + code = afs_InitReq(&treq, *acred); + if (code) { + return code; + } areq = &treq; } } @@ -5383,7 +5386,11 @@ DECL_PIOCTL(PSetTokens2) *acred = crref(); crfree(old_cred); #endif - afs_InitReq(&treq, *acred); + code = afs_InitReq(&treq, *acred); + if (code) { + xdr_free((xdrproc_t) xdr_ktc_setTokenData, &tokenSet); + return code; + } areq = &treq; } } diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 75b4b66f6..281b79d7f 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -1015,7 +1015,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); @@ -1068,11 +1072,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 827ff1259..a08ae513d 100644 --- a/src/afs/afs_volume.c +++ b/src/afs/afs_volume.c @@ -807,6 +807,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; @@ -818,7 +823,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, -- 2.39.5