summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2019-02-09 14:57:46 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2019-02-09 15:25:54 +0000
commit9f497717cbb7ffea60b235da3e10a7b42bda41ac (patch)
tree3316866133b839a0f0286162e1111d40ae6f799f
parentf3c73adaa541ae54092467a29668ac32894ef1dc (diff)
JSON: fix crashes in ${extract jsons } and ${extract json {digits} }
Broken-by: 386ab6457b and 8fdf20fd84
-rw-r--r--src/src/expand.c27
-rw-r--r--test/scripts/0000-Basic/00024
-rw-r--r--test/stdout/00024
3 files changed, 23 insertions, 12 deletions
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