summaryrefslogtreecommitdiff
path: root/ubifs-utils/mkfs.ubifs
diff options
context:
space:
mode:
Diffstat (limited to 'ubifs-utils/mkfs.ubifs')
-rw-r--r--ubifs-utils/mkfs.ubifs/devtable.c8
-rw-r--r--ubifs-utils/mkfs.ubifs/mkfs.ubifs.c13
2 files changed, 17 insertions, 4 deletions
diff --git a/ubifs-utils/mkfs.ubifs/devtable.c b/ubifs-utils/mkfs.ubifs/devtable.c
index 3b46abc..10faaca 100644
--- a/ubifs-utils/mkfs.ubifs/devtable.c
+++ b/ubifs-utils/mkfs.ubifs/devtable.c
@@ -146,16 +146,16 @@ static int interpret_table_entry(const char *line)
increment, count);
len = strnlen(buf, 1024);
+ if (len == 0)
+ return err_msg("empty path");
if (len == 1024)
return err_msg("too long path");
- if (!strcmp(buf, "/"))
+ if (buf[0] != '/')
return err_msg("device table entries require absolute paths");
- if (buf[1] == '\0')
- return err_msg("root directory cannot be created");
if (strstr(buf, "//"))
return err_msg("'//' cannot be used in the path");
- if (buf[len - 1] == '/')
+ if (len > 1 && buf[len - 1] == '/')
return err_msg("do not put '/' at the end");
if (strstr(buf, "/./") || strstr(buf, "/../") ||
diff --git a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
index c916f48..2e18fdc 100644
--- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
+++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
@@ -1825,6 +1825,8 @@ static int write_data(void)
{
int err;
mode_t mode = S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
+ struct path_htbl_element *ph_elt;
+ struct name_htbl_element *nh_elt;
if (root) {
err = stat(root, &root_st);
@@ -1839,6 +1841,17 @@ static int write_data(void)
root_st.st_mode = mode;
}
+ /*
+ * Check for root entry and update permissions if it exists. This will
+ * also remove the entry from the device table list.
+ */
+ ph_elt = devtbl_find_path("/");
+ if (ph_elt) {
+ nh_elt = devtbl_find_name(ph_elt, "");
+ if (nh_elt && override_attributes(&root_st, ph_elt, nh_elt))
+ return -1;
+ }
+
head_flags = 0;
err = create_inum_attr(UBIFS_ROOT_INO, root);