stash: do not pass strbuf by value

save_untracked_files() takes its 'files' parameter as struct strbuf
by value.  Passing a strbuf by value copies the struct but shares
the underlying buffer between caller and callee, risking a dangling
pointer and double-free if the callee reallocates.

The function needs both the buffer and its length for
pipe_command(), so a plain const char * is not sufficient here.
Switch the parameter to struct strbuf * and update the caller to
pass a pointer.

Signed-off-by: Deveshi Dwivedi <deveshigurgaon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Deveshi Dwivedi 2026-03-15 09:44:44 +00:00 committed by Junio C Hamano
parent 65fec23b57
commit 8f8e1b0807
1 changed files with 3 additions and 3 deletions

View File

@ -1232,7 +1232,7 @@ static int check_changes(const struct pathspec *ps, int include_untracked,
}

static int save_untracked_files(struct stash_info *info, struct strbuf *msg,
struct strbuf files)
struct strbuf *files)
{
int ret = 0;
struct strbuf untracked_msg = STRBUF_INIT;
@ -1246,7 +1246,7 @@ static int save_untracked_files(struct stash_info *info, struct strbuf *msg,
stash_index_path.buf);

strbuf_addf(&untracked_msg, "untracked files on %s\n", msg->buf);
if (pipe_command(&cp_upd_index, files.buf, files.len, NULL, 0,
if (pipe_command(&cp_upd_index, files->buf, files->len, NULL, 0,
NULL, 0)) {
ret = -1;
goto done;
@ -1499,7 +1499,7 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b
parents = NULL;

if (include_untracked) {
if (save_untracked_files(info, &msg, untracked_files)) {
if (save_untracked_files(info, &msg, &untracked_files)) {
if (!quiet)
fprintf_ln(stderr, _("Cannot save "
"the untracked files"));