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); | 
