]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
libafs: check afs_InitReq return code
authorMichael Meffie <mmeffie@sinenomine.net>
Thu, 24 Apr 2014 19:27:38 +0000 (15:27 -0400)
committerStephan Wiesand <stephan.wiesand@desy.de>
Wed, 23 Jul 2014 13:28:28 +0000 (09:28 -0400)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Reviewed-by: D Brashear <shadow@your-file-system.com>
(cherry picked from commit cdbf49f06baf33abd803b5d1ec245e58a94eec52)

Change-Id: Ia8c0368f50f77b148a1e3f41b0538b0ec7c4123d
Reviewed-on: http://gerrit.openafs.org/11163
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Reviewed-by: Gergely Madarasz <madaraszg@gmail.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
src/afs/IRIX/osi_vnodeops.c
src/afs/LINUX/osi_vnodeops.c
src/afs/UKERNEL/afs_usrops.c
src/afs/afs_pioctl.c
src/afs/afs_vcache.c
src/afs/afs_volume.c

index 70dac93f20d2892fad8e8a8ec2e17b67e67190c7..6808d3a350fa51632f5251f003d10c6baee54454 100644 (file)
@@ -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);
index 03caf1c5e4b61854aa7119bd0be3527f97868b1e..86905c737901761b1ae94b9931e7e81fe29f5c22 100644 (file)
@@ -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;
index a9825e8ea4d299e1b6c1f9d0fc94615f908a6e20..d0793020060d93e91c306a33e29c3a3851838ea1 100644 (file)
@@ -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;
index e0a744d2842857f23843d547c9620b5fcb107300..d3ff50906c76a0f6b199900d64c51c7f7cb3e04e 100644 (file)
@@ -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;
        }
     }
index 64d69a6b37f5a5e1e424c110e97d094731eb4518..73cc13bfbe2a24854f428862bedb12ce5b4194cb 100644 (file)
@@ -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);
index e3b31c7fee467e931b2fd4bcd22a86b4b415ccee..54717e9e2ddaa1c642856f906d7073a17367c3b6 100644 (file)
@@ -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,