]> err.no Git - linux-2.6/commitdiff
[PATCH] fix osf_getdirents()
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 12 Aug 2008 03:51:22 +0000 (23:51 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 25 Aug 2008 05:18:06 +0000 (01:18 -0400)
Return value of filldir callback is just "should we stop here"; it's
not a usable channel for passing error values (i.e. ->readdir() will
forget anything except "is it non-zero").

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/kernel/osf_sys.c

index 6e943135f0e041346e63348a18fb33239113b9c1..8509dad312044ede7039ef35846b24ffe49a6582 100644 (file)
@@ -121,24 +121,29 @@ osf_filldir(void *__buf, const char *name, int namlen, loff_t offset,
        if (reclen > buf->count)
                return -EINVAL;
        d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
+       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) {
+               buf->error = -EOVERFLOW;
                return -EOVERFLOW;
+       }
        if (buf->basep) {
                if (put_user(offset, buf->basep))
-                       return -EFAULT;
+                       goto Efault;
                buf->basep = NULL;
        }
        dirent = buf->dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(namlen, &dirent->d_namlen);
-       put_user(reclen, &dirent->d_reclen);
-       if (copy_to_user(dirent->d_name, name, namlen) ||
+       if (put_user(d_ino, &dirent->d_ino) ||
+           put_user(namlen, &dirent->d_namlen) ||
+           put_user(reclen, &dirent->d_reclen) ||
+           copy_to_user(dirent->d_name, name, namlen) ||
            put_user(0, dirent->d_name + namlen))
-               return -EFAULT;
+               goto Efault;
        dirent = (void __user *)dirent + reclen;
        buf->dirent = dirent;
        buf->count -= reclen;
        return 0;
+Efault:
+       buf->error = -EFAULT;
+       return -EFAULT;
 }
 
 asmlinkage int