Re: [PATCH] am: release strbuf after use in split_mail_mbox()

2017-12-07 Thread Jeff King
On Thu, Dec 07, 2017 at 09:20:19PM +0100, René Scharfe wrote:

> Signed-off-by: Rene Scharfe 
> ---
>  builtin/am.c | 10 +++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/builtin/am.c b/builtin/am.c
> index 02853b3e05..1ac044da2e 100644
> --- a/builtin/am.c
> +++ b/builtin/am.c
> @@ -708,6 +708,7 @@ static int split_mail_mbox(struct am_state *state, const 
> char **paths,
>  {
>   struct child_process cp = CHILD_PROCESS_INIT;
>   struct strbuf last = STRBUF_INIT;
> + int ret;
>  
>   cp.git_cmd = 1;
>   argv_array_push(, "mailsplit");
> @@ -721,13 +722,16 @@ static int split_mail_mbox(struct am_state *state, 
> const char **paths,
>   argv_array_push(, "--");
>   argv_array_pushv(, paths);
>  
> - if (capture_command(, , 8))
> - return -1;
> + ret = capture_command(, , 8);
> + if (ret)
> + goto exit;

Looks good to me.

Coupled with your third patch, it made me wonder if capture_command()
should free the strbuf when it sees an error. But probably not. Some
callers would want to see the output even from a failing command (and
doubly for pipe_command(), which may capture stderr).

(And anyway, it wouldn't make this case any simpler; we were leaking in
the success code path, too!)

-Peff


[PATCH] am: release strbuf after use in split_mail_mbox()

2017-12-07 Thread René Scharfe
Signed-off-by: Rene Scharfe 
---
 builtin/am.c | 10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/builtin/am.c b/builtin/am.c
index 02853b3e05..1ac044da2e 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -708,6 +708,7 @@ static int split_mail_mbox(struct am_state *state, const 
char **paths,
 {
struct child_process cp = CHILD_PROCESS_INIT;
struct strbuf last = STRBUF_INIT;
+   int ret;
 
cp.git_cmd = 1;
argv_array_push(, "mailsplit");
@@ -721,13 +722,16 @@ static int split_mail_mbox(struct am_state *state, const 
char **paths,
argv_array_push(, "--");
argv_array_pushv(, paths);
 
-   if (capture_command(, , 8))
-   return -1;
+   ret = capture_command(, , 8);
+   if (ret)
+   goto exit;
 
state->cur = 1;
state->last = strtol(last.buf, NULL, 10);
 
-   return 0;
+exit:
+   strbuf_release();
+   return ret ? -1 : 0;
 }
 
 /**
-- 
2.15.1