|
@@ -212,32 +212,38 @@ getname(const char __user * filename)
|
|
return getname_flags(filename, 0, NULL);
|
|
return getname_flags(filename, 0, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * The "getname_kernel()" interface doesn't do pathnames longer
|
|
|
|
- * than EMBEDDED_NAME_MAX. Deal with it - you're a kernel user.
|
|
|
|
- */
|
|
|
|
struct filename *
|
|
struct filename *
|
|
getname_kernel(const char * filename)
|
|
getname_kernel(const char * filename)
|
|
{
|
|
{
|
|
struct filename *result;
|
|
struct filename *result;
|
|
- char *kname;
|
|
|
|
- int len;
|
|
|
|
-
|
|
|
|
- len = strlen(filename);
|
|
|
|
- if (len >= EMBEDDED_NAME_MAX)
|
|
|
|
- return ERR_PTR(-ENAMETOOLONG);
|
|
|
|
|
|
+ int len = strlen(filename) + 1;
|
|
|
|
|
|
result = __getname();
|
|
result = __getname();
|
|
if (unlikely(!result))
|
|
if (unlikely(!result))
|
|
return ERR_PTR(-ENOMEM);
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- kname = (char *)result + sizeof(*result);
|
|
|
|
- result->name = kname;
|
|
|
|
|
|
+ if (len <= EMBEDDED_NAME_MAX) {
|
|
|
|
+ result->name = (char *)(result) + sizeof(*result);
|
|
|
|
+ result->separate = false;
|
|
|
|
+ } else if (len <= PATH_MAX) {
|
|
|
|
+ struct filename *tmp;
|
|
|
|
+
|
|
|
|
+ tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
|
|
|
+ if (unlikely(!tmp)) {
|
|
|
|
+ __putname(result);
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+ }
|
|
|
|
+ tmp->name = (char *)result;
|
|
|
|
+ tmp->separate = true;
|
|
|
|
+ result = tmp;
|
|
|
|
+ } else {
|
|
|
|
+ __putname(result);
|
|
|
|
+ return ERR_PTR(-ENAMETOOLONG);
|
|
|
|
+ }
|
|
|
|
+ memcpy((char *)result->name, filename, len);
|
|
result->uptr = NULL;
|
|
result->uptr = NULL;
|
|
result->aname = NULL;
|
|
result->aname = NULL;
|
|
- result->separate = false;
|
|
|
|
|
|
|
|
- strlcpy(kname, filename, EMBEDDED_NAME_MAX);
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|