[PATCH] mkfs.ubifs: Allow root entry in device table

David Engraf david.engraf at sysgo.com
Tue Jun 6 06:46:01 PDT 2017


Am 06.06.2017 um 15:31 schrieb David Engraf:
> When using a local root folder the permissions, user and group settings
> are taken from the local folder. These permissions might be incorrect if
> the folder has been created for the local user. Creating an UBIFS image
> on my local system resulted in the following output on the target:
> 
> drwx------   17 1000     1000   1264 Jan  1 00:00 .
> drwx------   17 1000     1000   1264 Jan  1 00:00 ..
> drwxr-xr-x    2 root     root   9104 May 30  2017 bin
> drwxr-xr-x    7 root     root   2760 Jan  1 00:00 dev
> ...
> 
> mkfs.ubifs aborts with an error message when the device table contains
> a root entry. This patch allows setting the root folder permissions,
> user and group to overwrite local configurations.

Signed-off-by: David Engraf <david.engraf at sysgo.com>

> ---
>   ubifs-utils/mkfs.ubifs/devtable.c   |  8 ++++----
>   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 a60052d..52ed511 100644
> --- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
> +++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c
> @@ -1823,6 +1823,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);
> @@ -1835,6 +1837,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);
> 




More information about the linux-mtd mailing list