From: Oleg Drokin <gr...@linuxhacker.ru>

strncpy_from_user could return negative values on error,
so need to take those into account.
Since ll_getname is used to get a single component name from userspace
to transfer to server as-is, there's no need to allocate 4k buffer
as done by __getname. Allocate NAME_MAX+1 buffer instead to ensure
we have enough for a null terminated max valid length buffer.

This was discovered by Al Viro in https://lkml.org/lkml/2015/4/11/243

Signed-off-by: Oleg Drokin <gr...@linuxhacker.ru>
---
 drivers/staging/lustre/lustre/llite/dir.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/lustre/lustre/llite/dir.c 
b/drivers/staging/lustre/lustre/llite/dir.c
index 87a042c..e0b9043 100644
--- a/drivers/staging/lustre/lustre/llite/dir.c
+++ b/drivers/staging/lustre/lustre/llite/dir.c
@@ -1213,29 +1213,31 @@ out:
        return rc;
 }
 
-static char *
-ll_getname(const char __user *filename)
+/* This function tries to get a single name component,
+ * to send to the server. No actual path traversal involved,
+ * so we limit to NAME_MAX */
+static char *ll_getname(const char __user *filename)
 {
        int ret = 0, len;
-       char *tmp = __getname();
+       char *tmp = kzalloc(NAME_MAX + 1, GFP_KERNEL);
 
        if (!tmp)
                return ERR_PTR(-ENOMEM);
 
-       len = strncpy_from_user(tmp, filename, PATH_MAX);
-       if (len == 0)
+       len = strncpy_from_user(tmp, filename, NAME_MAX);
+       if (len < 0)
+               ret = len;
+       else if (len == 0)
                ret = -ENOENT;
-       else if (len > PATH_MAX)
-               ret = -ENAMETOOLONG;
 
        if (ret) {
-               __putname(tmp);
+               kfree(tmp);
                tmp =  ERR_PTR(ret);
        }
        return tmp;
 }
 
-#define ll_putname(filename) __putname(filename)
+#define ll_putname(filename) kfree(filename)
 
 static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long 
arg)
 {
-- 
2.1.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to