From: Jeremy Harris Date: Sat, 9 Feb 2019 14:57:46 +0000 (+0000) Subject: JSON: fix crashes in ${extract jsons } and ${extract json {digits} } X-Git-Tag: exim-4.93-RC0~284^2~6 X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=9f497717cbb7ffea60b235da3e10a7b42bda41ac;p=exim.git JSON: fix crashes in ${extract jsons } and ${extract json {digits} } Broken-by: 386ab6457b and 8fdf20fd84 --- diff --git a/src/src/expand.c b/src/src/expand.c index ec5660adb..aa4d0289e 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -5811,10 +5811,11 @@ while (*s != 0) } while (field_number > 0 && (item = json_nextinlist(&list))) field_number--; - s = item; - lookup_value = s; - while (*s) s++; - while (--s >= lookup_value && isspace(*s)) *s = '\0'; + if ((lookup_value = s = item)) + { + while (*s) s++; + while (--s >= lookup_value && isspace(*s)) *s = '\0'; + } } else { @@ -5850,14 +5851,16 @@ while (*s != 0) } } - if (fmt == extract_jsons) - if (!(lookup_value = dewrap(lookup_value, US"\"\""))) - { - expand_string_message = - string_sprintf("%s wrapping string result for extract jsons", - expand_string_message); - goto EXPAND_FAILED_CURLY; - } + if ( fmt == extract_jsons + && lookup_value + && !(lookup_value = dewrap(lookup_value, US"\"\""))) + { + expand_string_message = + string_sprintf("%s wrapping string result for extract jsons", + expand_string_message); + goto EXPAND_FAILED_CURLY; + } + break; /* json/s */ } /* If no string follows, $value gets substituted; otherwise there can diff --git a/test/scripts/0000-Basic/0002 b/test/scripts/0000-Basic/0002 index ad1910510..65ad69047 100644 --- a/test/scripts/0000-Basic/0002 +++ b/test/scripts/0000-Basic/0002 @@ -895,6 +895,8 @@ ${extract json {2} {${extract json{IDs} {\{"other":"foo", "IDs": [116, 943, 234] ${extract json {2} {["red", "green", "blue", "black"]} } ${extract jsons{2} {["red", "green", "blue", "black"]} } +<${extract jsons{5} {["red", "green", "blue", "black"]} }> +expect: <> ${extract json {seconds} { \{"hours":0, "mins":0, "seconds":59\} }} ${extract json {seconds} {${extract json {2} { ["irrelevant", \{"hours":0, "mins":0, "seconds":59\}] }}}} @@ -907,6 +909,8 @@ expect: {"1":116, "2":943, "3":234} <${extract json{nonexistent}{ \{"id": \{"a":101, "b":102\}, "IDs": \{"1":116, "2":943, "3":234\}\} }}> expect: <> +<${extract jsons{nonexistent}{ \{"id": \{"a":101, "b":102\}, "IDs": \{"1":116, "2":943, "3":234\}\} }}> +expect: <> ${if forany_json {[1, 2, 3]}{={$item}{1}}{yes}{no}} ${if forany_jsons{["A", "B", "C"]}{eq{$item}{B}}{yes}{no}} diff --git a/test/stdout/0002 b/test/stdout/0002 index f53d9d563..f5a97289a 100644 --- a/test/stdout/0002 +++ b/test/stdout/0002 @@ -838,6 +838,8 @@ xyz > > "green" > green +> <> +> expect: <> > > 59 > 59 @@ -850,6 +852,8 @@ xyz > > <> > expect: <> +> <> +> expect: <> > > yes > yes