On Fri, Jun 6, 2025 at 7:23 AM Ilya Maximets <i.maxim...@ovn.org> wrote: > > 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. > > 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 | 12 ++++++------ > 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 | 6 +++--- > tests/test-jsonrpc.c | 2 +- > tests/test-ovsdb.c | 7 ++++--- > 22 files changed, 62 insertions(+), 49 deletions(-) > > diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c > index 1f157e46c..eee9646de 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..20626c445 100644 > --- a/lib/json.c > +++ b/lib/json.c > @@ -493,7 +493,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); > @@ -589,7 +589,7 @@ json_hash(const struct json *json, size_t basis) > > case JSON_STRING: > case JSON_SERIALIZED_OBJECT: > - return hash_string(json->string, basis); > + return hash_string(json_string(json), basis);
Hello Ilya, I got a SIGABORT here due to json->type != JSON_STRING in json_string(). Stack trace: #3 0x00007ffff76a36d0 in __GI_abort () at abort.c:73 #4 0x0000000000472664 in ovs_abort_valist (err_no=0, format=0x6298f8 "%s: assertion %s failed in %s()", args=0x7fffffffd428) at lib/util.c:450 #5 0x0000000000478f35 in vlog_abort_valist (module_=0x6f6600 <this_module>, message=0x6298f8 "%s: assertion %s failed in %s()", args=0x7fffffffd428) at lib/vlog.c:1311 #6 0x0000000000478fdb in vlog_abort (module=0x6f6600 <this_module>, message=0x6298f8 "%s: assertion %s failed in %s()") at lib/vlog.c:1325 #7 0x0000000000471e57 in ovs_assert_failure (where=0x622c14 "lib/json.c:359", function=0x623540 <__func__.8> "json_string", condition=0x622bfa "json->type == JSON_STRING") at lib/util.c:90 #8 0x0000000000446584 in json_string (json=0x7cc890) at lib/json.c:359 #9 0x0000000000448f58 in json_serialize (json=0x7cc890, s=0x7fffffffd670) at lib/json.c:1663 #10 0x0000000000449066 in json_serialize_object_member (i=1, node=0x7cc450, s=0x7fffffffd670) at lib/json.c:1697 #11 0x0000000000449183 in json_serialize_object (object=0x7cc330, s=0x7fffffffd670) at lib/json.c:1730 #12 0x0000000000448ec1 in json_serialize (json=0x7cc360, s=0x7fffffffd670) at lib/json.c:1643 #13 0x0000000000448dc0 in json_to_ds (json=0x7cc360, flags=0, ds=0x7fffffffd6a0) at lib/json.c:1621 #14 0x0000000000449cef in jsonrpc_send (rpc=0x79f7d0, msg=0x7cc1e0) at lib/jsonrpc.c:273 #15 0x000000000044bb5c in jsonrpc_session_send (s=0x7ce8f0, msg=0x7cc1e0) at lib/jsonrpc.c:1170 #16 0x000000000040daa0 in ovsdb_jsonrpc_session_send (s=0x7a0d40, msg=0x7cc1e0) at ovsdb/jsonrpc-server.c:1213 #17 0x000000000040d99b in ovsdb_jsonrpc_session_got_request (s=0x7a0d40, request=0x7a0b70) at ovsdb/jsonrpc-server.c:1179 #18 0x000000000040c4fe in ovsdb_jsonrpc_session_run (s=0x7a0d40) at ovsdb/jsonrpc-server.c:677 #19 0x000000000040c5fa in ovsdb_jsonrpc_session_run_all (remote=0x759cd0) at ovsdb/jsonrpc-server.c:700 #20 0x000000000040c08b in ovsdb_jsonrpc_server_run (svr=0x72e480) at ovsdb/jsonrpc-server.c:522 #21 0x000000000040200f in main_loop (config=0x7fffffffd9c0, jsonrpc=0x72e480, all_dbs=0x7fffffffda90, unixctl=0x79d230, remotes=0x7fffffffda20, run_process=0x0, exiting=0x7fffffffdabf) at ovsdb/ovsdb-server.c:331 #22 0x00000000004038d8 in main (argc=5, argv=0x7fffffffdc48) at ovsdb/ovsdb-server.c:891 Cheers, M > > case JSON_NULL: > case JSON_FALSE: > @@ -665,7 +665,7 @@ json_equal(const struct json *a, const struct json *b) > > case JSON_STRING: > case JSON_SERIALIZED_OBJECT: > - return !strcmp(a->string, b->string); > + return !strcmp(json_string(a), json_string(b)); > > case JSON_NULL: > case JSON_FALSE: > @@ -1064,7 +1064,7 @@ 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_string(json)); > } > > /* Reads the file named 'file_name', parses its contents as a JSON object or > @@ -1656,11 +1656,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_string(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..2ba92d119 100644 > --- a/tests/test-json.c > +++ b/tests/test-json.c > @@ -101,8 +101,8 @@ test_json_equal(const struct json *a, const struct json > *b, > > case JSON_STRING: > case JSON_SERIALIZED_OBJECT: > - ovs_assert(a->string != b->string); > - ovs_assert(!strcmp(a->string, b->string)); > + ovs_assert(json_string(a) != json_string(b)); > + ovs_assert(!strcmp(json_string(a), json_string(b))); > return; > > case JSON_NULL: > @@ -154,7 +154,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 > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev