[exim-cvs] JSON: fix crashes in ${extract jsons } and ${extr…

Inizio della pagina
Delete this message
Reply to this message
Autore: Exim Git Commits Mailing List
Data:  
To: exim-cvs
Oggetto: [exim-cvs] JSON: fix crashes in ${extract jsons } and ${extract json {digits} }
Gitweb: https://git.exim.org/exim.git/commitdiff/9f497717cbb7ffea60b235da3e10a7b42bda41ac
Commit:     9f497717cbb7ffea60b235da3e10a7b42bda41ac
Parent:     f3c73adaa541ae54092467a29668ac32894ef1dc
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Sat Feb 9 14:57:46 2019 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Sat Feb 9 15:25:54 2019 +0000


    JSON: fix crashes in ${extract jsons } and ${extract json {digits} }


    Broken-by: 386ab6457b and 8fdf20fd84
---
 src/src/expand.c             | 27 +++++++++++++++------------
 test/scripts/0000-Basic/0002 |  4 ++++
 test/stdout/0002             |  4 ++++
 3 files changed, 23 insertions(+), 12 deletions(-)


diff --git a/src/src/expand.c b/src/src/expand.c
index ec5660a..aa4d028 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 ad19105..65ad690 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 f53d9d5..f5a9728 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