diff options
Diffstat (limited to 'ubifs-utils')
-rw-r--r-- | ubifs-utils/mkfs.ubifs/devtable.c | 8 | ||||
-rw-r--r-- | ubifs-utils/mkfs.ubifs/mkfs.ubifs.c | 13 |
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); |