--- parser3/src/classes/json.C 2025/10/05 19:41:27 1.68 +++ parser3/src/classes/json.C 2026/10/13 20:02:00 1.71 @@ -1,7 +1,7 @@ /** @file Parser: @b json parser class. - Copyright (c) 2000-2024 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2000-2026 Art. Lebedev Studio (https://www.artlebedev.com) Authors: Konstantin Morshnev */ @@ -20,7 +20,7 @@ #include "pa_vxdoc.h" #endif -volatile const char * IDENT_JSON_C="$Id: json.C,v 1.68 2025/10/05 19:41:27 moko Exp $"; +volatile const char * IDENT_JSON_C="$Id: json.C,v 1.71 2026/10/13 20:02:00 moko Exp $"; // class @@ -133,11 +133,15 @@ static void set_json_value(Json *json, V } } -String* json_string(Json *json, const char *value, uint32_t length){ - String::C result = json->charset !=NULL ? - Charset::transcode(String::C(value, length), pa_UTF8_charset, *json->charset) : - String::C(pa_strdup(value, length), length); - return new String(result, json->taint); +String* json_string(Json *json, const char *value){ + /* do_callback_withbuf guarantees a null-terminated value */ + if (size_t length = strlen(value)){ + String::C result = json->charset !=NULL ? + Charset::transcode(String::C(value, length), pa_UTF8_charset, *json->charset) : + String::C(pa_strdup(value, length), length); + return new String(result, json->taint); + } + return (String*)&String::Empty; } static Value *json_hook(Request &r, Junction *hook, String* key, Value* value){ @@ -149,7 +153,7 @@ static Value *json_hook(Request &r, Junc }); } -static int json_callback(Json *json, int type, const char *value, uint32_t length) +static int json_callback(Json *json, int type, const char *value, uint32_t) { switch(type) { case JSON_OBJECT_BEGIN:{ @@ -204,23 +208,23 @@ static int json_callback(Json *json, int } break; case JSON_KEY: - json->key = json_string(json, value, length); + json->key = json_string(json, value); break; case JSON_INT: if (json->handle_int){ - set_json_value(json, new VDouble( json_string(json, value, length)->as_double() )); + set_json_value(json, new VDouble( json_string(json, value)->as_double() )); } else { // JSON_STRING - set_json_value(json, new VString(*json_string(json, value, length))); + set_json_value(json, new VString(*json_string(json, value))); } break; case JSON_FLOAT: if (json->handle_double){ - set_json_value(json, new VDouble( json_string(json, value, length)->as_double() )); + set_json_value(json, new VDouble( json_string(json, value)->as_double() )); break; } // else is JSON_STRING case JSON_STRING: - set_json_value(json, new VString(*json_string(json, value, length))); + set_json_value(json, new VString(*json_string(json, value))); break; case JSON_NULL: set_json_value(json, VVoid::get()); @@ -254,8 +258,6 @@ static const char* json_error_message(in return error_messages[error_code]; } -extern String::Language get_untaint_lang(const String& lang_name); - #define SOURCE_MAX_LEN 60 void json_exception_with_source(Request& r, const char* msg, const char* json, int offset){ @@ -355,7 +357,7 @@ static void _parse(Request& r, MethodPar valid_options++; } if(Value* value=options->get("taint")) { - json.taint=get_untaint_lang(value->as_string()); + json.taint=String::name2lang(value->as_string()); valid_options++; } if(Value* value=options->get("object")) {