summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/hostfs/hostfs_kern.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index 1efbcfa1f1f8..1fb8eacb9817 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c
@@ -93,17 +93,32 @@ __uml_setup("hostfs=", hostfs_args,
static char *__dentry_name(struct dentry *dentry, char *name)
{
char *p = dentry_path_raw(dentry, name, PATH_MAX);
- struct hostfs_fs_info *fsi = dentry->d_sb->s_fs_info;
- char *root = fsi->host_root_path;
- size_t len = strlen(root);
+ char *root;
+ size_t len;
+ struct hostfs_fs_info *fsi;
+
+ fsi = dentry->d_sb->s_fs_info;
+ root = fsi->host_root_path;
+ len = strlen(root);
+ if (IS_ERR(p)) {
+ __putname(name);
+ return NULL;
+ }
+
+ /*
+ * This function relies on the fact that dentry_path_raw() will place
+ * the path name at the end of the provided buffer.
+ */
+ BUG_ON(p + strlen(p) + 1 != name + PATH_MAX);
- if (IS_ERR(p) || len > p - name) {
+ strscpy(name, root, PATH_MAX);
+ if (len > p - name) {
__putname(name);
return NULL;
}
- memcpy(name, root, len);
- memmove(name + len, p, name + PATH_MAX - p);
+ if (p > name + len)
+ strcpy(name + len, p);
return name;
}