From: "Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Edward Thomson <ethomson@edwardthomson.com>,
Phillip Wood <phillip.wood123@gmail.com>,
Phillip Wood <phillip.wood@dunelm.org.uk>
Subject: [PATCH v2 0/4] xdiff: handle allocation failures
Date: Wed, 16 Feb 2022 10:15:05 +0000 [thread overview]
Message-ID: <pull.1140.v2.git.1645006510.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1140.git.1644404356.gitgitgadget@gmail.com>
Thanks to Junio for his comments on V1.
Changes since V1:
* Patch 1 is new and addresses a memory leak noticed by Junio
* Patch 2 is unchanged
* Patch 3 now avoids a double free of xe1 on error
* Patch 4 reworked handling of the return value
V1 Cover Letter: Other users of xdiff such as libgit2 need to be able to
handle allocation failures. This series fixes the few cases where we are not
doing this already.
Edward's patch[1] reminded me that I had these waiting to be submitted.
[1] https://lore.kernel.org/git/20220209013354.GB7@abe733c6e288/
Phillip Wood (4):
xdiff: fix a memory leak
xdiff: handle allocation failure in patience diff
xdiff: refactor a function
xdiff: handle allocation failure when merging
xdiff/xdiffi.c | 33 +++++++++++++++++----------------
xdiff/xhistogram.c | 3 ---
xdiff/xmerge.c | 42 ++++++++++++++++++++++--------------------
xdiff/xpatience.c | 21 ++++++++++++---------
4 files changed, 51 insertions(+), 48 deletions(-)
base-commit: 38062e73e009f27ea192d50481fcb5e7b0e9d6eb
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1140%2Fphillipwood%2Fwip%2Fxdiff-handle-allocation-failures-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1140/phillipwood/wip/xdiff-handle-allocation-failures-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1140
Range-diff vs v1:
-: ----------- > 1: 3fcb6c80367 xdiff: fix a memory leak
1: b8f88f1b9f8 = 2: fec1f4a4152 xdiff: handle allocation failure in patience diff
2: 8655bb0348d ! 3: 073a45e9e85 xdiff: refactor a function
@@ Metadata
## Commit message ##
xdiff: refactor a function
- Rather than having to remember exactly what to free after an
- allocation failure use the standard "goto out" pattern. This will
- simplify the next commit that starts handling currently unhandled
- failures.
+ Use the standard "goto out" pattern rather than repeating very similar
+ code after checking for each error. This will simplify the next commit
+ that starts handling allocation failures that are currently ignored.
+ On error xdl_do_diff() frees the environment so we need to take care
+ to avoid a double free in that case. xdl_build_script() does not
+ assign a result unless it is successful so there is no possibility of
+ a double free if it fails.
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
@@ xdiff/xmerge.c: static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
xmparam_t const *xmp, mmbuffer_t *result)
{
- xdchange_t *xscr1, *xscr2;
-- xdfenv_t xe1, xe2;
-- int status;
+ xdchange_t *xscr1 = NULL, *xscr2 = NULL;
-+ xdfenv_t xe1 = { 0 }, xe2 = { 0 };
+ xdfenv_t xe1, xe2;
+- int status;
+ int status = -1;
xpparam_t const *xpp = &xmp->xpp;
@@ xdiff/xmerge.c: static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
result->size = 0;
- if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0) {
-- return -1;
++ if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0)
+ return -1;
- }
- if (xdl_do_diff(orig, mf2, xpp, &xe2) < 0) {
- xdl_free_env(&xe1);
- return -1;
- }
-+ if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0)
-+ goto out;
+
+ if (xdl_do_diff(orig, mf2, xpp, &xe2) < 0)
-+ goto out;
++ goto free_xe1; /* avoid double free of xe2 */
+
if (xdl_change_compact(&xe1.xdf1, &xe1.xdf2, xpp->flags) < 0 ||
xdl_change_compact(&xe1.xdf2, &xe1.xdf1, xpp->flags) < 0 ||
@@ xdiff/xmerge.c: int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2,
xdl_free_script(xscr1);
xdl_free_script(xscr2);
+- xdl_free_env(&xe1);
+ xdl_free_env(&xe2);
++ free_xe1:
++ xdl_free_env(&xe1);
+
+ return status;
+ }
3: 3e935abba1d ! 4: 7e705d771b0 xdiff: handle allocation failure when merging
@@ Commit message
## xdiff/xmerge.c ##
@@ xdiff/xmerge.c: int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2,
- status = 0;
+ xdl_build_script(&xe2, &xscr2) < 0)
+ goto out;
+
+- status = 0;
if (!xscr1) {
result->ptr = xdl_malloc(mf2->size);
-+ if (!result->ptr) {
-+ status = -1;
++ if (!result->ptr)
+ goto out;
-+ }
++ status = 0;
memcpy(result->ptr, mf2->ptr, mf2->size);
result->size = mf2->size;
} else if (!xscr2) {
result->ptr = xdl_malloc(mf1->size);
-+ if (!result->ptr) {
-+ status = -1;
++ if (!result->ptr)
+ goto out;
-+ }
++ status = 0;
memcpy(result->ptr, mf1->ptr, mf1->size);
result->size = mf1->size;
} else {
--
gitgitgadget
next prev parent reply other threads:[~2022-02-16 10:15 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-09 10:59 [PATCH 0/3] xdiff: handle allocation failures Phillip Wood via GitGitGadget
2022-02-09 10:59 ` [PATCH 1/3] xdiff: handle allocation failure in patience diff Phillip Wood via GitGitGadget
2022-02-09 10:59 ` [PATCH 2/3] xdiff: refactor a function Phillip Wood via GitGitGadget
2022-02-09 18:04 ` Junio C Hamano
2022-02-10 6:28 ` Junio C Hamano
2022-02-11 15:19 ` Phillip Wood
2022-02-11 16:46 ` Junio C Hamano
2022-02-09 10:59 ` [PATCH 3/3] xdiff: handle allocation failure when merging Phillip Wood via GitGitGadget
2022-02-16 10:15 ` Phillip Wood via GitGitGadget [this message]
2022-02-16 10:15 ` [PATCH v2 1/4] xdiff: fix a memory leak Phillip Wood via GitGitGadget
2022-02-16 10:28 ` Ævar Arnfjörð Bjarmason
2022-02-16 13:49 ` Phillip Wood
2022-02-16 14:38 ` Ævar Arnfjörð Bjarmason
2022-02-16 16:55 ` Junio C Hamano
2022-02-17 11:05 ` Phillip Wood
2022-02-16 10:15 ` [PATCH v2 2/4] xdiff: handle allocation failure in patience diff Phillip Wood via GitGitGadget
2022-02-16 10:15 ` [PATCH v2 3/4] xdiff: refactor a function Phillip Wood via GitGitGadget
2022-02-16 10:15 ` [PATCH v2 4/4] xdiff: handle allocation failure when merging Phillip Wood via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1140.v2.git.1645006510.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=ethomson@edwardthomson.com \
--cc=git@vger.kernel.org \
--cc=phillip.wood123@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.