A brief look at deprecating our JSON extensions over RFC 8259

Markus Armbruster armbru at redhat.com
Tue Feb 23 12:34:56 UTC 2021


Paolo Bonzini <pbonzini at redhat.com> writes:

> On 23/02/21 10:06, Markus Armbruster wrote:
>>> Markus, did you rebuild the qtests after disabling single-quoted
>>> strings?  "make check-qtest-x86_64" would have rebuilt them, but I'm
>>> confused by the results.
>> I ran "make check" and looked at the failures:
>> Still confused?
>
> Yes.  What's the patch that you used to disable the single quotes, and
> why didn't the patched parser choke on
>
>     response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, "
>                    "'property': 'temperature' } }", id);
>
> ?

My bad!  I neglected to mention that I tied "disable single-quoted
strings" to "interpolation is off" for my experiment.  This is a lazy,
half-assed approximation of "internal interface".

Here's the experimental patch.


commit 57138b9d4188dd8ce1814237fe53f7131bbb3f45
Author: Markus Armbruster <armbru at redhat.com>
Date:   Mon Feb 22 17:04:10 2021 +0100

    qobject: Tie single quote extension to interpolation WIP
    
    This makes several tests fail or hang.  Some are hacked up.

diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 008b326fb8..c1ddc65d96 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -150,9 +150,6 @@ static QString *parse_string(JSONParserContext *ctxt, JSONToken *token)
             case '"':
                 g_string_append_c(str, '"');
                 break;
-            case '\'':
-                g_string_append_c(str, '\'');
-                break;
             case '\\':
                 g_string_append_c(str, '\\');
                 break;
@@ -201,6 +198,12 @@ static QString *parse_string(JSONParserContext *ctxt, JSONToken *token)
                 }
                 g_string_append(str, utf8_buf);
                 break;
+            case '\'':
+                if (ctxt->ap) {
+                    g_string_append_c(str, '\'');
+                    break;
+                }
+                /* fall through */
             default:
                 parse_error(ctxt, token, "invalid escape sequence in string");
                 goto out;
diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
index b93d97b995..3d4d3b484e 100644
--- a/qobject/json-streamer.c
+++ b/qobject/json-streamer.c
@@ -49,6 +49,11 @@ void json_message_process_token(JSONLexer *lexer, GString *input,
     case JSON_RSQUARE:
         parser->bracket_count--;
         break;
+    case JSON_STRING:
+        if (input->str[0] == '\"' || parser->ap) {
+            break;
+        }
+        /* fall through */
     case JSON_ERROR:
         error_setg(&err, "JSON parse error, stray '%s'", input->str);
         goto out_emit;




More information about the libvir-list mailing list