libafs: check afs_InitReq return code
authorMichael Meffie <mmeffie@sinenomine.net>
Thu, 24 Apr 2014 19:27:38 +0000 (15:27 -0400)
committerD Brashear <shadow@your-file-system.com>
Wed, 21 May 2014 11:07:35 +0000 (07:07 -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.

Change-Id: Ibae9f93c1e20a9fcae812f047da14106e6717454
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>

src/afs/IRIX/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 c55474a..4d8aa62 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 e0ad0bb..8bd8433 100644 (file)
@@ -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;
index 7f0329a..4be6038 100644 (file)
@@ -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;
        }
     }
index 75b4b66..281b79d 100644 (file)
@@ -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);
index 827ff12..a08ae51 100644 (file)
@@ -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,