mime_node_child has (potentially) returned NULL since it was introduced, but apparently this did not happen much in practice, since nobody mentioned segfaults. Clean that up so that at least notmuch show does not segfault with empty message attachments anymore [1].
At least in the test case [2], this seems to produce structured output (json / sexpr) conforming to devel/schemata, since a multipart/* can have 0 or more children under the 'content' key. [1] id:[email protected] [2] id:[email protected] --- notmuch-show.c | 27 ++++++++++++++++++--------- test/T520-show.sh | 1 - 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index 8c23f821..22983101 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -637,9 +637,11 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node, } } - for (i = 0; i < node->nchildren; i++) - format_part_text (ctx, sp, mime_node_child (node, i), indent, params); - + for (i = 0; i < node->nchildren; i++) { + mime_node_t *child = mime_node_child (node, i); + if (child != NULL) + format_part_text (ctx, sp, child, indent, params); + } if (GMIME_IS_MESSAGE (node->part)) g_mime_stream_printf (stream, "\fbody}\n"); @@ -689,10 +691,13 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, sp->integer (sp, duplicate > 0 ? duplicate : 1); if (output_body) { - sp->map_key (sp, "body"); - sp->begin_list (sp); - format_part_sprinter (ctx, sp, mime_node_child (node, 0), -1, true, include_html); - sp->end (sp); + mime_node_t *child = mime_node_child (node, 0); + if (child) { + sp->map_key (sp, "body"); + sp->begin_list (sp); + format_part_sprinter (ctx, sp, child, -1, true, include_html); + sp->end (sp); + } } msg_crypto = mime_node_get_message_crypto_status (node); @@ -854,8 +859,12 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, nclose = 3; } - for (i = 0; i < node->nchildren; i++) - format_part_sprinter (ctx, sp, mime_node_child (node, i), -1, true, include_html); + for (i = 0; i < node->nchildren; i++) { + mime_node_t *child = mime_node_child (node, i); + if (child) { + format_part_sprinter (ctx, sp, child, -1, true, include_html); + } + } /* Close content structures */ for (i = 0; i < nclose; i++) diff --git a/test/T520-show.sh b/test/T520-show.sh index 9eb49284..25afded7 100755 --- a/test/T520-show.sh +++ b/test/T520-show.sh @@ -109,7 +109,6 @@ done add_email_corpus broken for format in text json sexp; do test_begin_subtest "don't crash on empty part ($format)" - test_subtest_known_broken test_expect_code 0 "notmuch show --format=$format id:[email protected]" done -- 2.53.0 _______________________________________________ notmuch mailing list -- [email protected] To unsubscribe send an email to [email protected]
