On Sun, Jun 11, 2023 at 08:50:45PM +0200, Rubén Justo wrote: > diff --git a/config.c b/config.c > index 39a7d7422c..207e4394a3 100644 > --- a/config.c > +++ b/config.c > @@ -3833,6 +3833,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename > output[0] = '\t'; > } > } else { > + strbuf_release(©str); > copystr = store_create_section(new_name, &store); > } > } Wow, I did a double-take on this code. It is uncommon in our codebase to assign a struct by value in a function return like this, and doubly weird to assign a strbuf (since the whole point of strbuf is to use the opaque functions to make sure we aren't overwriting existing allocations or aliasing pointers). I think your fix here is the correct thing if we aren't going to clean up the code further. The more usual thing for our codebase would be refactoring like: diff --git a/config.c b/config.c index b79baf83e3..f5a7cced7c 100644 --- a/config.c +++ b/config.c @@ -3140,37 +3140,36 @@ static int write_error(const char *filename) return 4; } -static struct strbuf store_create_section(const char *key, - const struct config_store_data *store) +static void store_create_section(const char *key, + const struct config_store_data *store, + struct strbuf *sb) { const char *dot; size_t i; - struct strbuf sb = STRBUF_INIT; dot = memchr(key, '.', store->baselen); if (dot) { - strbuf_addf(&sb, "[%.*s \"", (int)(dot - key), key); + strbuf_addf(sb, "[%.*s \"", (int)(dot - key), key); for (i = dot - key + 1; i < store->baselen; i++) { if (key[i] == '"' || key[i] == '\\') - strbuf_addch(&sb, '\\'); - strbuf_addch(&sb, key[i]); + strbuf_addch(sb, '\\'); + strbuf_addch(sb, key[i]); } - strbuf_addstr(&sb, "\"]\n"); + strbuf_addstr(sb, "\"]\n"); } else { - strbuf_addch(&sb, '['); - strbuf_add(&sb, key, store->baselen); - strbuf_addstr(&sb, "]\n"); + strbuf_addch(sb, '['); + strbuf_add(sb, key, store->baselen); + strbuf_addstr(sb, "]\n"); } - - return sb; } static ssize_t write_section(int fd, const char *key, const struct config_store_data *store) { - struct strbuf sb = store_create_section(key, store); + struct strbuf sb = STRBUF_INIT; ssize_t ret; + store_create_section(key, store, &sb); ret = write_in_full(fd, sb.buf, sb.len); strbuf_release(&sb); @@ -3833,7 +3832,9 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename output[0] = '\t'; } } else { - copystr = store_create_section(new_name, &store); + strbuf_reset(©str); + store_create_section(new_name, &store, + ©str); } } remove = 0;