From patchwork Thu Oct 3 11:58:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derrick Stolee X-Patchwork-Id: 13820958 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 06A791B969 for ; Thu, 3 Oct 2024 11:58:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727956731; cv=none; b=PcyleYOkxF52EqPctaImeE4q4xSTZqt3Zyz8JVQc62T4APfdSb4FBBK5vhhMY7CkJ4rlNyIK9Exe7dadWd4L+7uzXsRlCeCRt5svnlqR6yF+Q1ykbiSqlSYSv5dhNYtHT/59uOmTXL+csnz+nX/OHYmuMI8ZdLgo9fm0LNb4uqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727956731; c=relaxed/simple; bh=cSSONYwffILE9Zwm9D7dllDMUlkcRZZR4sVbgHtEVwQ=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=PALlH3pEvcn7hltTTs0WXZBQsxKWMvOlqcsbTDFG9x0hX0PfkyudEceQGeCIGtwdl5Ak+z0ani6uvPKF0+hdHZgvkEls6I6/nK9dRNjdM4zhkkEuSSpB1e18D+NBeHLJW8S3qjVF+30Ldmzul6GzqxD1gcdbw7VTPFP0f6un6SM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=S9Gmq4MZ; arc=none smtp.client-ip=209.85.208.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="S9Gmq4MZ" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-5c8af23a4fcso1085122a12.0 for ; Thu, 03 Oct 2024 04:58:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727956728; x=1728561528; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=z+pJZ6fIL+kBWvYRwCGhv8uD94GYeNkvuaeGZxu4edg=; b=S9Gmq4MZjayxnmabffMzRja6J9DR03QNVVlA8UJ3rywlV9RiFHOI99IApWYV7o0xhx e0RX3ClxnJvm2JXNm9NoBKo9PGUw4rBKOM/79WB/mPaKRfKySHmwskVF2wRa4d4VuXBM KlfqwZ482qEtP6iW+BoPStGH3xMk88NwrPfK+gtU606MbRS8KauUuwsMjaavAkWf2yLA I9w+DQtR//yJnzQ2Nc7WTo+eGanilHU1p3K7r4p43z+c9yTKzBlnPmFopkTSOt8JeeQt 4IPlHYPrRmKnjHPuD2YBDzynv0TIUjoT6juRwPS7fX7ojy5AU2ReIQe4QMy8LkOl2sIa IpMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727956728; x=1728561528; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=z+pJZ6fIL+kBWvYRwCGhv8uD94GYeNkvuaeGZxu4edg=; b=dxamiufNuAA3K9Hp5dWQ+QGuaW3e1hIbew9JOEBjgay1JrkPDOMHA4a0MnwmdQaInI QTHQ7eLSxz/seGVXGF+w9kr70ZKUXmkKk9ruAQsM5zy/ceXXkOzMT8JHVChyXclNyeso JSqT1p4xRYOi5e60k2yQKB0I1tjS5/NuVXVBrStEd2lBz3ZmbyuxmGwULmW1NiFnnXrN 4JDVQpPvQw/s9y5ZZAYSr5PtRV8jYc+DjLaX8CQ7p3XrxwCMtGxUbJIxYs0qQg7pWYK1 bjKmXrvT6NP7hK8+dBK0sjcysc+JurrkQi/J4HtSngxh/ajpQYZGHrB/WHg/uKNFCAkk 1VUg== X-Gm-Message-State: AOJu0YyZtMlsc1HtSa9a/77+IzCJW5jF2MM5jvNQNQed+deoK40aiT0l HgGesWaYLU/wcSxRI/iBs7YwFu1xht8GH2fncEc4xxDPyYHxMtf82p5xMg== X-Google-Smtp-Source: AGHT+IGju7rO/prclquGNqzoIMjo9rMV1jcAWpCzV9mU99ckJl7Yy3ODFkbUuhPqqProgDw2lCHSvA== X-Received: by 2002:a05:6402:40d4:b0:5c8:8bde:a1d3 with SMTP id 4fb4d7f45d1cf-5c8b1b727bdmr4982317a12.22.1727956727913; Thu, 03 Oct 2024 04:58:47 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5c8ca4d6dcdsm629200a12.70.2024.10.03.04.58.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Oct 2024 04:58:46 -0700 (PDT) Message-Id: <05c21616c350b5141c17fde1aa5d3aea881c6031.1727956724.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 03 Oct 2024 11:58:42 +0000 Subject: [PATCH v2 1/3] line-log: protect inner strbuf from free Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: gitster@pobox.com, ps@pks.im, Jeff King , Derrick Stolee , Derrick Stolee From: Derrick Stolee From: Derrick Stolee The output_prefix() method in line-log.c may call a function pointer via the diff_options struct. This function pointer returns a strbuf struct and then its buffer is passed back. However, that implies that the consumer is responsible to free the string. This is especially true because the default behavior is to duplicate the empty string. The existing functions used in the output_prefix pointer include: 1. idiff_prefix_cb() in diff-lib.c. This returns the data pointer, so the value exists across multiple calls. 2. diff_output_prefix_callback() in graph.c. This uses a static strbuf struct, so it reuses buffers across calls. These should not be freed. 3. output_prefix_cb() in range-diff.c. This is similar to the diff-lib.c case. In each case, we should not be freeing this buffer. We can convert the output_prefix() function to return a const char pointer and stop freeing the result. This choice is essentially the opposite of what was done in 394affd46d (line-log: always allocate the output prefix, 2024-06-07). This was discovered via 'valgrind' while investigating a public report of a bug in 'git log --graph -L' [1]. [1] https://github.com/git-for-windows/git/issues/5185 This issue would have been caught by the new test, when Git is compiled with ASan to catch these double frees. Co-authored-by: Jeff King Signed-off-by: Jeff King Signed-off-by: Derrick Stolee --- line-log.c | 10 ++++------ t/t4211-line-log.sh | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/line-log.c b/line-log.c index 67c80b39a0d..29cf66bdd10 100644 --- a/line-log.c +++ b/line-log.c @@ -897,13 +897,13 @@ static void print_line(const char *prefix, char first, fputs("\\ No newline at end of file\n", file); } -static char *output_prefix(struct diff_options *opt) +static const char *output_prefix(struct diff_options *opt) { if (opt->output_prefix) { struct strbuf *sb = opt->output_prefix(opt, opt->output_prefix_data); return sb->buf; } else { - return xstrdup(""); + return ""; } } @@ -916,7 +916,7 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang struct diff_ranges *diff = &range->diff; struct diff_options *opt = &rev->diffopt; - char *prefix = output_prefix(opt); + const char *prefix = output_prefix(opt); const char *c_reset = diff_get_color(opt->use_color, DIFF_RESET); const char *c_frag = diff_get_color(opt->use_color, DIFF_FRAGINFO); const char *c_meta = diff_get_color(opt->use_color, DIFF_METAINFO); @@ -1003,7 +1003,6 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang out: free(p_ends); free(t_ends); - free(prefix); } /* @@ -1012,10 +1011,9 @@ out: */ static void dump_diff_hacky(struct rev_info *rev, struct line_log_data *range) { - char *prefix = output_prefix(&rev->diffopt); + const char *prefix = output_prefix(&rev->diffopt); fprintf(rev->diffopt.file, "%s\n", prefix); - free(prefix); while (range) { dump_diff_hacky_one(rev, range); diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh index 02d76dca284..950451cf6a6 100755 --- a/t/t4211-line-log.sh +++ b/t/t4211-line-log.sh @@ -337,4 +337,32 @@ test_expect_success 'zero-width regex .* matches any function name' ' test_cmp expect actual ' +test_expect_success 'show line-log with graph' ' + qz_to_tab_space >expect <<-EOF && + * $head_oid Modify func2() in file.c + |Z + | diff --git a/file.c b/file.c + | --- a/file.c + | +++ b/file.c + | @@ -6,4 +6,4 @@ + | int func2() + | { + | - return F2; + | + return F2 + 2; + | } + * $root_oid Add func1() and func2() in file.c + ZZ + diff --git a/file.c b/file.c + --- /dev/null + +++ b/file.c + @@ -0,0 +6,4 @@ + +int func2() + +{ + + return F2; + +} + EOF + git log --graph --oneline -L:func2:file.c >actual && + test_cmp expect actual +' + test_done From patchwork Thu Oct 3 11:58:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff King X-Patchwork-Id: 13820959 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7679015665E for ; Thu, 3 Oct 2024 11:58:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727956733; cv=none; b=kSIfzQNYx63p7SvsJwHOl7gvUlPQD0Vy60qM+fYHSrUrlWkGHvXwxLnBJ6hxwks3BhzeGZiqk62ppAUpiRbJDPM3sahXEsdKtHO8fY9HFWwVrDPdeWCKlnTPoWvelmt8aeZn7c8PanjbDPtAvP9dcFvKzyf+QV0RKZ/aZjdAhv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727956733; c=relaxed/simple; bh=4fF/iFrjxK/J3QpnRV1j6dp7MSqBm/+pP4GwPUP5FC4=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=VgNDy/mM951RHQiRbJdDgeyvVAYeeFgFiuySalt215+8eJsdJVnNGf2uVO+8FAvQSeGN/r7W2PLMlIpzw4IbYhzs6kxW0uMLkjfiN77FYLzKoXp/Ga/Ty1xwO/nib1zaJaBlBIZzxyJ0hnAVs0WWmTIC0M8Errj/jIu1AaH8pY4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=k5OBp3+V; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k5OBp3+V" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-a8d2b24b7a8so373278766b.1 for ; Thu, 03 Oct 2024 04:58:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727956729; x=1728561529; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=l0DF9CUo4h1Na73+EuFg/X6NAeFMdLBd7VLvH+ogCGI=; b=k5OBp3+VYT4Z6nxTuNr11jZhemDeJNVCxlkDPt2gof1FhGdI+fG9B3V+ioV6zIi0qN 7Gf59ZBKlg/tSXtHDVtAv6ywdP33v7b/l1jG9h0If4sg1/igQO2R3iTyenb+blD6SkAm aL05q+0xe8xFgDwWpuFUhECm4MKCSvNKD7DIW16Fajx/PPelSsiE+8lFAECQmhzhekTj b/fpQL17z9pi10U5brjWbdj8gdiyHvzUTnqvO0Kz+7hBNi6Vjeyh3h1VGD0zy4A56j+R jjR+83fPzcwaNsxTOX5V9iZw1lwvyv93JkpchJwyx0vlD7KCOJGm83Cj+34ZNt3iZB2o zBNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727956729; x=1728561529; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=l0DF9CUo4h1Na73+EuFg/X6NAeFMdLBd7VLvH+ogCGI=; b=LRGmKqBSIFddWAPZnZ0q13sH2jgIE0oCMyfrU6vGYjzMq0IpeWIP743XeFNFs5Dt/9 VnTcE+9Her8EeYGoJCmdpm1Ro/+Pw7SYlh+qQUKmqCtnwEM3MV5TUscaoIBfXhMx3AMG 4hkXdEJFlICi/wOWqf7m4toEo3tiXBdCPvNahzuaLQLrDIUL4oxgkHuWebjhCZkTKgrV KSgLQJDZGFFuAbm5B0PSw/WRYgGsOjgVlKqmxT2IoOKdqF7sUZ1p8AWTOC9z94dk+5u5 K0Lwu+InNCDjenJbggCwqm/hQzl3lRoIr8iQblamKzUMGOdx3mEZicBUHifn9BzRhr2G 2zxg== X-Gm-Message-State: AOJu0YxKIWBtQKFvZusQMVOSx9DX4K0/XRtNsaTWOrb03AE425MgVs8t h0vXvNM8Cf44D221YZfjCO7+HmEW4x6uhSeFyhUXTkhyTChy5gS7xaW1IQ== X-Google-Smtp-Source: AGHT+IG21Z3H+ER9I2bvOLV3k2G4pQPDJdGN/TIxdLjTjwqvGPGbVIQXHvMTE8pOw3S1hPtHT5ugHQ== X-Received: by 2002:a17:906:c107:b0:a72:7a71:7f4f with SMTP id a640c23a62f3a-a990a03b4b2mr339193766b.7.1727956729190; Thu, 03 Oct 2024 04:58:49 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a9910470767sm75901966b.153.2024.10.03.04.58.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Oct 2024 04:58:48 -0700 (PDT) Message-Id: <94d2c034b4a82ca1024b2a591aef990688f95862.1727956724.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 03 Oct 2024 11:58:43 +0000 Subject: [PATCH v2 2/3] line-log: remove output_prefix() Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: gitster@pobox.com, ps@pks.im, Jeff King , Derrick Stolee , Jeff King From: Jeff King From: Jeff King Now that output_prefix() returns a const char * type, it matches the behavior of diff_line_prefix() and no longer needs to exist on its own. Signed-off-by: Jeff King Signed-off-by: Derrick Stolee --- line-log.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/line-log.c b/line-log.c index 29cf66bdd10..63945c47299 100644 --- a/line-log.c +++ b/line-log.c @@ -897,16 +897,6 @@ static void print_line(const char *prefix, char first, fputs("\\ No newline at end of file\n", file); } -static const char *output_prefix(struct diff_options *opt) -{ - if (opt->output_prefix) { - struct strbuf *sb = opt->output_prefix(opt, opt->output_prefix_data); - return sb->buf; - } else { - return ""; - } -} - static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *range) { unsigned int i, j = 0; @@ -916,7 +906,7 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang struct diff_ranges *diff = &range->diff; struct diff_options *opt = &rev->diffopt; - const char *prefix = output_prefix(opt); + const char *prefix = diff_line_prefix(opt); const char *c_reset = diff_get_color(opt->use_color, DIFF_RESET); const char *c_frag = diff_get_color(opt->use_color, DIFF_FRAGINFO); const char *c_meta = diff_get_color(opt->use_color, DIFF_METAINFO); @@ -1011,7 +1001,7 @@ out: */ static void dump_diff_hacky(struct rev_info *rev, struct line_log_data *range) { - const char *prefix = output_prefix(&rev->diffopt); + const char *prefix = diff_line_prefix(&rev->diffopt); fprintf(rev->diffopt.file, "%s\n", prefix); From patchwork Thu Oct 3 11:58:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff King X-Patchwork-Id: 13820960 Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4BB4158DD2 for ; Thu, 3 Oct 2024 11:58:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727956734; cv=none; b=uEv8sn2VQQH/PV9stirztTA9tSIkjOf+QvRCZs8IuvzXpN+nzqLEmXdC4fDr6HnJM2K01e5AtX3cOp/aoZMsLMxyZRI8zfGoohU9/QH09BHB5C2wW7JDt1JHGmAF5zB/HHacM4ycrDLuwlnzecVYHZAgU6qchT9fqqz4il5IU5g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727956734; c=relaxed/simple; bh=YLlQlYGH+wueuNmC4ZzbFWGcsjYxAmmR78vEpicFtBM=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=Qf8Fr2H89NivhgeOz2vg+9rqEidoktOccyy26VBrhGR5VdeWXSUxvj1qCVlN4ai9EMZyEbyaQS7jDDVSP767PnZKYLA2csc5W/YRyscdkY9ZRU5SB9Ws6D8sDz7AA9ff5jLLCiC/69gmrBuHaUuunpZwpbXarPW8aMC83XOtP38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IvF2qpaP; arc=none smtp.client-ip=209.85.218.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IvF2qpaP" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-a86e9db75b9so133291766b.1 for ; Thu, 03 Oct 2024 04:58:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727956731; x=1728561531; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=vbWICdkDxaVwBcEOzsxxr6cI7xE82tedg+uvnQR2erw=; b=IvF2qpaPCFlHEHBkifrfKd1mmQhZzeUry1HpBDycKpTlyP/QrLNwewibIGNIGPlEx4 lDEEuv8hodI2Ojnx1ERe7IJ8oxPVTDUlfMbxa5gZmSjujHj917f/3/p9AMbw49NLA2YY 4al6dFx9FI/8usxFwDKGjytx8jybbtJit3ZKqPxsrZ+XqJMtKayKu0HWgnEbTv7n++mr Cfy7+NhsxHIqWjCzDzj3ATeFgEZFZPfeY8Yylb2AZx3PVPlBUJdJf+NN2C+EZKOWMQg5 vlk1gzS5oMyXU+3ia6zXqdEmcSRhv6mK0rvyKW33wIu1awedhHlFx3aR1NABWFF7xsNq TRoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727956731; x=1728561531; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vbWICdkDxaVwBcEOzsxxr6cI7xE82tedg+uvnQR2erw=; b=eQgeEvmNx/PUXvQGsZveqta6CmEIaK7Iybq4J136KC3Bt7EHfRzYEWNCiDaq/ecydI JT+nrPVgnYRxmD54kwhnulsD0TNmUIXvy4dQwkFSIhzUxasNSlTAKupS48NCThs3q/zz j6hLEcEaV1//DkNBvAxMmbcPrqcFb5YnMr2YdHa1h8WHget+Y3BqVQ0WETul/sLD7ZaE y8lTCaQ1cHdqHyPqfrhFAyNqJ511FXq0MxXNIyshBy4AVfWz/smgSHpTiSOeImpufezy viOIvgd06bPkyjpqc/yYWzv73gfSjL3+uEmL9imtvF+BUoLfYoeNquZjtHnlp36EnkcP kb+w== X-Gm-Message-State: AOJu0Yz57jeMvo3XKOTTZDYCeTqnn0Pa9vMfB2aUPIBCq91sZj8ZxvpC gJOekJyDJzisECLefEQUtN6ZiwIeqFQ4nQ0iSpiSYlkpo9UtwBJUhBZpXg== X-Google-Smtp-Source: AGHT+IEKS8tJC8JkQjyljI+b303JyelPrWarql1rC2fs/VmCHkNvs5v87AsB/WHbKt5tqd4EZ75qFQ== X-Received: by 2002:a17:907:7fa7:b0:a8a:9195:922d with SMTP id a640c23a62f3a-a98f7fe6002mr710450766b.0.1727956730648; Thu, 03 Oct 2024 04:58:50 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a99104c6785sm75257566b.204.2024.10.03.04.58.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Oct 2024 04:58:49 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Thu, 03 Oct 2024 11:58:44 +0000 Subject: [PATCH v2 3/3] diff: modify output_prefix function pointer Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: gitster@pobox.com, ps@pks.im, Jeff King , Derrick Stolee , Jeff King From: Jeff King From: Jeff King The uses of the output_prefix function pointer in the diff_options struct is currently difficult to work with by returning a pointer to a strbuf. There is only one use that cares about the length of the string, which appears to be the only justification of the return type. We already noticed confusing memory issues around this return type, so use a const char * return type to make it clear that the caller does not own this string buffer. Signed-off-by: Jeff King Signed-off-by: Derrick Stolee --- diff-lib.c | 4 ++-- diff.c | 8 +++----- diff.h | 2 +- graph.c | 4 ++-- log-tree.c | 4 ++-- range-diff.c | 4 ++-- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/diff-lib.c b/diff-lib.c index a680768ee75..6b14b959629 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -701,7 +701,7 @@ int index_differs_from(struct repository *r, return (has_changes != 0); } -static struct strbuf *idiff_prefix_cb(struct diff_options *opt UNUSED, void *data) +static const char *idiff_prefix_cb(struct diff_options *opt UNUSED, void *data) { return data; } @@ -716,7 +716,7 @@ void show_interdiff(const struct object_id *oid1, const struct object_id *oid2, opts.output_format = DIFF_FORMAT_PATCH; opts.output_prefix = idiff_prefix_cb; strbuf_addchars(&prefix, ' ', indent); - opts.output_prefix_data = &prefix; + opts.output_prefix_data = prefix.buf; diff_setup_done(&opts); diff_tree_oid(oid1, oid2, "", &opts); diff --git a/diff.c b/diff.c index 84a6bb08681..82a9545afbd 100644 --- a/diff.c +++ b/diff.c @@ -2315,12 +2315,10 @@ const char *diff_get_color(int diff_use_color, enum color_diff ix) const char *diff_line_prefix(struct diff_options *opt) { - struct strbuf *msgbuf; - if (!opt->output_prefix) - return ""; + if (opt->output_prefix) + return opt->output_prefix(opt, opt->output_prefix_data); - msgbuf = opt->output_prefix(opt, opt->output_prefix_data); - return msgbuf->buf; + return ""; } static unsigned long sane_truncate_line(char *line, unsigned long len) diff --git a/diff.h b/diff.h index fb40c6e6d60..978450e20ac 100644 --- a/diff.h +++ b/diff.h @@ -94,7 +94,7 @@ typedef void (*add_remove_fn_t)(struct diff_options *options, typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, struct diff_options *options, void *data); -typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data); +typedef const char *(*diff_prefix_fn_t)(struct diff_options *opt, void *data); #define DIFF_FORMAT_RAW 0x0001 #define DIFF_FORMAT_DIFFSTAT 0x0002 diff --git a/graph.c b/graph.c index 091c14cf4fb..ebb7d1e66f4 100644 --- a/graph.c +++ b/graph.c @@ -314,7 +314,7 @@ struct git_graph { unsigned short default_column_color; }; -static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void *data) +static const char *diff_output_prefix_callback(struct diff_options *opt, void *data) { struct git_graph *graph = data; static struct strbuf msgbuf = STRBUF_INIT; @@ -327,7 +327,7 @@ static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void opt->line_prefix_length); if (graph) graph_padding_line(graph, &msgbuf); - return &msgbuf; + return msgbuf.buf; } static const struct diff_options *default_diffopt; diff --git a/log-tree.c b/log-tree.c index 3758e0d3b8e..3af34b91a59 100644 --- a/log-tree.c +++ b/log-tree.c @@ -923,10 +923,10 @@ int log_tree_diff_flush(struct rev_info *opt) */ int pch = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH; if (opt->diffopt.output_prefix) { - struct strbuf *msg = NULL; + const char *msg; msg = opt->diffopt.output_prefix(&opt->diffopt, opt->diffopt.output_prefix_data); - fwrite(msg->buf, msg->len, 1, opt->diffopt.file); + fwrite(msg, strlen(msg), 1, opt->diffopt.file); } /* diff --git a/range-diff.c b/range-diff.c index bbb0952264b..10885ba3013 100644 --- a/range-diff.c +++ b/range-diff.c @@ -480,7 +480,7 @@ static void patch_diff(const char *a, const char *b, diff_flush(diffopt); } -static struct strbuf *output_prefix_cb(struct diff_options *opt UNUSED, void *data) +static const char *output_prefix_cb(struct diff_options *opt UNUSED, void *data) { return data; } @@ -508,7 +508,7 @@ static void output(struct string_list *a, struct string_list *b, opts.flags.suppress_hunk_header_line_count = 1; opts.output_prefix = output_prefix_cb; strbuf_addstr(&indent, " "); - opts.output_prefix_data = &indent; + opts.output_prefix_data = indent.buf; diff_setup_done(&opts); /*