thank for suggestions. here's v2 of patchset сб, 30 нояб. 2024 г. в 13:33, Willy Tarreau <w...@1wt.eu>:
> Hi Ilya, > > On Thu, Nov 28, 2024 at 01:07:40AM +0100, Ilya Shipitsin wrote: > > This defect was found by the coccinelle script "unchecked-strdup.cocci". > > It can be backported to all supported branches. > > --- > > src/namespace.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/src/namespace.c b/src/namespace.c > > index 9cc85a384..12885cd9f 100644 > > --- a/src/namespace.c > > +++ b/src/namespace.c > > @@ -92,6 +92,11 @@ struct netns_entry* netns_store_insert(const char > *ns_name) > > goto out; > > entry->fd = fd; > > entry->node.key = strdup(ns_name); > > + if (!entry->node.key) { > > + free(entry); > > + entry = NULL; > > Above, you can use ha_free(&entry), which performs both the free() and > sets the NULL. We try to use it more so that missing NULLs are easier to > spot (i.e. only free() is suspicious and needs longer investigation). > > Also, the previously created fd will leak, so a close(fd) is missing. > > Thanks! > Willy >
From 95bf14da420a7ec7c5097e28b564f6bf33bc3884 Mon Sep 17 00:00:00 2001 From: Ilia Shipitsin <chipits...@gmail.com> Date: Tue, 3 Dec 2024 17:10:21 +0100 Subject: [PATCH 1/3] BUG/MINOR: namespace: handle a possible strdup() failure This defect was found by the coccinelle script "unchecked-strdup.cocci". It can be backported to all supported branches. --- src/namespace.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/namespace.c b/src/namespace.c index 9cc85a384..38464bd4c 100644 --- a/src/namespace.c +++ b/src/namespace.c @@ -89,13 +89,23 @@ struct netns_entry* netns_store_insert(const char *ns_name) entry = calloc(1, sizeof(*entry)); if (!entry) - goto out; + goto err_close_fd; entry->fd = fd; entry->node.key = strdup(ns_name); + if (!entry->node.key) + goto err_free_entry; + entry->name_len = strlen(ns_name); ebis_insert(&namespace_tree_root, &entry->node); out: return entry; + +/* free all allocated stuff and return entry */ +err_free_entry: + ha_free(&entry); +err_close_fd: + close(fd); + return entry; } const struct netns_entry* netns_store_lookup(const char *ns_name, size_t ns_name_len) -- 2.46.0.windows.1
From 7a71bb88a8812ab8ffa9d522ac71cb79f04cc73b Mon Sep 17 00:00:00 2001 From: Ilia Shipitsin <chipits...@gmail.com> Date: Tue, 3 Dec 2024 19:54:46 +0100 Subject: [PATCH 3/3] BUG/MINOR: resolvers: handle a possible strdup() failure This defect was found by the coccinelle script "unchecked-strdup.cocci". It can be backported to all supported branches. --- src/resolvers.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/resolvers.c b/src/resolvers.c index f8f0c8edf..e1550cf12 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -3489,13 +3489,17 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha p = calloc(1, sizeof *p); if (!p) { err_code |= ERR_ALERT | ERR_FATAL; - goto out; + goto err_free_r; } init_new_proxy(p); resolvers_setup_proxy(p); p->parent = r; p->id = strdup(id); + if (!p->id) { + err_code |= ERR_ALERT | ERR_FATAL; + goto err_free_p; + } p->conf.args.file = p->conf.file = copy_file_name(file); p->conf.args.line = p->conf.line = linenum; r->px = p; @@ -3503,8 +3507,16 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha /* default values */ LIST_APPEND(&sec_resolvers, &r->list); r->conf.file = strdup(file); + if (!r->conf.file) { + err_code |= ERR_ALERT | ERR_FATAL; + goto err_free_p_id; + } r->conf.line = linenum; r->id = strdup(id); + if (!r->id) { + err_code |= ERR_ALERT | ERR_FATAL; + goto err_free_conf_file; + } r->query_ids = EB_ROOT; /* default maximum response size */ r->accepted_payload_size = 512; @@ -3528,11 +3540,17 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha *resolvers = r; out: - if (err_code & (ERR_FATAL|ERR_ABORT)) { - ha_free(&r); - ha_free(&p); - } + return err_code; +/* free all allocated stuff and return err_code */ +err_free_conf_file: + ha_free((void **)&r->conf.file); +err_free_p_id: + ha_free(&p->id); +err_free_p: + ha_free(&p); +err_free_r: + ha_free(&r); return err_code; } -- 2.46.0.windows.1
From 520dc81b6b42a7cfd008d668d4851c4858453e32 Mon Sep 17 00:00:00 2001 From: Ilia Shipitsin <chipits...@gmail.com> Date: Tue, 3 Dec 2024 17:13:05 +0100 Subject: [PATCH 2/3] BUG/MINOR: ssl_crtlist: handle a possible strdup() failure This defect was found by the coccinelle script "unchecked-strdup.cocci". It can be backported to all supported branches. --- src/ssl_crtlist.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ssl_crtlist.c b/src/ssl_crtlist.c index 71fa0a0b1..189d6e6ca 100644 --- a/src/ssl_crtlist.c +++ b/src/ssl_crtlist.c @@ -608,6 +608,11 @@ int crtlist_parse_file(char *file, struct bind_conf *bind_conf, struct proxy *cu found++; free(cc.crt); cc.crt = strdup(crt_path); + if (cc.crt == NULL) { + cfgerr |= ERR_ALERT | ERR_FATAL; + goto error; + } + ckchs = ckch_store_new_load_files_conf(crt_path, &cc, err); if (ckchs == NULL) { cfgerr |= ERR_ALERT | ERR_FATAL; -- 2.46.0.windows.1