We'll be changing the way strings are stored, so the direct access
will not be safe anymore.  Change all the users to use the proper
API as they should have been doing anyway.  This also means splitting
the handling of strings and serialized objects in most cases as
they will be treated differently.

The only code outside of json implementation for which direct access
is preserved is substitute_uuids() in test-ovsdb.c.  It's an unusual
string manipulation that is only needed for the testing, so doesn't
seem worthy adding a new API function.  We could introduce something
like json_string_replace() if this use case will appear somewhere
else in the future.

Signed-off-by: Ilya Maximets <i.maxim...@ovn.org>
---
 lib/db-ctl-base.c      |  8 +++++---
 lib/json.c             | 20 +++++++++++++-------
 lib/jsonrpc.c          |  4 ++--
 lib/ovsdb-cs.c         |  2 +-
 lib/ovsdb-data.c       |  4 ++--
 lib/ovsdb-idl.c        | 16 +++++++++-------
 lib/ovsdb-parser.c     |  2 +-
 lib/ovsdb-types.c      |  4 ++--
 ovsdb/column.c         |  2 +-
 ovsdb/execution.c      |  2 +-
 ovsdb/jsonrpc-server.c |  6 +++---
 ovsdb/log.c            |  2 +-
 ovsdb/ovsdb-client.c   |  4 ++--
 ovsdb/ovsdb-idlc.in    | 12 ++++++++++--
 ovsdb/ovsdb-tool.c     |  2 +-
 ovsdb/ovsdb-util.c     |  8 ++++----
 ovsdb/replication.c    |  2 +-
 python/ovs/_json.c     |  2 +-
 python/ovs/db/types.py |  2 +-
 tests/test-json.c      | 11 ++++++++---
 tests/test-jsonrpc.c   |  2 +-
 tests/test-ovsdb.c     |  7 ++++---
 22 files changed, 74 insertions(+), 50 deletions(-)

diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
index 5b741b1d4..0b6bf0cd6 100644
--- a/lib/db-ctl-base.c
+++ b/lib/db-ctl-base.c
@@ -247,15 +247,17 @@ record_id_equals(const union ovsdb_atom *name, enum 
ovsdb_atomic_type type,
                  const char *record_id)
 {
     if (type == OVSDB_TYPE_STRING) {
-        if (!strcmp(name->s->string, record_id)) {
+        const char *name_str = json_string(name->s);
+
+        if (!strcmp(name_str, record_id)) {
             return true;
         }
 
         struct uuid uuid;
         size_t len = strlen(record_id);
         if (len >= 4
-            && uuid_from_string(&uuid, name->s->string)
-            && !strncmp(name->s->string, record_id, len)) {
+            && uuid_from_string(&uuid, name_str)
+            && !strncmp(name_str, record_id, len)) {
             return true;
         }
 
diff --git a/lib/json.c b/lib/json.c
index 2649e8e12..fe223d9bc 100644
--- a/lib/json.c
+++ b/lib/json.c
@@ -419,6 +419,9 @@ json_destroy__(struct json *json, bool yield)
         break;
 
     case JSON_STRING:
+        free(json->string);
+        break;
+
     case JSON_SERIALIZED_OBJECT:
         free(json->string);
         break;
@@ -493,7 +496,7 @@ json_deep_clone(const struct json *json)
         return json_deep_clone_array(&json->array);
 
     case JSON_STRING:
-        return json_string_create(json->string);
+        return json_string_create(json_string(json));
 
     case JSON_SERIALIZED_OBJECT:
         return json_serialized_object_create(json);
@@ -588,8 +591,10 @@ json_hash(const struct json *json, size_t basis)
         return json_hash_array(&json->array, basis);
 
     case JSON_STRING:
+        return hash_string(json_string(json), basis);
+
     case JSON_SERIALIZED_OBJECT:
-        return hash_string(json->string, basis);
+        return hash_string(json_serialized_object(json), basis);
 
     case JSON_NULL:
     case JSON_FALSE:
@@ -664,8 +669,10 @@ json_equal(const struct json *a, const struct json *b)
         return json_equal_array(&a->array, &b->array);
 
     case JSON_STRING:
+        return !strcmp(json_string(a), json_string(b));
+
     case JSON_SERIALIZED_OBJECT:
-        return !strcmp(a->string, b->string);
+        return !strcmp(json_serialized_object(a), json_serialized_object(b));
 
     case JSON_NULL:
     case JSON_FALSE:
@@ -1063,8 +1070,7 @@ json_from_string(const char *string)
 struct json *
 json_from_serialized_object(const struct json *json)
 {
-    ovs_assert(json->type == JSON_SERIALIZED_OBJECT);
-    return json_from_string(json->string);
+    return json_from_string(json_serialized_object(json));
 }
 
 /* Reads the file named 'file_name', parses its contents as a JSON object or
@@ -1656,11 +1662,11 @@ json_serialize(const struct json *json, struct 
json_serializer *s)
         break;
 
     case JSON_STRING:
-        json_serialize_string(json->string, ds);
+        json_serialize_string(json_string(json), ds);
         break;
 
     case JSON_SERIALIZED_OBJECT:
-        ds_put_cstr(ds, json->string);
+        ds_put_cstr(ds, json_serialized_object(json));
         break;
 
     case JSON_N_TYPES:
diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c
index 90723a42b..f01a2e56f 100644
--- a/lib/jsonrpc.c
+++ b/lib/jsonrpc.c
@@ -737,7 +737,7 @@ jsonrpc_msg_from_json(struct json *json, struct jsonrpc_msg 
**msgp)
     }
 
     msg = xzalloc(sizeof *msg);
-    msg->method = method ? xstrdup(method->string) : NULL;
+    msg->method = method ? xstrdup(json_string(method)) : NULL;
     msg->params = null_from_json_null(shash_find_and_delete(object, "params"));
     msg->result = null_from_json_null(shash_find_and_delete(object, "result"));
     msg->error = null_from_json_null(shash_find_and_delete(object, "error"));
@@ -1204,7 +1204,7 @@ jsonrpc_session_recv(struct jsonrpc_session *s)
                 jsonrpc_session_send(s, reply);
             } else if (msg->type == JSONRPC_REPLY
                        && msg->id && msg->id->type == JSON_STRING
-                       && !strcmp(msg->id->string, "echo")) {
+                       && !strcmp(json_string(msg->id), "echo")) {
                 /* It's a reply to our echo request.  Suppress it. */
             } else {
                 return msg;
diff --git a/lib/ovsdb-cs.c b/lib/ovsdb-cs.c
index 87c6211bf..20386101f 100644
--- a/lib/ovsdb-cs.c
+++ b/lib/ovsdb-cs.c
@@ -1878,7 +1878,7 @@ server_column_get_string(const struct server_row *row,
 {
     ovs_assert(server_columns[index].type.key.type == OVSDB_TYPE_STRING);
     const struct ovsdb_datum *d = &row->data[index];
-    return d->n == 1 ? d->keys[0].s->string : default_value;
+    return d->n == 1 ? json_string(d->keys[0].s) : default_value;
 }
 
 static bool
diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
index e4149401f..d38eee5d0 100644
--- a/lib/ovsdb-data.c
+++ b/lib/ovsdb-data.c
@@ -264,7 +264,7 @@ unwrap_json(const struct json *json, const char *name,
     if (json->type != JSON_ARRAY
         || json->array.n != 2
         || json->array.elems[0]->type != JSON_STRING
-        || (name && strcmp(json->array.elems[0]->string, name))
+        || (name && strcmp(json_string(json->array.elems[0]), name))
         || json->array.elems[1]->type != value_type)
     {
         *value = NULL;
@@ -1278,7 +1278,7 @@ ovsdb_datum_from_json__(struct ovsdb_datum *datum,
         || (json->type == JSON_ARRAY
             && json->array.n > 0
             && json->array.elems[0]->type == JSON_STRING
-            && !strcmp(json->array.elems[0]->string, "set"))) {
+            && !strcmp(json_string(json->array.elems[0]), "set"))) {
         bool is_map = ovsdb_type_is_map(type);
         const char *class = is_map ? "map" : "set";
         const struct json *inner;
diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 226a4b475..cef4a337b 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -2865,8 +2865,8 @@ substitute_uuids(struct json *json, const struct 
ovsdb_idl_txn *txn)
         if (json->array.n == 2
             && json->array.elems[0]->type == JSON_STRING
             && json->array.elems[1]->type == JSON_STRING
-            && !strcmp(json->array.elems[0]->string, "uuid")
-            && uuid_from_string(&uuid, json->array.elems[1]->string)) {
+            && !strcmp(json_string(json->array.elems[0]), "uuid")
+            && uuid_from_string(&uuid, json_string(json->array.elems[1]))) {
             const struct ovsdb_idl_row *row;
 
             row = ovsdb_idl_txn_get_row(txn, &uuid);
@@ -4038,18 +4038,20 @@ ovsdb_idl_txn_process_reply(struct ovsdb_idl *idl,
                 error = shash_find_data(json_object(op), "error");
                 if (error) {
                     if (error->type == JSON_STRING) {
-                        if (!strcmp(error->string, "timed out")) {
+                        const char *error_string = json_string(error);
+
+                        if (!strcmp(error_string, "timed out")) {
                             soft_errors++;
-                        } else if (!strcmp(error->string,
+                        } else if (!strcmp(error_string,
                                            "unknown database")) {
                             ovsdb_cs_flag_inconsistency(idl->cs);
                             soft_errors++;
-                        } else if (!strcmp(error->string, "not owner")) {
+                        } else if (!strcmp(error_string, "not owner")) {
                             lock_errors++;
-                        } else if (!strcmp(error->string, "not allowed")) {
+                        } else if (!strcmp(error_string, "not allowed")) {
                             hard_errors++;
                             ovsdb_idl_txn_set_error_json(txn, op);
-                        } else if (strcmp(error->string, "aborted")) {
+                        } else if (strcmp(error_string, "aborted")) {
                             hard_errors++;
                             ovsdb_idl_txn_set_error_json(txn, op);
                             VLOG_WARN_RL(&other_rl,
diff --git a/lib/ovsdb-parser.c b/lib/ovsdb-parser.c
index 38119c195..07a670781 100644
--- a/lib/ovsdb-parser.c
+++ b/lib/ovsdb-parser.c
@@ -83,7 +83,7 @@ ovsdb_parser_member(struct ovsdb_parser *parser, const char 
*name,
     if (((int) value->type >= 0 && value->type < JSON_N_TYPES
          && types & (1u << value->type))
         || (types & OP_ID && value->type == JSON_STRING
-            && ovsdb_parser_is_id(value->string)))
+            && ovsdb_parser_is_id(json_string(value))))
     {
         sset_add(&parser->used, name);
         return value;
diff --git a/lib/ovsdb-types.c b/lib/ovsdb-types.c
index 69f132597..fce540f4d 100644
--- a/lib/ovsdb-types.c
+++ b/lib/ovsdb-types.c
@@ -476,7 +476,7 @@ ovsdb_base_type_from_json(struct ovsdb_base_type *base,
         if (refTable) {
             const struct json *refType;
 
-            base->uuid.refTableName = xstrdup(refTable->string);
+            base->uuid.refTableName = xstrdup(json_string(refTable));
 
             /* We can't set base->uuid.refTable here because we don't have
              * enough context (we might not even be running in ovsdb-server).
@@ -718,7 +718,7 @@ ovsdb_type_from_json(struct ovsdb_type *type, const struct 
json *json)
         }
 
         if (max && max->type == JSON_STRING
-            && !strcmp(max->string, "unlimited")) {
+            && !strcmp(json_string(max), "unlimited")) {
             type->n_max = UINT_MAX;
         } else {
             error = n_from_json(max, &type->n_max);
diff --git a/ovsdb/column.c b/ovsdb/column.c
index 9dfc8714f..37cda730c 100644
--- a/ovsdb/column.c
+++ b/ovsdb/column.c
@@ -173,7 +173,7 @@ ovsdb_column_set_from_json(const struct json *json,
                 goto error;
             }
 
-            s = json->array.elems[i]->string;
+            s = json_string(json->array.elems[i]);
             column = shash_find_data(&schema->columns, s);
             if (!column) {
                 error = ovsdb_syntax_error(json, NULL, "%s is not a valid "
diff --git a/ovsdb/execution.c b/ovsdb/execution.c
index f4cc9e802..756129da4 100644
--- a/ovsdb/execution.c
+++ b/ovsdb/execution.c
@@ -128,7 +128,7 @@ ovsdb_execute_compose(struct ovsdb *db, const struct 
ovsdb_session *session,
     if (params->type != JSON_ARRAY
         || !params->array.n
         || params->array.elems[0]->type != JSON_STRING
-        || strcmp(params->array.elems[0]->string, db->schema->name)) {
+        || strcmp(json_string(params->array.elems[0]), db->schema->name)) {
         if (params->type != JSON_ARRAY) {
             error = ovsdb_syntax_error(params, NULL, "array expected");
         } else {
diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c
index ba5a4211b..50fb2c7f1 100644
--- a/ovsdb/jsonrpc-server.c
+++ b/ovsdb/jsonrpc-server.c
@@ -900,7 +900,7 @@ ovsdb_jsonrpc_lookup_db(const struct ovsdb_jsonrpc_session 
*s,
         goto error;
     }
 
-    db_name = params->elems[0]->string;
+    db_name = json_string(params->elems[0]);
     db = shash_find_data(&s->up.server->dbs, db_name);
     if (!db) {
         error = ovsdb_syntax_error(
@@ -1447,7 +1447,7 @@ ovsdb_jsonrpc_parse_monitor_request(
                                           "array of column names expected");
             }
 
-            s = columns->array.elems[i]->string;
+            s = json_string(columns->array.elems[i]);
             column = shash_find_data(&table->schema->columns, s);
             if (!column) {
                 return ovsdb_syntax_error(columns, NULL, "%s is not a valid "
@@ -1590,7 +1590,7 @@ ovsdb_jsonrpc_monitor_create(struct ovsdb_jsonrpc_session 
*s, struct ovsdb *db,
             goto error;
         }
         struct uuid txn_uuid;
-        if (!uuid_from_string(&txn_uuid, last_id->string)) {
+        if (!uuid_from_string(&txn_uuid, json_string(last_id))) {
             error = ovsdb_syntax_error(last_id, NULL,
                                        "last-txn-id must be UUID format.");
             goto error;
diff --git a/ovsdb/log.c b/ovsdb/log.c
index fff7c6ba1..0c3577119 100644
--- a/ovsdb/log.c
+++ b/ovsdb/log.c
@@ -495,7 +495,7 @@ ovsdb_log_read(struct ovsdb_log *file, struct json **jsonp)
                                    "offset %lld are not valid JSON (%s)",
                                    file->display_name, data_length,
                                    (long long int) data_offset,
-                                   json->string);
+                                   json_string(json));
         goto error;
     }
     if (json->type != JSON_OBJECT) {
diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
index 5258eccaa..f85057b6c 100644
--- a/ovsdb/ovsdb-client.c
+++ b/ovsdb/ovsdb-client.c
@@ -501,7 +501,7 @@ parse_json(const char *s)
 {
     struct json *json = json_from_string(s);
     if (json->type == JSON_STRING) {
-        ovs_fatal(0, "\"%s\": %s", s, json->string);
+        ovs_fatal(0, "\"%s\": %s", s, json_string(json));
     }
     return json;
 }
@@ -596,7 +596,7 @@ fetch_dbs(struct jsonrpc *rpc, struct svec *dbs)
         if (name->type != JSON_STRING) {
             ovs_fatal(0, "list_dbs response %"PRIuSIZE" is not string", i);
         }
-        svec_add(dbs, name->string);
+        svec_add(dbs, json_string(name));
     }
     jsonrpc_msg_destroy(reply);
     svec_sort(dbs);
diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
index 9a54f06a1..5c3e76c77 100755
--- a/ovsdb/ovsdb-idlc.in
+++ b/ovsdb/ovsdb-idlc.in
@@ -601,13 +601,17 @@ static void
             elif (type.n_min == 1 and type.n_max == 1) or 
type.is_optional_pointer():
                 print("")
                 print("    if (datum->n >= 1) {")
-                if not type.key.ref_table:
+                if type.key.type == ovs.db.types.StringType:
+                    print("        %s = CONST_CAST(char *, 
json_string(datum->keys[0].s));" % keyVar)
+                elif not type.key.ref_table:
                     print("        %s = datum->keys[0].%s;" % (keyVar, 
type.key.type.to_rvalue_string()))
                 else:
                     print("        %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, 
&%stable_%s, &datum->keys[0].uuid));" % (keyVar, prefix, 
type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower()))
 
                 if valueVar:
-                    if not type.value.ref_table:
+                    if type.value.type == ovs.db.types.StringType:
+                        print("        %s = CONST_CAST(char *, 
json_string(datum->values[0].s));" % valueVar)
+                    elif not type.value.ref_table:
                         print("        %s = datum->values[0].%s;" % (valueVar, 
type.value.type.to_rvalue_string()))
                     else:
                         print("        %s = 
%s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_%s, &datum->values[0].uuid));" % 
(valueVar, prefix, type.value.ref_table.name.lower(), prefix, 
type.value.ref_table.name.lower()))
@@ -635,6 +639,8 @@ static void
         }\
 """ % (prefix, type.key.ref_table.name.lower(), prefix, 
type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower()))
                     keySrc = "keyRow"
+                elif type.key.type == ovs.db.types.StringType:
+                    keySrc = "CONST_CAST(char *, 
json_string(datum->keys[i].s))"
                 else:
                     keySrc = "datum->keys[i].%s" % 
type.key.type.to_rvalue_string()
                 if type.value and type.value.ref_table:
@@ -645,6 +651,8 @@ static void
         }\
 """ % (prefix, type.value.ref_table.name.lower(), prefix, 
type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower()))
                     valueSrc = "valueRow"
+                elif valueVar and type.value.type == ovs.db.types.StringType:
+                    valueSrc = "CONST_CAST(char *, 
json_string(datum->values[i].s))"
                 elif valueVar:
                     valueSrc = "datum->values[i].%s" % 
type.value.type.to_rvalue_string()
                 print("        if (!row->n_%s) {" % (columnName))
diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
index 354382f11..9051020b3 100644
--- a/ovsdb/ovsdb-tool.c
+++ b/ovsdb/ovsdb-tool.c
@@ -229,7 +229,7 @@ parse_json(const char *s)
 {
     struct json *json = json_from_string(s);
     if (json->type == JSON_STRING) {
-        ovs_fatal(0, "\"%s\": %s", s, json->string);
+        ovs_fatal(0, "\"%s\": %s", s, json_string(json));
     }
     return json;
 }
diff --git a/ovsdb/ovsdb-util.c b/ovsdb/ovsdb-util.c
index ec4537890..c15e6bb64 100644
--- a/ovsdb/ovsdb-util.c
+++ b/ovsdb/ovsdb-util.c
@@ -111,13 +111,13 @@ ovsdb_util_read_map_string_column(const struct ovsdb_row 
*row,
 
     for (i = 0; i < datum->n; i++) {
         atom_key = &datum->keys[i];
-        if (!strcmp(atom_key->s->string, key)) {
+        if (!strcmp(json_string(atom_key->s), key)) {
             atom_value = &datum->values[i];
             break;
         }
     }
 
-    return atom_value ? atom_value->s->string : NULL;
+    return atom_value ? json_string(atom_value->s) : NULL;
 }
 
 /* Read string-uuid key-values from a map.  Returns the row associated with
@@ -143,7 +143,7 @@ ovsdb_util_read_map_string_uuid_column(const struct 
ovsdb_row *row,
     const struct ovsdb_datum *datum = &row->fields[column->index];
     for (size_t i = 0; i < datum->n; i++) {
         union ovsdb_atom *atom_key = &datum->keys[i];
-        if (!strcmp(atom_key->s->string, key)) {
+        if (!strcmp(json_string(atom_key->s), key)) {
             const union ovsdb_atom *atom_value = &datum->values[i];
             return ovsdb_table_get_row(ref_table, &atom_value->uuid);
         }
@@ -181,7 +181,7 @@ ovsdb_util_read_string_column(const struct ovsdb_row *row,
     const union ovsdb_atom *atom;
 
     atom = ovsdb_util_read_column(row, column_name, OVSDB_TYPE_STRING);
-    *stringp = atom ? atom->s->string : NULL;
+    *stringp = atom ? json_string(atom->s) : NULL;
     return atom != NULL;
 }
 
diff --git a/ovsdb/replication.c b/ovsdb/replication.c
index 56720cb10..67eab9c42 100644
--- a/ovsdb/replication.c
+++ b/ovsdb/replication.c
@@ -220,7 +220,7 @@ replication_run_db(struct replication_db *rdb)
             if (msg->params->type == JSON_ARRAY
                 && msg->params->array.n == 2
                 && msg->params->array.elems[0]->type == JSON_STRING) {
-                char *db_name = msg->params->array.elems[0]->string;
+                const char *db_name = json_string(msg->params->array.elems[0]);
 
                 if (!strcmp(db_name, rdb->db->name)) {
                     struct ovsdb_error *error;
diff --git a/python/ovs/_json.c b/python/ovs/_json.c
index afa97896d..5f4388f80 100644
--- a/python/ovs/_json.c
+++ b/python/ovs/_json.c
@@ -135,7 +135,7 @@ json_to_python(struct json *json)
         return PyLong_FromLong((long) json->integer);
 
     case JSON_STRING:
-        return PyUnicode_FromString(json->string);
+        return PyUnicode_FromString(json_string(json));
     default:
         return NULL;
     }
diff --git a/python/ovs/db/types.py b/python/ovs/db/types.py
index 3318a3b6f..af6aa878c 100644
--- a/python/ovs/db/types.py
+++ b/python/ovs/db/types.py
@@ -50,7 +50,7 @@ class AtomicType(object):
 
     def to_rvalue_string(self):
         if self == StringType:
-            return 's->' + self.name
+            raise error.Error("can't convert string type to rvalue")
         return self.name
 
     def to_lvalue_string(self):
diff --git a/tests/test-json.c b/tests/test-json.c
index 6cf5eb75d..9b6a44868 100644
--- a/tests/test-json.c
+++ b/tests/test-json.c
@@ -100,9 +100,14 @@ test_json_equal(const struct json *a, const struct json *b,
         return;
 
     case JSON_STRING:
+        ovs_assert(json_string(a) != json_string(b));
+        ovs_assert(!strcmp(json_string(a), json_string(b)));
+        return;
+
     case JSON_SERIALIZED_OBJECT:
-        ovs_assert(a->string != b->string);
-        ovs_assert(!strcmp(a->string, b->string));
+        ovs_assert(json_serialized_object(a) != json_serialized_object(b));
+        ovs_assert(!strcmp(json_serialized_object(a),
+                           json_serialized_object(b)));
         return;
 
     case JSON_NULL:
@@ -154,7 +159,7 @@ print_test_and_free_json(struct json *json)
 {
     bool ok;
     if (json->type == JSON_STRING) {
-        printf("error: %s\n", json->string);
+        printf("error: %s\n", json_string(json));
         ok = false;
     } else {
         char *s = json_to_string(json, JSSF_SORT | (pretty ? JSSF_PRETTY : 0));
diff --git a/tests/test-jsonrpc.c b/tests/test-jsonrpc.c
index 04e941b14..02504c289 100644
--- a/tests/test-jsonrpc.c
+++ b/tests/test-jsonrpc.c
@@ -124,7 +124,7 @@ parse_json(const char *s)
 {
     struct json *json = json_from_string(s);
     if (json->type == JSON_STRING) {
-        ovs_fatal(0, "\"%s\": %s", s, json->string);
+        ovs_fatal(0, "\"%s\": %s", s, json_string(json));
     }
     return json;
 }
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index 52438e677..0511e4170 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -265,7 +265,7 @@ parse_json(const char *s)
 {
     struct json *json = json_from_string(s);
     if (json->type == JSON_STRING) {
-        ovs_fatal(0, "\"%s\": %s", s, json->string);
+        ovs_fatal(0, "\"%s\": %s", s, json_string(json));
     }
     return json;
 }
@@ -937,7 +937,7 @@ do_compare_rows(struct ovs_cmdl_context *ctx)
             ovs_fatal(0, "\"%s\" does not have expected form "
                       "[\"name\", {data}]", ctx->argv[i]);
         }
-        names[i] = xstrdup(json->array.elems[0]->string);
+        names[i] = xstrdup(json_string(json->array.elems[0]));
         check_ovsdb_error(ovsdb_row_from_json(rows[i], json->array.elems[1],
                                               NULL, NULL, false));
         json_destroy(json);
@@ -2385,7 +2385,8 @@ parse_uuids(const struct json *json, struct 
ovsdb_symbol_table *symtab,
 {
     struct uuid uuid;
 
-    if (json->type == JSON_STRING && uuid_from_string(&uuid, json->string)) {
+    if (json->type == JSON_STRING
+        && uuid_from_string(&uuid, json_string(json))) {
         char *name = xasprintf("#%"PRIuSIZE"#", *n);
         fprintf(stderr, "%s = "UUID_FMT"\n", name, UUID_ARGS(&uuid));
         ovsdb_symbol_table_put(symtab, name, &uuid, false);
-- 
2.49.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to