[PATCH] Allow uci to work with symlinked config files

Arjun AK arjunak234 at gmail.com
Fri Jun 18 16:43:03 PDT 2021


On 24/05/21 6:12 pm, Arjun AK wrote:
> Instead of creating the temp file in "/etc/config" it should be created
> where the config file actually exists (if the file is symlinked, it
> might be in another mount point and "rename()" will fail)
> 
> Signed-off-by: Arjun AK <arjunak234 at gmail.com>
> ---
>   file.c | 14 ++++++++++++--
>   1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/file.c b/file.c
> index 93abfae..f7dfa2d 100644
> --- a/file.c
> +++ b/file.c
> @@ -29,6 +29,7 @@
>   #include <string.h>
>   #include <stdlib.h>
>   #include <errno.h>
> +#include <libgen.h>
>   
>   #include "uci.h"
>   #include "uci_internal.h"
> @@ -737,6 +738,7 @@ static void uci_file_commit(struct uci_context *ctx, struct uci_package **packag
>   	char *volatile name = NULL;
>   	char *volatile path = NULL;
>   	char *filename = NULL;
> +	char *conf_dir = NULL;
>   	struct stat statbuf;
>   	volatile bool do_rename = false;
>   	int fd, sz;
> @@ -748,9 +750,17 @@ static void uci_file_commit(struct uci_context *ctx, struct uci_package **packag
>   			UCI_THROW(ctx, UCI_ERR_INVAL);
>   	}
>   
> -	sz = snprintf(NULL, 0, "%s/.%s.uci-XXXXXX", ctx->confdir, p->e.name);
> +	path = realpath(p->path, NULL);
> +	if (path == NULL) {
> +		UCI_THROW(ctx, UCI_ERR_INVAL);
> +	}
> +	conf_dir = dirname(path);
> +
> +	sz = snprintf(NULL, 0, "%s/.%s.uci-XXXXXX", conf_dir, p->e.name);
>   	filename = alloca(sz + 1);
> -	snprintf(filename, sz + 1, "%s/.%s.uci-XXXXXX", ctx->confdir, p->e.name);
> +	snprintf(filename, sz + 1, "%s/.%s.uci-XXXXXX", conf_dir, p->e.name);
> +
> +	free(path);
>   
>   	/* open the config file for writing now, so that it is locked */
>   	f1 = uci_open_stream(ctx, p->path, NULL, SEEK_SET, true, true);
> 

Can someone please merge this in?

-
Arjun



More information about the openwrt-devel mailing list