/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) */ #include #include #include "ua_types_encoding_json.h" /* Decode a message, then encode, decode, encode. * The two encodings must be bit-equal. */ extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) { UA_ByteString buf; buf.data = (UA_Byte*)data; buf.length = size; UA_Variant value; UA_Variant_init(&value); UA_StatusCode retval = UA_decodeJson(&buf, &value, &UA_TYPES[UA_TYPES_VARIANT]); if(retval != UA_STATUSCODE_GOOD) return 0; size_t jsonSize = UA_calcSizeJson(&value, &UA_TYPES[UA_TYPES_VARIANT], NULL, 0, NULL, 0, true); UA_ByteString buf2 = UA_BYTESTRING_NULL; retval = UA_ByteString_allocBuffer(&buf2, jsonSize); if(retval != UA_STATUSCODE_GOOD) { UA_Variant_deleteMembers(&value); return 0; } uint8_t *bufPos = buf2.data; const uint8_t *bufEnd = &buf2.data[buf2.length]; retval = UA_encodeJson(&value, &UA_TYPES[UA_TYPES_VARIANT], &bufPos, &bufEnd, NULL, 0, NULL, 0, true); UA_Variant_deleteMembers(&value); if(retval != UA_STATUSCODE_GOOD || bufPos != bufEnd) { return 0; } UA_Variant value2; UA_Variant_init(&value2); retval = UA_decodeJson(&buf2, &value2, &UA_TYPES[UA_TYPES_VARIANT]); if(retval != UA_STATUSCODE_GOOD) { return 0; } UA_ByteString buf3 = UA_BYTESTRING_NULL; retval = UA_ByteString_allocBuffer(&buf3, jsonSize); if(retval != UA_STATUSCODE_GOOD) { UA_Variant_deleteMembers(&value2); UA_ByteString_deleteMembers(&buf2); return 0; } bufPos = buf3.data; bufEnd = &buf3.data[buf3.length]; retval = UA_encodeJson(&value2, &UA_TYPES[UA_TYPES_VARIANT], &bufPos, &bufEnd, NULL, 0, NULL, 0, true); UA_Variant_deleteMembers(&value2); if(retval != UA_STATUSCODE_GOOD) { UA_ByteString_deleteMembers(&buf2); UA_ByteString_deleteMembers(&buf3); return 0; } UA_assert(buf2.length == buf3.length); UA_assert(memcmp(buf2.data, buf3.data, buf2.length) == 0); UA_ByteString_deleteMembers(&buf2); UA_ByteString_deleteMembers(&buf3); return 0; }