From c77adc6e931ca6a669c6798b7839c6af18882f05 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 28 Jan 2008 03:14:00 +0100 Subject: [PATCH] add shared locking for uci_load --- file.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/file.c b/file.c index 601fef5..4a56b8a 100644 --- a/file.c +++ b/file.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -531,6 +532,7 @@ int uci_load(struct uci_context *ctx, const char *name, struct uci_package **pac char *filename; bool confpath; FILE *file; + int fd; UCI_HANDLE_ERR(ctx); UCI_ASSERT(ctx, name != NULL); @@ -554,14 +556,24 @@ int uci_load(struct uci_context *ctx, const char *name, struct uci_package **pac UCI_THROW(ctx, UCI_ERR_NOTFOUND); } - file = fopen(filename, "r"); + fd = open(filename, O_RDONLY); if (filename != name) free(filename); + flock(fd, LOCK_SH); + file = fdopen(fd, "r"); if (!file) UCI_THROW(ctx, UCI_ERR_IO); - return uci_import(ctx, file, name, package); + ctx->errno = 0; + UCI_TRAP_SAVE(ctx, done); + uci_import(ctx, file, name, package); + UCI_TRAP_RESTORE(ctx); + +done: + flock(fd, LOCK_UN); + fclose(file); + return ctx->errno; } /* -- 2.11.0