sprinters: bugfix when NULL passed for a string.

The string function in a sprinter may be called with a NULL string
pointer (eg if a header is absent). This causes a segfault. We fix
this by checking for a null pointer in the string functions and update
the sprinter documentation.

At the moment some output when format=text is done directly rather than
via an sprinter: in that case a null pointer is passed to printf or
similar and a "(null)" appears in the output. That behaviour is not
changed in this patch.
This commit is contained in:
Mark Walters 2012-08-08 22:23:33 +01:00 committed by David Bremner
parent 36e640852b
commit 94c3b40d41
4 changed files with 7 additions and 3 deletions

View file

@ -118,6 +118,8 @@ json_string_len (struct sprinter *sp, const char *val, size_t len)
static void static void
json_string (struct sprinter *sp, const char *val) json_string (struct sprinter *sp, const char *val)
{ {
if (val == NULL)
val = "";
json_string_len (sp, val, strlen (val)); json_string_len (sp, val, strlen (val));
} }

View file

@ -38,6 +38,8 @@ text_string_len (struct sprinter *sp, const char *val, size_t len)
static void static void
text_string (struct sprinter *sp, const char *val) text_string (struct sprinter *sp, const char *val)
{ {
if (val == NULL)
val = "";
text_string_len (sp, val, strlen (val)); text_string_len (sp, val, strlen (val));
} }

View file

@ -27,7 +27,9 @@ typedef struct sprinter {
* a list or map, followed or preceded by separators). For string * a list or map, followed or preceded by separators). For string
* and string_len, the char * must be UTF-8 encoded. string_len * and string_len, the char * must be UTF-8 encoded. string_len
* allows non-terminated strings and strings with embedded NULs * allows non-terminated strings and strings with embedded NULs
* (though the handling of the latter is format-dependent). * (though the handling of the latter is format-dependent). For
* string (but not string_len) the string pointer passed may be
* NULL.
*/ */
void (*string) (struct sprinter *, const char *); void (*string) (struct sprinter *, const char *);
void (*string_len) (struct sprinter *, const char *, size_t); void (*string_len) (struct sprinter *, const char *, size_t);

View file

@ -29,7 +29,6 @@ thread:XXX 2001-01-05 [1/1] (null); (inbox unread)
thread:XXX 1970-01-01 [1/1] Notmuch Test Suite; (inbox unread)" thread:XXX 1970-01-01 [1/1] Notmuch Test Suite; (inbox unread)"
test_begin_subtest "Search: json" test_begin_subtest "Search: json"
test_subtest_known_broken
output=$(notmuch search --format=json '*' | notmuch_search_sanitize) output=$(notmuch search --format=json '*' | notmuch_search_sanitize)
test_expect_equal_json "$output" ' test_expect_equal_json "$output" '
[ [
@ -93,7 +92,6 @@ Body
message}" message}"
test_begin_subtest "Show: json" test_begin_subtest "Show: json"
test_subtest_known_broken
output=$(notmuch show --format=json '*' | notmuch_json_show_sanitize) output=$(notmuch show --format=json '*' | notmuch_json_show_sanitize)
test_expect_equal_json "$output" ' test_expect_equal_json "$output" '
[ [