Whamcloud - gitweb
LU-6667 llite: improve ll_getname
[fs/lustre-release.git] / lustre / llite / dir.c
index af02f98..51a42ab 100644 (file)
@@ -1059,29 +1059,33 @@ 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;
+
+       OBD_ALLOC(tmp, NAME_MAX + 1);
 
        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 + 1);
+       if (len < 0)
                ret = -ENOENT;
-       else if (len > PATH_MAX)
+       else if (len > NAME_MAX)
                ret = -ENAMETOOLONG;
 
        if (ret) {
-               __putname(tmp);
+               OBD_FREE(tmp, NAME_MAX + 1);
                tmp =  ERR_PTR(ret);
        }
        return tmp;
 }
 
-#define ll_putname(filename) __putname(filename)
+#define ll_putname(filename) OBD_FREE(filename, NAME_MAX + 1);
 
 static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {