]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE149-linux-avoid-returning-invalid-pointers-on-error-20090402 openafs-stable-1_4_9
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Tue, 7 Apr 2009 13:26:41 +0000 (13:26 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 7 Apr 2009 13:26:41 +0000 (13:26 +0000)
LICENSE IPL10
FIXES 124580

avoid returning a positive error as it will look like a pointer.

(cherry picked from commit 160619505de3dbf70f0f0c4a813098113eb42129)

src/afs/LINUX/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_lookup.c

index 926fa5dc6aa1656ac02b04d2268dddd9c5ebf956..027256ca4e3897ddd2691b4c447c8a3c86ad30be 100644 (file)
@@ -45,6 +45,10 @@ RCSID
 #define pageoff(pp) pp->offset
 #endif
 
+#ifndef MAX_ERRNO
+#define MAX_ERRNO 1000L
+#endif
+
 #if defined(AFS_LINUX26_ENV)
 #define UnlockPage(pp) unlock_page(pp)
 #endif
@@ -1086,8 +1090,10 @@ afs_linux_lookup(struct inode *dip, struct dentry *dp)
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,10)
     if (code == ENOENT)
        return ERR_PTR(0);
-    else
+    else if ((code >= 0) && (code <= MAX_ERRNO))
        return ERR_PTR(-code);
+    else 
+       return ERR_PTR(-EIO);
 #else
     if (code == ENOENT)
        code = 0;
@@ -1428,7 +1434,10 @@ afs_linux_follow_link(struct dentry *dp, struct dentry *basep,
 
     if (code < 0) {
        dput(basep);
-       res = ERR_PTR(code);
+       if (code < -MAX_ERRNO)
+           res = ERR_PTR(-EIO);
+       else
+           res = ERR_PTR(code);
     } else {
        name[code] = '\0';
        res = lookup_dentry(name, basep, follow);
index 52f9359df19ca85efef912baef484725db21e820..76aa6fa25e554f097c9ea495208b68398353d760 100644 (file)
@@ -1077,7 +1077,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        afs_PutVolume(volp, READ_LOCK);
 
     /* If we did the InlineBulk RPC pull out the return code */
-    if (inlinebulk) {
+    if (inlinebulk && code == 0) {
        if ((&statsp[0])->errorCode) {
            afs_Analyze(tcp, (&statsp[0])->errorCode, &adp->fid, areqp,
                        AFS_STATS_FS_RPCIDX_BULKSTATUS, SHARED_LOCK, NULL);