Message ID | 20210524124237.9665-1-arjunak234@gmail.com |
---|---|
State | New |
Headers | show |
Series | Allow uci to work with symlinked config files | expand |
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@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
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);
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@gmail.com> --- file.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)