[PATCH 3/3] notmuch-restore: allocate a temporary talloc context for each line parsed.

Jani Nikula jani at nikula.org
Sun Dec 16 14:41:12 PST 2012


On Sun, 16 Dec 2012, david at tethera.net wrote:
> From: David Bremner <bremner at debian.org>
>
> This lets the high level code in notmuch restore be ignorant about
> what the lower level code is doing as far as allocating memory.
> ---
>  notmuch-restore.c |   12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/notmuch-restore.c b/notmuch-restore.c
> index 4b76d83..52e7ecb 100644
> --- a/notmuch-restore.c
> +++ b/notmuch-restore.c
> @@ -122,6 +122,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
>      char *input_file_name = NULL;
>      FILE *input = stdin;
>      char *line = NULL;
> +    void *line_ctx = NULL;
>      size_t line_size;
>      ssize_t line_len;
>  
> @@ -205,10 +206,11 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
>      do {
>  	char *query_string;

This patch only works on top of the batch tagging series, because
there's still one continue statement in the "id:" prefix check. But you
could make it work for both, *and* keep the slightly more intuitive ret
checking order if you did (yes, the slightly counter-intuitive):

	if (line_ctxt != NULL)
	  talloc_free (line_ctx);

right here, and...

> +	line_ctx = talloc_new (ctx);
>  	if (input_format == DUMP_FORMAT_SUP) {
> -	    ret = parse_sup_line (ctx, line, &query_string, tag_ops);
> +	    ret = parse_sup_line (line_ctx, line, &query_string, tag_ops);
>  	} else {
> -	    ret = parse_tag_line (ctx, line, TAG_FLAG_BE_GENEROUS,
> +	    ret = parse_tag_line (line_ctx, line, TAG_FLAG_BE_GENEROUS,
>  				  &query_string, tag_ops);
>  
>  	    if (ret == 0) {
> @@ -238,8 +240,14 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
>  		break;
>  	}
>  
> +	talloc_free (line_ctx);
> +	/* setting to NULL is important to avoid a double free */
> +	line_ctx = NULL;

...removed the above lines here.

Otherwise I think you'll need a temporary goto until the batch tagging
series. (I'm fine with that too.)

Overall the series LGTM, and I like how this dodges the query_string
alloc/free problem altogether.

BR,
Jani.

>      }  while ((line_len = getline (&line, &line_size, input)) != -1);
>  
> +    if (line_ctx != NULL)
> +	talloc_free (line_ctx);
> +
>      if (input_format == DUMP_FORMAT_SUP)
>  	regfree (&regex);
>  
> -- 
> 1.7.10.4
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list