aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libucl
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2021-10-17 12:47:06 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2021-10-17 12:47:26 +0100
commit8f9e6acda8c899ddef44bb5559a08b79287a5155 (patch)
treefe078dea9e39ab06cd29ec535469f5094c7fe5c7 /contrib/libucl
parent3fd74520f054e05a74f9b7d58b4c1b081e49fa96 (diff)
downloadrspamd-8f9e6acda8c899ddef44bb5559a08b79287a5155.tar.gz
rspamd-8f9e6acda8c899ddef44bb5559a08b79287a5155.zip
[Minor] Fix some issues in the contrib libraries
Found by: coverity scan
Diffstat (limited to 'contrib/libucl')
-rw-r--r--contrib/libucl/ucl_parser.c4
-rw-r--r--contrib/libucl/ucl_util.c38
2 files changed, 31 insertions, 11 deletions
diff --git a/contrib/libucl/ucl_parser.c b/contrib/libucl/ucl_parser.c
index 5b5681863..1d285f27d 100644
--- a/contrib/libucl/ucl_parser.c
+++ b/contrib/libucl/ucl_parser.c
@@ -685,6 +685,8 @@ ucl_parser_add_container (ucl_object_t *obj, struct ucl_parser *parser,
ucl_object_unref (obj);
}
+ UCL_FREE(sizeof (struct ucl_stack), st);
+
return NULL;
}
@@ -2888,7 +2890,9 @@ ucl_parser_add_chunk_full (struct ucl_parser *parser, const unsigned char *data,
if (!special_handler->handler (parser, data, len, &ndata, &nlen,
special_handler->user_data)) {
+ UCL_FREE(sizeof (struct ucl_chunk), chunk);
ucl_create_err (&parser->err, "call for external handler failed");
+
return false;
}
diff --git a/contrib/libucl/ucl_util.c b/contrib/libucl/ucl_util.c
index 830aaa14c..e97e3ab9b 100644
--- a/contrib/libucl/ucl_util.c
+++ b/contrib/libucl/ucl_util.c
@@ -887,44 +887,49 @@ ucl_fetch_file (const unsigned char *filename, unsigned char **buf, size_t *bufl
{
int fd;
struct stat st;
+ if ((fd = open (filename, O_RDONLY)) == -1) {
+ ucl_create_err (err, "cannot open file %s: %s",
+ filename, strerror (errno));
+ return false;
+ }
- if (stat (filename, &st) == -1) {
+ if (fstat (fd, &st) == -1) {
if (must_exist || errno == EPERM) {
ucl_create_err (err, "cannot stat file %s: %s",
filename, strerror (errno));
}
+ close (fd);
+
return false;
}
if (!S_ISREG (st.st_mode)) {
if (must_exist) {
ucl_create_err (err, "file %s is not a regular file", filename);
}
+ close (fd);
return false;
}
+
if (st.st_size == 0) {
/* Do not map empty files */
*buf = NULL;
*buflen = 0;
}
else {
- if ((fd = open (filename, O_RDONLY)) == -1) {
- ucl_create_err (err, "cannot open file %s: %s",
- filename, strerror (errno));
- return false;
- }
- if ((*buf = ucl_mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
- close (fd);
- ucl_create_err (err, "cannot mmap file %s: %s",
- filename, strerror (errno));
+ if ((*buf = ucl_mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
+ close(fd);
+ ucl_create_err(err, "cannot mmap file %s: %s",
+ filename, strerror(errno));
*buf = NULL;
return false;
}
*buflen = st.st_size;
- close (fd);
}
+ close (fd);
+
return true;
}
@@ -1136,6 +1141,10 @@ ucl_include_file_single (const unsigned char *data, size_t len,
/* We need to check signature first */
snprintf (filebuf, sizeof (filebuf), "%s.sig", realbuf);
if (!ucl_fetch_file (filebuf, &sigbuf, &siglen, &parser->err, true)) {
+ if (buf) {
+ ucl_munmap (buf, buflen);
+ }
+
return false;
}
if (!ucl_sig_check (buf, buflen, sigbuf, siglen, parser)) {
@@ -1145,8 +1154,13 @@ ucl_include_file_single (const unsigned char *data, size_t len,
if (sigbuf) {
ucl_munmap (sigbuf, siglen);
}
+ if (buf) {
+ ucl_munmap (buf, buflen);
+ }
+
return false;
}
+
if (sigbuf) {
ucl_munmap (sigbuf, siglen);
}
@@ -1255,6 +1269,8 @@ ucl_include_file_single (const unsigned char *data, size_t len,
ucl_munmap (buf, buflen);
}
+ ucl_object_unref (new_obj);
+
return false;
}
nest_obj->prev = nest_obj;