xfs
[Top] [All Lists]

[PATCH] xfs: Fix wrong error codes being returned

To: Dave Chinner <david@xxxxxxxxxxxxx>
Subject: [PATCH] xfs: Fix wrong error codes being returned
From: Tuomas Tynkkynen <tuomas.tynkkynen@xxxxxx>
Date: Mon, 21 Apr 2014 13:04:47 +0300
Cc: xfs@xxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, Tuomas Tynkkynen <tuomas.tynkkynen@xxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cs.helsinki.fi; h=from:to:cc:subject:date:message-id; s=dkim20130528; bh=+s0No1 DROi4d4Ue+iJKY6y6FLRH3K378sOJAptLtUz8=; b=b/Yx5hfeSaAJpfT85DGZN+ ak6akINKqzeczi3poY9isxPs1UILHQx3P0piHVGSlMOyxuzrS00BiLsjw4T1/sQm YRBHSBDTBiLz8CGVxYzQrhWwhLvn979zmgNom0kgQN49j1cuPy33YJmnqb+MbEiF OaI+ukVbO/5WibhbpXaGQ=
xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect
sign in some cases. While at it, make sure ENOMEM is returned instead of
E2BIG if kmalloc fails.

Signed-off-by: Tuomas Tynkkynen <tuomas.tynkkynen@xxxxxx>
---
Compile tested only. For the ERANGE case, I also wonder if it should
be assigning to ops[i].am_error instead of error, and/or have a break.

 fs/xfs/xfs_ioctl.c   |    5 +++--
 fs/xfs/xfs_ioctl32.c |    5 +++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 0b18776..2d8f4fd 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -543,10 +543,11 @@ xfs_attrmulti_by_handle(
 
        ops = memdup_user(am_hreq.ops, size);
        if (IS_ERR(ops)) {
-               error = PTR_ERR(ops);
+               error = -PTR_ERR(ops);
                goto out_dput;
        }
 
+       error = ENOMEM;
        attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL);
        if (!attr_name)
                goto out_kfree_ops;
@@ -556,7 +557,7 @@ xfs_attrmulti_by_handle(
                ops[i].am_error = strncpy_from_user((char *)attr_name,
                                ops[i].am_attrname, MAXNAMELEN);
                if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)
-                       error = -ERANGE;
+                       error = ERANGE;
                if (ops[i].am_error < 0)
                        break;
 
diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c
index a7992f8..944d5ba 100644
--- a/fs/xfs/xfs_ioctl32.c
+++ b/fs/xfs/xfs_ioctl32.c
@@ -424,10 +424,11 @@ xfs_compat_attrmulti_by_handle(
 
        ops = memdup_user(compat_ptr(am_hreq.ops), size);
        if (IS_ERR(ops)) {
-               error = PTR_ERR(ops);
+               error = -PTR_ERR(ops);
                goto out_dput;
        }
 
+       error = ENOMEM;
        attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL);
        if (!attr_name)
                goto out_kfree_ops;
@@ -438,7 +439,7 @@ xfs_compat_attrmulti_by_handle(
                                compat_ptr(ops[i].am_attrname),
                                MAXNAMELEN);
                if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)
-                       error = -ERANGE;
+                       error = ERANGE;
                if (ops[i].am_error < 0)
                        break;
 
-- 
1.7.9.5

<Prev in Thread] Current Thread [Next in Thread>