diff --git a/client/common/test/TestClientRdpFile.c b/client/common/test/TestClientRdpFile.c index b86f4448a..cfd5b9aff 100644 --- a/client/common/test/TestClientRdpFile.c +++ b/client/common/test/TestClientRdpFile.c @@ -558,7 +558,8 @@ int TestClientRdpFile(int argc, char* argv[]) WINPR_UNUSED(argc); WINPR_UNUSED(argv); - winpr_RAND(&id, sizeof(id)); + if (winpr_RAND(&id, sizeof(id)) < 0) + return -1; /* UTF8 */ #if defined(CHANNEL_URBDRC_CLIENT) && defined(CHANNEL_RDPECAM_CLIENT) diff --git a/libfreerdp/codec/test/TestFreeRDPCodecCopy.c b/libfreerdp/codec/test/TestFreeRDPCodecCopy.c index fdd81df9e..b528239f2 100644 --- a/libfreerdp/codec/test/TestFreeRDPCodecCopy.c +++ b/libfreerdp/codec/test/TestFreeRDPCodecCopy.c @@ -26,7 +26,8 @@ static BOOL TestFreeRDPImageCopy(UINT32 w, UINT32 h, UINT32 srcFormat, UINT32 ds for (size_t x = 0; x < runs; x++) { - winpr_RAND_pseudo(src, h * srcStep); + if (winpr_RAND_pseudo(src, h * srcStep) < 0) + goto fail; const UINT64 start = winpr_GetUnixTimeNS(); rc = freerdp_image_copy(dst, dstFormat, dstStep, 0, 0, w, h, src, srcFormat, srcStep, 0, 0, nullptr, 0); @@ -64,7 +65,8 @@ static BOOL TestFreeRDPImageCopy_no_overlap(UINT32 w, UINT32 h, UINT32 srcFormat for (size_t x = 0; x < runs; x++) { - winpr_RAND_pseudo(src, h * srcStep); + if (winpr_RAND_pseudo(src, h * srcStep) < 0) + goto fail; const UINT64 start = winpr_GetUnixTimeNS(); rc = freerdp_image_copy_no_overlap(dst, dstFormat, dstStep, 0, 0, w, h, src, srcFormat, srcStep, 0, 0, nullptr, 0); diff --git a/libfreerdp/codec/test/TestFreeRDPCodecH264.c b/libfreerdp/codec/test/TestFreeRDPCodecH264.c index c2803bbd3..a9cfea1d2 100644 --- a/libfreerdp/codec/test/TestFreeRDPCodecH264.c +++ b/libfreerdp/codec/test/TestFreeRDPCodecH264.c @@ -71,7 +71,11 @@ static void* allocRGB(uint32_t format, uint32_t width, uint32_t height, uint32_t for (size_t x = 0; x < height; x++) { - winpr_RAND(&rgb[x * stride], width * bpp); + if (winpr_RAND(&rgb[x * stride], width * bpp) < 0) + { + free(rgb); + return nullptr; + } } return rgb; } diff --git a/libfreerdp/codec/test/TestFreeRDPCodecInterleaved.c b/libfreerdp/codec/test/TestFreeRDPCodecInterleaved.c index 954b50e72..36ea0ae6e 100644 --- a/libfreerdp/codec/test/TestFreeRDPCodecInterleaved.c +++ b/libfreerdp/codec/test/TestFreeRDPCodecInterleaved.c @@ -46,7 +46,8 @@ static bool run_encode_decode_single(UINT16 bpp, BITMAP_INTERLEAVED_CONTEXT* enc if (!pSrcData || !pDstData || !tmp) goto fail; - winpr_RAND(pSrcData, SrcSize); + if (winpr_RAND(pSrcData, SrcSize) < 0) + goto fail; if (!bitmap_interleaved_context_reset(encoder) || !bitmap_interleaved_context_reset(decoder)) goto fail; diff --git a/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c b/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c index d29118cb8..5a82683e4 100644 --- a/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c +++ b/libfreerdp/codec/test/TestFreeRDPCodecPlanar.c @@ -287,7 +287,12 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + { + (void)fprintf(stderr, "winpr_RAND failed, retry...\n"); + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } return tmp % (max - 1) + 1; } diff --git a/libfreerdp/common/assistance.c b/libfreerdp/common/assistance.c index df88302ed..97770b8f1 100644 --- a/libfreerdp/common/assistance.c +++ b/libfreerdp/common/assistance.c @@ -842,7 +842,12 @@ char* freerdp_assistance_generate_pass_stub(WINPR_ATTR_UNUSED DWORD flags) * * Example: WB^6HsrIaFmEpi */ - winpr_RAND(nums, sizeof(nums)); + if (winpr_RAND(nums, sizeof(nums)) < 0) + { + free(passStub); + return nullptr; + } + passStub[0] = set1[nums[0] % sizeof(set1)]; /* character 0 */ passStub[1] = set2[nums[1] % sizeof(set2)]; /* character 1 */ passStub[2] = set3[nums[2] % sizeof(set3)]; /* character 2 */ diff --git a/libfreerdp/common/test/TestAddinArgv.c b/libfreerdp/common/test/TestAddinArgv.c index 510e64275..752f7cc4b 100644 --- a/libfreerdp/common/test/TestAddinArgv.c +++ b/libfreerdp/common/test/TestAddinArgv.c @@ -19,7 +19,8 @@ static BOOL test_alloc(void) goto fail; /* Test allocation without initializing arguments of random size > 0 */ - winpr_RAND(&rng, sizeof(rng)); + if (winpr_RAND(&rng, sizeof(rng)) < 0) + goto fail; rng = abs(rng % 8192) + 1; arg2 = freerdp_addin_argv_new(rng, nullptr); diff --git a/libfreerdp/core/autodetect.c b/libfreerdp/core/autodetect.c index cc3952950..29ed5c241 100644 --- a/libfreerdp/core/autodetect.c +++ b/libfreerdp/core/autodetect.c @@ -249,7 +249,11 @@ autodetect_send_bandwidth_measure_payload(rdpAutoDetect* autodetect, Stream_Write_UINT16(s, RDP_BW_PAYLOAD_REQUEST_TYPE); /* requestType (2 bytes) */ Stream_Write_UINT16(s, payloadLength); /* payloadLength (2 bytes) */ /* Random data (better measurement in case the line is compressed) */ - winpr_RAND(Stream_Pointer(s), payloadLength); + if (winpr_RAND(Stream_Pointer(s), payloadLength) < 0) + { + Stream_Release(s); + return FALSE; + } Stream_Seek(s, payloadLength); return rdp_send_message_channel_pdu(autodetect->context->rdp, s, sec_flags | SEC_AUTODETECT_REQ); @@ -304,7 +308,11 @@ static BOOL autodetect_send_bandwidth_measure_stop(rdpAutoDetect* autodetect, } /* Random data (better measurement in case the line is compressed) */ - winpr_RAND(Stream_Pointer(s), payloadLength); + if (winpr_RAND(Stream_Pointer(s), payloadLength) < 0) + { + Stream_Release(s); + return FALSE; + } Stream_Seek(s, payloadLength); } } diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index c561a4e1d..2e8d5a51c 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -735,7 +735,8 @@ static BOOL rdp_client_establish_keys(rdpRdp* rdp) if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ClientRandom, nullptr, CLIENT_RANDOM_LENGTH)) return FALSE; - winpr_RAND(settings->ClientRandom, settings->ClientRandomLength); + if (winpr_RAND(settings->ClientRandom, settings->ClientRandomLength) < 0) + return FALSE; const rdpCertInfo* info = freerdp_certificate_get_info(settings->RdpServerCertificate); if (!info) diff --git a/libfreerdp/core/gateway/rpc.c b/libfreerdp/core/gateway/rpc.c index 67326bac4..061ced390 100644 --- a/libfreerdp/core/gateway/rpc.c +++ b/libfreerdp/core/gateway/rpc.c @@ -518,7 +518,8 @@ static int rpc_channel_rpch_init(RpcClient* client, RpcChannel* channel, const c settings = client->context->settings; channel->auth = credssp_auth_new(client->context); - rts_generate_cookie((BYTE*)&channel->Cookie); + if (!rts_generate_cookie((BYTE*)&channel->Cookie)) + return -1; channel->client = client; if (!channel->auth) @@ -689,8 +690,10 @@ static RpcVirtualConnection* rpc_virtual_connection_new(rdpRpc* rpc) if (!connection) return nullptr; - rts_generate_cookie((BYTE*)&(connection->Cookie)); - rts_generate_cookie((BYTE*)&(connection->AssociationGroupId)); + if (!rts_generate_cookie((BYTE*)&(connection->Cookie))) + goto fail; + if (!rts_generate_cookie((BYTE*)&(connection->AssociationGroupId))) + goto fail; connection->State = VIRTUAL_CONNECTION_STATE_INITIAL; connection->DefaultInChannel = rpc_in_channel_new(rpc, &connection->Cookie); diff --git a/libfreerdp/core/gateway/rts.c b/libfreerdp/core/gateway/rts.c index 6ee751c20..0b2d001ea 100644 --- a/libfreerdp/core/gateway/rts.c +++ b/libfreerdp/core/gateway/rts.c @@ -1576,10 +1576,10 @@ static BOOL rts_destination_command_write(wStream* s, UINT32 Destination) return TRUE; } -void rts_generate_cookie(BYTE* cookie) +BOOL rts_generate_cookie(BYTE* cookie) { WINPR_ASSERT(cookie); - winpr_RAND(cookie, 16); + return winpr_RAND(cookie, 16) >= 0; } #define rts_send_buffer(channel, s, frag_length) \ diff --git a/libfreerdp/core/gateway/rts.h b/libfreerdp/core/gateway/rts.h index b99153a33..c584d9ed0 100644 --- a/libfreerdp/core/gateway/rts.h +++ b/libfreerdp/core/gateway/rts.h @@ -77,7 +77,7 @@ #define FDServer 0x00000002 #define FDOutProxy 0x00000003 -FREERDP_LOCAL void rts_generate_cookie(BYTE* cookie); +FREERDP_LOCAL BOOL rts_generate_cookie(BYTE* cookie); WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL rts_write_pdu_auth3(wStream* s, const rpcconn_rpc_auth_3_hdr_t* auth); diff --git a/libfreerdp/core/gateway/websocket.c b/libfreerdp/core/gateway/websocket.c index 70f69a7a7..535e682b8 100644 --- a/libfreerdp/core/gateway/websocket.c +++ b/libfreerdp/core/gateway/websocket.c @@ -88,13 +88,14 @@ wStream* websocket_context_packet_new(size_t len, WEBSOCKET_OPCODE opcode, UINT3 else fullLen = len + 14; /* 2 byte "mini header" + 8 byte length + 4 byte masking key */ + UINT32 maskingKey = 0; + if (winpr_RAND(&maskingKey, sizeof(maskingKey)) < 0) + return nullptr; + wStream* sWS = Stream_New(nullptr, fullLen); if (!sWS) return nullptr; - UINT32 maskingKey = 0; - winpr_RAND(&maskingKey, sizeof(maskingKey)); - Stream_Write_UINT8(sWS, (UINT8)(WEBSOCKET_FIN_BIT | opcode)); if (len < 126) Stream_Write_UINT8(sWS, (UINT8)len | WEBSOCKET_MASK_BIT); diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index a3cf2e3d3..b369e4b24 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -1792,8 +1792,7 @@ static BOOL gcc_update_server_random(rdpSettings* settings) BYTE* data = freerdp_settings_get_pointer_writable(settings, FreeRDP_ServerRandom); if (!data) return FALSE; - winpr_RAND(data, length); - return TRUE; + return winpr_RAND(data, length) >= 0; } /* TODO: This function does manipulate data in rdpMcs diff --git a/libfreerdp/core/license.c b/libfreerdp/core/license.c index 09381953c..af746e1d3 100644 --- a/libfreerdp/core/license.c +++ b/libfreerdp/core/license.c @@ -298,7 +298,7 @@ static const char* licencse_blob_type_string(UINT16 type) } static wStream* license_send_stream_init(rdpLicense* license, UINT16* sec_flags); -static void license_generate_randoms(rdpLicense* license); +static BOOL license_generate_randoms(rdpLicense* license); static BOOL license_generate_keys(rdpLicense* license); static BOOL license_generate_hwid(rdpLicense* license); static BOOL license_encrypt_premaster_secret(rdpLicense* license); @@ -1027,23 +1027,28 @@ fail: return rc; } -void license_generate_randoms(rdpLicense* license) +BOOL license_generate_randoms(rdpLicense* license) { WINPR_ASSERT(license); #ifdef LICENSE_NULL_CLIENT_RANDOM ZeroMemory(license->ClientRandom, sizeof(license->ClientRandom)); /* ClientRandom */ #else - winpr_RAND(license->ClientRandom, sizeof(license->ClientRandom)); /* ClientRandom */ + if (winpr_RAND(license->ClientRandom, sizeof(license->ClientRandom)) < 0) /* ClientRandom */ + return FALSE; #endif - winpr_RAND(license->ServerRandom, sizeof(license->ServerRandom)); /* ServerRandom */ + if (winpr_RAND(license->ServerRandom, sizeof(license->ServerRandom)) < 0) /* ServerRandom */ + return FALSE; #ifdef LICENSE_NULL_PREMASTER_SECRET ZeroMemory(license->PremasterSecret, sizeof(license->PremasterSecret)); /* PremasterSecret */ #else - winpr_RAND(license->PremasterSecret, sizeof(license->PremasterSecret)); /* PremasterSecret */ + if (winpr_RAND(license->PremasterSecret, sizeof(license->PremasterSecret)) < + 0) /* PremasterSecret */ + return FALSE; #endif + return TRUE; } /** @@ -2788,7 +2793,8 @@ rdpLicense* license_new(rdpRdp* rdp) if (!(license->ScopeList = license_new_scope_list())) goto out_error; - license_generate_randoms(license); + if (!license_generate_randoms(license)) + goto out_error; return license; diff --git a/libfreerdp/core/multitransport.c b/libfreerdp/core/multitransport.c index ba7e69f28..df12ea45d 100644 --- a/libfreerdp/core/multitransport.c +++ b/libfreerdp/core/multitransport.c @@ -125,7 +125,8 @@ state_run_t multitransport_server_request(rdpMultitransport* multi, UINT16 reqPr if (reqProto == INITIATE_REQUEST_PROTOCOL_UDPFECR) { multi->reliableReqId = reqId++; - winpr_RAND(multi->reliableCookie, sizeof(multi->reliableCookie)); + if (winpr_RAND(multi->reliableCookie, sizeof(multi->reliableCookie)) < 0) + return STATE_RUN_FAILED; return multitransport_request_send(multi, multi->reliableReqId, reqProto, multi->reliableCookie) diff --git a/libfreerdp/core/smartcardlogon.c b/libfreerdp/core/smartcardlogon.c index a1b7d4cf2..468bb32ee 100644 --- a/libfreerdp/core/smartcardlogon.c +++ b/libfreerdp/core/smartcardlogon.c @@ -707,13 +707,15 @@ out: static char* create_temporary_file(void) { - BYTE buffer[32]; - char* hex = nullptr; + BYTE buffer[32] = WINPR_C_ARRAY_INIT; char* path = nullptr; - winpr_RAND(buffer, sizeof(buffer)); - hex = winpr_BinToHexString(buffer, sizeof(buffer), FALSE); - path = GetKnownSubPath(KNOWN_PATH_TEMP, hex); + if (winpr_RAND(buffer, sizeof(buffer)) < 0) + return nullptr; + + char* hex = winpr_BinToHexString(buffer, sizeof(buffer), FALSE); + if (hex) + path = GetKnownSubPath(KNOWN_PATH_TEMP, hex); free(hex); return path; } diff --git a/libfreerdp/core/test/TestConnect.c b/libfreerdp/core/test/TestConnect.c index 6f8397346..1ce709862 100644 --- a/libfreerdp/core/test/TestConnect.c +++ b/libfreerdp/core/test/TestConnect.c @@ -317,7 +317,8 @@ int TestConnect(int argc, char* argv[]) int random = 0; WINPR_UNUSED(argc); WINPR_UNUSED(argv); - winpr_RAND(&random, sizeof(random)); + if (winpr_RAND(&random, sizeof(random)) < 0) + return -1; randomPort = 3389 + (random % 200); /* Test connect to not existing server, diff --git a/libfreerdp/core/test/TestSettings.c b/libfreerdp/core/test/TestSettings.c index e53c9fee3..17b2244b0 100644 --- a/libfreerdp/core/test/TestSettings.c +++ b/libfreerdp/core/test/TestSettings.c @@ -579,8 +579,10 @@ static BOOL check_key_helpers(size_t key, const char* stype) void* pv; } val; - winpr_RAND(&intEntryType, sizeof(intEntryType)); - winpr_RAND(&val.u64, sizeof(val.u64)); + if (winpr_RAND(&intEntryType, sizeof(intEntryType)) < 0) + goto fail; + if (winpr_RAND(&val.u64, sizeof(val.u64)) < 0) + goto fail; switch (key) { @@ -852,7 +854,8 @@ static BOOL test_write_offsets(rdpSettings* settings, size_t id, size_t elementS const void* ptr = nullptr; char buffer[8192] = WINPR_C_ARRAY_INIT; - winpr_RAND(buffer, sizeof(buffer)); + if (winpr_RAND(buffer, sizeof(buffer)) < 0) + return FALSE; if (!freerdp_settings_set_pointer_array(settings, id, x, buffer)) return FALSE; ptr = freerdp_settings_get_pointer_array(settings, id, x); @@ -1739,7 +1742,8 @@ static BOOL set_cert(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key) static BOOL set_string_array(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key, uint32_t max) { uint32_t count = 0; - winpr_RAND(&count, sizeof(count)); + if (winpr_RAND(&count, sizeof(count)) < 0) + return FALSE; count = count % max; if (!freerdp_settings_set_pointer_len(src, key, nullptr, count)) @@ -1815,7 +1819,8 @@ static BOOL test_serialize_pointer(DWORD flags) goto fail; void* ptr = nullptr; - winpr_RAND((void*)&ptr, sizeof(void*)); + if (winpr_RAND((void*)&ptr, sizeof(void*)) < 0) + goto fail; if (!freerdp_settings_set_pointer(src, FreeRDP_instance, ptr)) goto fail; @@ -1844,7 +1849,8 @@ static BOOL test_serialize_pointer(DWORD flags) for (size_t x = 0; x < ARRAYSIZE(addresses); x++) { uint32_t port = 0; - winpr_RAND(&port, sizeof(port)); + if (winpr_RAND(&port, sizeof(port)) < 0) + goto fail; if (!freerdp_settings_set_pointer_array(src, FreeRDP_TargetNetPorts, x, &port)) goto fail; } @@ -1856,14 +1862,16 @@ static BOOL test_serialize_pointer(DWORD flags) void* caps = freerdp_settings_get_pointer_writable(src, FreeRDP_ReceivedCapabilities); if (!caps) goto fail; - winpr_RAND(caps, count); + if (winpr_RAND(caps, count) < 0) + goto fail; for (uint32_t x = 0; x < count; x++) { uint8_t* buffer = calloc(64, sizeof(uint8_t)); if (!buffer) goto fail; - winpr_RAND(buffer, sizeof(buffer)); + if (winpr_RAND(buffer, sizeof(buffer)) < 0) + goto fail; uint32_t blen = (buffer[0] % 52) + 13; if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityData, x, buffer)) diff --git a/libfreerdp/core/test/TestStreamDump.c b/libfreerdp/core/test/TestStreamDump.c index ab7743d0f..8c5a8981b 100644 --- a/libfreerdp/core/test/TestStreamDump.c +++ b/libfreerdp/core/test/TestStreamDump.c @@ -24,7 +24,8 @@ static BOOL test_entry_read_write(void) size_t entrysize = sizeof(UINT64) /* timestamp */ + sizeof(BYTE) /* direction */ + sizeof(UINT32) /* CRC */ + sizeof(UINT64) /* size */; - winpr_RAND(tmp, sizeof(tmp)); + if (winpr_RAND(tmp, sizeof(tmp)) < 0) + goto fail; for (size_t x = 0; x < sizeof(tmp); x++) (void)_snprintf(&tmp2[x * 2], sizeof(tmp2) - 2 * x, "%02" PRIx8, tmp[x]); @@ -44,7 +45,8 @@ static BOOL test_entry_read_write(void) goto fail; } - winpr_RAND(Stream_Buffer(sw), Stream_Capacity(sw)); + if (winpr_RAND(Stream_Buffer(sw), Stream_Capacity(sw)) < 0) + goto fail; entrysize += Stream_Capacity(sw); Stream_SetLength(sw, Stream_Capacity(sw)); diff --git a/libfreerdp/emu/scard/smartcard_emulate.c b/libfreerdp/emu/scard/smartcard_emulate.c index d31877976..3b72df55a 100644 --- a/libfreerdp/emu/scard/smartcard_emulate.c +++ b/libfreerdp/emu/scard/smartcard_emulate.c @@ -395,11 +395,13 @@ LONG WINAPI Emulate_SCardEstablishContext(SmartcardEmulationContext* smartcard, { SCARDCONTEXT context = WINPR_C_ARRAY_INIT; - winpr_RAND(&context, sizeof(SCARDCONTEXT)); - if (HashTable_Insert(smartcard->contexts, (const void*)context, ctx)) + if (winpr_RAND(&context, sizeof(SCARDCONTEXT)) >= 0) { - *phContext = context; - status = SCARD_S_SUCCESS; + if (HashTable_Insert(smartcard->contexts, (const void*)context, ctx)) + { + *phContext = context; + status = SCARD_S_SUCCESS; + } } } @@ -1253,7 +1255,10 @@ HANDLE WINAPI Emulate_SCardAccessStartedEvent(SmartcardEmulationContext* smartca WLog_Print(smartcard->log, smartcard->log_default_level, "SCardAccessStartedEvent {"); /* Not required, return random */ - winpr_RAND((void*)&hEvent, sizeof(hEvent)); + if (winpr_RAND((void*)&hEvent, sizeof(hEvent)) < 0) + { + (void)fprintf(stderr, "winpr_RAND failed.\n"); + } WLog_Print(smartcard->log, smartcard->log_default_level, "SCardAccessStartedEvent } hEvent: %p", hEvent); @@ -1598,7 +1603,11 @@ static SCardHandle* reader2handle(SmartcardEmulationContext* smartcard, SCARDCON hdl = scard_handle_new(smartcard, hContext, szReader, unicode); if (hdl) { - winpr_RAND(&hdl->card, sizeof(hdl->card)); + if (winpr_RAND(&hdl->card, sizeof(hdl->card)) < 0) + { + scard_handle_free(hdl); + return nullptr; + } hdl->dwActiveProtocol = SCARD_PROTOCOL_T1; hdl->dwShareMode = dwShareMode; diff --git a/libfreerdp/emu/scard/smartcard_virtual_gids.c b/libfreerdp/emu/scard/smartcard_virtual_gids.c index 75a0c226a..8a0e68d62 100644 --- a/libfreerdp/emu/scard/smartcard_virtual_gids.c +++ b/libfreerdp/emu/scard/smartcard_virtual_gids.c @@ -1519,7 +1519,8 @@ BOOL vgids_init(vgidsContext* ctx, const char* cert, const char* privateKey, con cardidEF = vgids_ef_new(ctx, VGIDS_EFID_CARDID); if (!cardidEF) goto init_failed; - winpr_RAND(cardid, sizeof(cardid)); + if (winpr_RAND(cardid, sizeof(cardid)) < 0) + goto init_failed; if (!vgids_ef_write_do(cardidEF, VGIDS_DO_CARDID, cardid, sizeof(cardid))) goto init_failed; diff --git a/libfreerdp/gdi/test/TestGdiCreate.c b/libfreerdp/gdi/test/TestGdiCreate.c index c8860ccbd..f1f142dbf 100644 --- a/libfreerdp/gdi/test/TestGdiCreate.c +++ b/libfreerdp/gdi/test/TestGdiCreate.c @@ -328,7 +328,12 @@ fail: static BYTE prand(void) { BYTE tmp = 0; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + { + (void)fprintf(stderr, "winpr_RAND faild,retry...\n"); + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } return tmp; } diff --git a/libfreerdp/locale/test/TestLocaleKeyboard.c b/libfreerdp/locale/test/TestLocaleKeyboard.c index 50f8c96b2..89a068ef2 100644 --- a/libfreerdp/locale/test/TestLocaleKeyboard.c +++ b/libfreerdp/locale/test/TestLocaleKeyboard.c @@ -243,7 +243,12 @@ fail: static DWORD get_random(DWORD offset) { DWORD x = 0; - winpr_RAND(&x, sizeof(x)); + if (winpr_RAND(&x, sizeof(x)) < 0) + { + (void)fprintf(stderr, "winpr_RAND failed, retry...\n"); + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } x = x % UINT32_MAX - offset; x += offset; return x; diff --git a/libfreerdp/primitives/benchmark/benchmark.c b/libfreerdp/primitives/benchmark/benchmark.c index b402c4e67..3c095ca81 100644 --- a/libfreerdp/primitives/benchmark/benchmark.c +++ b/libfreerdp/primitives/benchmark/benchmark.c @@ -68,7 +68,8 @@ static primitives_YUV_benchmark primitives_YUV_benchmark_init(void) ret.rgbBuffer = calloc(ret.outputStride, ret.roi.height); if (!ret.rgbBuffer) goto fail; - winpr_RAND(ret.rgbBuffer, 1ULL * ret.outputStride * ret.roi.height); + if (winpr_RAND(ret.rgbBuffer, 1ULL * ret.outputStride * ret.roi.height) < 0) + goto fail; for (size_t i = 0; i < 3; i++) { @@ -77,7 +78,8 @@ static primitives_YUV_benchmark primitives_YUV_benchmark_init(void) if (!ret.channels[i] || !ret.outputChannels[i]) goto fail; - winpr_RAND(ret.channels[i], 1ull * ret.roi.width * ret.roi.height); + if (winpr_RAND(ret.channels[i], 1ull * ret.roi.width * ret.roi.height) < 0) + goto fail; ret.steps[i] = ret.roi.width; } diff --git a/libfreerdp/primitives/primitives.c b/libfreerdp/primitives/primitives.c index 920b5edbc..53ac685be 100644 --- a/libfreerdp/primitives/primitives.c +++ b/libfreerdp/primitives/primitives.c @@ -155,7 +155,8 @@ static primitives_YUV_benchmark* primitives_YUV_benchmark_init(primitives_YUV_be if (!buf) goto fail; - winpr_RAND(buf, 1ull * roi->width * roi->height); + if (winpr_RAND(buf, 1ull * roi->width * roi->height) < 0) + goto fail; ret->steps[i] = roi->width; } diff --git a/libfreerdp/primitives/test/TestPrimitivesAdd.c b/libfreerdp/primitives/test/TestPrimitivesAdd.c index 35de8c763..6c1aeeaf8 100644 --- a/libfreerdp/primitives/test/TestPrimitivesAdd.c +++ b/libfreerdp/primitives/test/TestPrimitivesAdd.c @@ -28,8 +28,10 @@ static BOOL test_add16s_func(void) INT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; INT16 ALIGN(d2[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; - winpr_RAND(src1, sizeof(src1)); - winpr_RAND(src2, sizeof(src2)); + if (winpr_RAND(src1, sizeof(src1)) < 0) + return FALSE; + if (winpr_RAND(src2, sizeof(src2)) < 0) + return FALSE; status = generic->add_16s(src1 + 1, src2 + 1, d1 + 1, FUNC_TEST_SIZE); if (status != PRIMITIVES_SUCCESS) return FALSE; @@ -42,15 +44,17 @@ static BOOL test_add16s_func(void) /* ------------------------------------------------------------------------- */ static BOOL test_add16s_speed(void) { - BYTE ALIGN(src1[MAX_TEST_SIZE + 3]); - BYTE ALIGN(src2[MAX_TEST_SIZE + 3]); - BYTE ALIGN(dst[MAX_TEST_SIZE + 3]); + BYTE ALIGN(src1[MAX_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; + BYTE ALIGN(src2[MAX_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; + BYTE ALIGN(dst[MAX_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; if (!g_TestPrimitivesPerformance) return TRUE; - winpr_RAND(src1, sizeof(src1)); - winpr_RAND(src2, sizeof(src2)); + if (winpr_RAND(src1, sizeof(src1)) < 0) + return FALSE; + if (winpr_RAND(src2, sizeof(src2)) < 0) + return FALSE; return (speed_test("add16s", "aligned", g_Iterations, (speed_test_fkt)generic->add_16s, (speed_test_fkt)optimized->add_16s, src1, src2, dst, FUNC_TEST_SIZE)); diff --git a/libfreerdp/primitives/test/TestPrimitivesAlphaComp.c b/libfreerdp/primitives/test/TestPrimitivesAlphaComp.c index e00221661..d565a6bc9 100644 --- a/libfreerdp/primitives/test/TestPrimitivesAlphaComp.c +++ b/libfreerdp/primitives/test/TestPrimitivesAlphaComp.c @@ -121,11 +121,13 @@ static BOOL test_alphaComp_func(void) BYTE ALIGN(src2[SRC2_WIDTH * SRC2_HEIGHT * 4]) = WINPR_C_ARRAY_INIT; BYTE ALIGN(dst1[DST_WIDTH * DST_HEIGHT * 4]) = WINPR_C_ARRAY_INIT; UINT32* ptr = nullptr; - winpr_RAND(src1, sizeof(src1)); + if (winpr_RAND(src1, sizeof(src1)) < 0) + return FALSE; /* Special-case the first two values */ src1[0] &= 0x00FFFFFFU; src1[1] |= 0xFF000000U; - winpr_RAND(src2, sizeof(src2)); + if (winpr_RAND(src2, sizeof(src2)) < 0) + return FALSE; /* Set the second operand to fully-opaque. */ ptr = (UINT32*)src2; @@ -163,11 +165,13 @@ static int test_alphaComp_speed(void) BYTE ALIGN(dst1[DST_WIDTH * DST_HEIGHT]) = WINPR_C_ARRAY_INIT; UINT32* ptr = nullptr; - winpr_RAND(src1, sizeof(src1)); + if (winpr_RAND(src1, sizeof(src1)) < 0) + return -1; /* Special-case the first two values */ src1[0] &= 0x00FFFFFFU; src1[1] |= 0xFF000000U; - winpr_RAND(src2, sizeof(src2)); + if (winpr_RAND(src2, sizeof(src2)) < 0) + return -1; /* Set the second operand to fully-opaque. */ ptr = (UINT32*)src2; diff --git a/libfreerdp/primitives/test/TestPrimitivesAndOr.c b/libfreerdp/primitives/test/TestPrimitivesAndOr.c index b596b56b0..1f34854ad 100644 --- a/libfreerdp/primitives/test/TestPrimitivesAndOr.c +++ b/libfreerdp/primitives/test/TestPrimitivesAndOr.c @@ -51,7 +51,8 @@ static BOOL test_and_32u_func(void) UINT32 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 ALIGN(dst[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; if (!test_and_32u_impl("generic->andC_32u aligned", generic->andC_32u, src + 1, VALUE, dst + 1, FUNC_TEST_SIZE)) @@ -75,7 +76,8 @@ static BOOL test_and_32u_speed(void) UINT32 ALIGN(src[MAX_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 ALIGN(dst[MAX_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; if (!speed_test("andC_32u", "aligned", g_Iterations, (speed_test_fkt)generic->andC_32u, (speed_test_fkt)optimized->andC_32u, src + 1, VALUE, dst + 1, MAX_TEST_SIZE)) @@ -110,7 +112,8 @@ static BOOL test_or_32u_func(void) UINT32 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 ALIGN(dst[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; status = generic->orC_32u(src + 1, VALUE, dst + 1, FUNC_TEST_SIZE); if (status != PRIMITIVES_SUCCESS) @@ -135,7 +138,8 @@ static BOOL test_or_32u_speed(void) UINT32 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 ALIGN(dst[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; return (speed_test("add16s", "aligned", g_Iterations, (speed_test_fkt)generic->orC_32u, (speed_test_fkt)optimized->orC_32u, src + 1, VALUE, dst + 1, diff --git a/libfreerdp/primitives/test/TestPrimitivesColors.c b/libfreerdp/primitives/test/TestPrimitivesColors.c index e4cde5aaa..727917b8f 100644 --- a/libfreerdp/primitives/test/TestPrimitivesColors.c +++ b/libfreerdp/primitives/test/TestPrimitivesColors.c @@ -44,9 +44,12 @@ static BOOL test_RGBToRGB_16s8u_P3AC4R_func(prim_size_t roi, DWORD DstFormat) if (!r || !g || !b || !out1 || !out2) goto fail; - winpr_RAND(r, 1ULL * rgbStride * roi.height); - winpr_RAND(g, 1ULL * rgbStride * roi.height); - winpr_RAND(b, 1ULL * rgbStride * roi.height); + if (winpr_RAND(r, 1ULL * rgbStride * roi.height) < 0) + goto fail; + if (winpr_RAND(g, 1ULL * rgbStride * roi.height) < 0) + goto fail; + if (winpr_RAND(b, 1ULL * rgbStride * roi.height) < 0) + goto fail; ptrs[0] = r; ptrs[1] = g; ptrs[2] = b; @@ -108,14 +111,17 @@ static BOOL test_RGBToRGB_16s8u_P3AC4R_speed(void) INT16** pv; } cnv; const prim_size_t roi64x64 = { 64, 64 }; - INT16 ALIGN(r[4096 + 1]); - INT16 ALIGN(g[4096 + 1]); - INT16 ALIGN(b[4096 + 1]); - UINT32 ALIGN(dst[4096 + 1]); - INT16* ptrs[3]; - winpr_RAND(r, sizeof(r)); - winpr_RAND(g, sizeof(g)); - winpr_RAND(b, sizeof(b)); + INT16 ALIGN(r[4096 + 1]) = WINPR_C_ARRAY_INIT; + INT16 ALIGN(g[4096 + 1]) = WINPR_C_ARRAY_INIT; + INT16 ALIGN(b[4096 + 1]) = WINPR_C_ARRAY_INIT; + UINT32 ALIGN(dst[4096 + 1]) = WINPR_C_ARRAY_INIT; + INT16* ptrs[3] = WINPR_C_ARRAY_INIT; + if (winpr_RAND(r, sizeof(r)) < 0) + return FALSE; + if (winpr_RAND(g, sizeof(g)) < 0) + return FALSE; + if (winpr_RAND(b, sizeof(b)) < 0) + return FALSE; /* clear upper bytes */ for (int i = 0; i < 4096; ++i) @@ -162,9 +168,12 @@ static BOOL test_yCbCrToRGB_16s16s_P3P3_func(void) INT16* out1[3]; INT16* out2[3]; prim_size_t roi = { 64, 64 }; - winpr_RAND(y, sizeof(y)); - winpr_RAND(cb, sizeof(cb)); - winpr_RAND(cr, sizeof(cr)); + if (winpr_RAND(y, sizeof(y)) < 0) + return FALSE; + if (winpr_RAND(cb, sizeof(cb)) < 0) + return FALSE; + if (winpr_RAND(cr, sizeof(cr)) < 0) + return FALSE; /* Normalize to 11.5 fixed radix */ for (int i = 0; i < 4096; ++i) @@ -211,17 +220,20 @@ static BOOL test_yCbCrToRGB_16s16s_P3P3_func(void) static int test_yCbCrToRGB_16s16s_P3P3_speed(void) { prim_size_t roi = { 64, 64 }; - INT16 ALIGN(y[4096]); - INT16 ALIGN(cb[4096]); - INT16 ALIGN(cr[4096]); - INT16 ALIGN(r[4096]); - INT16 ALIGN(g[4096]); - INT16 ALIGN(b[4096]); - const INT16* input[3]; - INT16* output[3]; - winpr_RAND(y, sizeof(y)); - winpr_RAND(cb, sizeof(cb)); - winpr_RAND(cr, sizeof(cr)); + INT16 y[4096] = WINPR_C_ARRAY_INIT; + INT16 cb[4096] = WINPR_C_ARRAY_INIT; + INT16 cr[4096] = WINPR_C_ARRAY_INIT; + INT16 r[4096] = WINPR_C_ARRAY_INIT; + INT16 g[4096] = WINPR_C_ARRAY_INIT; + INT16 b[4096] = WINPR_C_ARRAY_INIT; + const INT16* input[3] = WINPR_C_ARRAY_INIT; + INT16* output[3] = WINPR_C_ARRAY_INIT; + if (winpr_RAND(y, sizeof(y)) < 0) + return FALSE; + if (winpr_RAND(cb, sizeof(cb)) < 0) + return FALSE; + if (winpr_RAND(cr, sizeof(cr)) < 0) + return FALSE; /* Normalize to 11.5 fixed radix */ for (int i = 0; i < 4096; ++i) diff --git a/libfreerdp/primitives/test/TestPrimitivesCopy.c b/libfreerdp/primitives/test/TestPrimitivesCopy.c index c0b9e0274..d8336cadd 100644 --- a/libfreerdp/primitives/test/TestPrimitivesCopy.c +++ b/libfreerdp/primitives/test/TestPrimitivesCopy.c @@ -27,7 +27,8 @@ static BOOL test_copy8u_func(void) { primitives_t* prims = primitives_get(); BYTE ALIGN(data[COPY_TESTSIZE + 15]) = WINPR_C_ARRAY_INIT; - winpr_RAND(data, sizeof(data)); + if (winpr_RAND(data, sizeof(data)) < 0) + return FALSE; for (int soff = 0; soff < 16; ++soff) { @@ -81,7 +82,11 @@ static BYTE* rand_alloc(size_t w, size_t h, size_t bpp, size_t pad, BYTE** copy) if (!ptr) return nullptr; - winpr_RAND(ptr, s * h); + if (winpr_RAND(ptr, s * h) < 0) + { + free(ptr); + return nullptr; + } if (copy) { diff --git a/libfreerdp/primitives/test/TestPrimitivesSet.c b/libfreerdp/primitives/test/TestPrimitivesSet.c index 13946bd8e..02d2625db 100644 --- a/libfreerdp/primitives/test/TestPrimitivesSet.c +++ b/libfreerdp/primitives/test/TestPrimitivesSet.c @@ -83,7 +83,8 @@ static BOOL test_set8u_speed(void) for (UINT32 x = 0; x < 16; x++) { - winpr_RAND(&value, sizeof(value)); + if (winpr_RAND(&value, sizeof(value)) < 0) + return FALSE; if (!speed_test("set_8u", "", g_Iterations, (speed_test_fkt)generic->set_8u, (speed_test_fkt)optimized->set_8u, value, dest + x, x)) @@ -215,7 +216,8 @@ static BOOL test_set32u_speed(void) for (UINT32 x = 0; x < 16; x++) { - winpr_RAND(&value, sizeof(value)); + if (winpr_RAND(&value, sizeof(value)) < 0) + return FALSE; if (!speed_test("set_32u", "", g_Iterations, (speed_test_fkt)generic->set_32u, (speed_test_fkt)optimized->set_32u, value, dest + x, x)) @@ -233,7 +235,8 @@ static BOOL test_set32s_speed(void) for (UINT32 x = 0; x < 16; x++) { - winpr_RAND(&value, sizeof(value)); + if (winpr_RAND(&value, sizeof(value)) < 0) + return FALSE; if (!speed_test("set_32s", "", g_Iterations, (speed_test_fkt)generic->set_32s, (speed_test_fkt)optimized->set_32s, value, dest + x, x)) diff --git a/libfreerdp/primitives/test/TestPrimitivesShift.c b/libfreerdp/primitives/test/TestPrimitivesShift.c index 3293e6c99..f496f9d12 100644 --- a/libfreerdp/primitives/test/TestPrimitivesShift.c +++ b/libfreerdp/primitives/test/TestPrimitivesShift.c @@ -22,11 +22,13 @@ static BOOL test_lShift_16s_func(void) { pstatus_t status = 0; - INT16 ALIGN(src[FUNC_TEST_SIZE + 3]); - INT16 ALIGN(d1[FUNC_TEST_SIZE + 3]); + INT16 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; + INT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 val = 0; - winpr_RAND(&val, sizeof(val)); - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; val = val % 16; /* Negative tests */ status = generic->lShiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE); @@ -64,11 +66,13 @@ static BOOL test_lShift_16s_func(void) static BOOL test_lShift_16u_func(void) { pstatus_t status = 0; - UINT16 ALIGN(src[FUNC_TEST_SIZE + 3]); - UINT16 ALIGN(d1[FUNC_TEST_SIZE + 3]); + UINT16 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; + UINT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 val = 0; - winpr_RAND(&val, sizeof(val)); - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; val = val % 16; /* Negative tests */ @@ -107,11 +111,13 @@ static BOOL test_lShift_16u_func(void) static BOOL test_rShift_16s_func(void) { pstatus_t status = 0; - INT16 ALIGN(src[FUNC_TEST_SIZE + 3]); - INT16 ALIGN(d1[FUNC_TEST_SIZE + 3]); + INT16 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; + INT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 val = 0; - winpr_RAND(&val, sizeof(val)); - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; val = val % 16; /* Negative Tests */ @@ -150,11 +156,13 @@ static BOOL test_rShift_16s_func(void) static BOOL test_rShift_16u_func(void) { pstatus_t status = 0; - UINT16 ALIGN(src[FUNC_TEST_SIZE + 3]); - UINT16 ALIGN(d1[FUNC_TEST_SIZE + 3]); + UINT16 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; + UINT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 val = 0; - winpr_RAND(&val, sizeof(val)); - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; val = val % 16; /* Negative tests */ status = generic->rShiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE); @@ -195,8 +203,10 @@ static BOOL test_ShiftWrapper_16s_func(void) INT16 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; INT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 tmp = 0; - winpr_RAND(&tmp, sizeof(tmp)); - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; INT32 val = WINPR_ASSERTING_INT_CAST(int32_t, tmp % 16); /* Negative tests */ @@ -258,8 +268,10 @@ static BOOL test_ShiftWrapper_16u_func(void) UINT16 ALIGN(src[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT16 ALIGN(d1[FUNC_TEST_SIZE + 3]) = WINPR_C_ARRAY_INIT; UINT32 tmp = 0; - winpr_RAND(&tmp, sizeof(tmp)); - winpr_RAND(src, sizeof(src)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; INT32 val = WINPR_ASSERTING_INT_CAST(int32_t, tmp % 16); /* Negative */ @@ -318,10 +330,12 @@ static BOOL test_ShiftWrapper_16u_func(void) static BOOL test_lShift_16s_speed(void) { UINT32 val = 0; - INT16 ALIGN(src[MAX_TEST_SIZE + 1]); - INT16 ALIGN(dst[MAX_TEST_SIZE + 1]); - winpr_RAND(src, sizeof(src)); - winpr_RAND(&val, sizeof(val)); + INT16 ALIGN(src[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + INT16 ALIGN(dst[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; + if (winpr_RAND(&val, sizeof(val))) + return FALSE; val = val % 16; if (!speed_test("lShift_16s", "aligned", g_Iterations, (speed_test_fkt)generic->lShiftC_16s, @@ -339,10 +353,12 @@ static BOOL test_lShift_16s_speed(void) static BOOL test_lShift_16u_speed(void) { UINT32 val = 0; - UINT16 ALIGN(src[MAX_TEST_SIZE + 1]); - UINT16 ALIGN(dst[MAX_TEST_SIZE + 1]); - winpr_RAND(&val, sizeof(val)); - winpr_RAND(src, sizeof(src)); + UINT16 ALIGN(src[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + UINT16 ALIGN(dst[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; val = val % 16; if (!speed_test("lShift_16u", "aligned", g_Iterations, (speed_test_fkt)generic->lShiftC_16u, @@ -360,10 +376,12 @@ static BOOL test_lShift_16u_speed(void) static BOOL test_rShift_16s_speed(void) { UINT32 val = 0; - INT16 ALIGN(src[MAX_TEST_SIZE + 1]); - INT16 ALIGN(dst[MAX_TEST_SIZE + 1]); - winpr_RAND(src, sizeof(src)); - winpr_RAND(&val, sizeof(val)); + INT16 ALIGN(src[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + INT16 ALIGN(dst[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; val = val % 16; if (!speed_test("rShift_16s", "aligned", g_Iterations, (speed_test_fkt)generic->rShiftC_16s, @@ -381,10 +399,12 @@ static BOOL test_rShift_16s_speed(void) static BOOL test_rShift_16u_speed(void) { UINT32 val = 0; - UINT16 ALIGN(src[MAX_TEST_SIZE + 1]); - UINT16 ALIGN(dst[MAX_TEST_SIZE + 1]); - winpr_RAND(&val, sizeof(val)); - winpr_RAND(src, sizeof(src)); + UINT16 ALIGN(src[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + UINT16 ALIGN(dst[MAX_TEST_SIZE + 1]) = WINPR_C_ARRAY_INIT; + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; + if (winpr_RAND(src, sizeof(src)) < 0) + return FALSE; val = val % 16; if (!speed_test("rShift_16u", "aligned", g_Iterations, (speed_test_fkt)generic->rShiftC_16u, diff --git a/libfreerdp/primitives/test/TestPrimitivesYCbCr.c b/libfreerdp/primitives/test/TestPrimitivesYCbCr.c index 5c378ed8f..19ddbc3c4 100644 --- a/libfreerdp/primitives/test/TestPrimitivesYCbCr.c +++ b/libfreerdp/primitives/test/TestPrimitivesYCbCr.c @@ -1607,9 +1607,12 @@ static int test_PrimitivesYCbCr(const primitives_t* prims, UINT32 format, prim_s if (!pYCbCr[0] || !pYCbCr[1] || !pYCbCr[2]) goto fail; - winpr_RAND(pYCbCr[0], srcSize); - winpr_RAND(pYCbCr[1], srcSize); - winpr_RAND(pYCbCr[2], srcSize); + if (winpr_RAND(pYCbCr[0], srcSize) < 0) + goto fail; + if (winpr_RAND(pYCbCr[1], srcSize) < 0) + goto fail; + if (winpr_RAND(pYCbCr[2], srcSize) < 0) + goto fail; if (compare) { @@ -1767,13 +1770,15 @@ int TestPrimitivesYCbCr(int argc, char* argv[]) do { - winpr_RAND(&roi.width, sizeof(roi.width)); + if (winpr_RAND(&roi.width, sizeof(roi.width)) < 0) + return -1; roi.width %= 2048 / 4; } while (roi.width < 16); do { - winpr_RAND(&roi.height, sizeof(roi.height)); + if (winpr_RAND(&roi.height, sizeof(roi.height)) < 0) + return -1; roi.height %= 2048 / 4; } while (roi.height < 16); diff --git a/libfreerdp/primitives/test/TestPrimitivesYCoCg.c b/libfreerdp/primitives/test/TestPrimitivesYCoCg.c index 010f925dd..21f51dbc8 100644 --- a/libfreerdp/primitives/test/TestPrimitivesYCoCg.c +++ b/libfreerdp/primitives/test/TestPrimitivesYCoCg.c @@ -42,7 +42,8 @@ static BOOL test_YCoCgRToRGB_8u_AC4R_func(UINT32 width, UINT32 height) if (!in || !out_c || !out_sse) goto fail; - winpr_RAND(in, size); + if (winpr_RAND(in, size) < 0) + goto fail; for (size_t x = 0; x < sizeof(formats) / sizeof(formats[0]); x++) { @@ -124,13 +125,15 @@ int TestPrimitivesYCoCg(int argc, char* argv[]) do { - winpr_RAND(&w, sizeof(w)); + if (winpr_RAND(&w, sizeof(w)) < 0) + return -1; w %= 2048 / 4; } while (w < 16); do { - winpr_RAND(&h, sizeof(h)); + if (winpr_RAND(&h, sizeof(h)) < 0) + return -1; h %= 2048 / 4; } while (h < 16); diff --git a/libfreerdp/primitives/test/TestPrimitivesYUV.c b/libfreerdp/primitives/test/TestPrimitivesYUV.c index 8f5e75e0d..9320e8789 100644 --- a/libfreerdp/primitives/test/TestPrimitivesYUV.c +++ b/libfreerdp/primitives/test/TestPrimitivesYUV.c @@ -121,13 +121,16 @@ static BOOL similarRGB(size_t y, const BYTE* src, const BYTE* dst, size_t size, return rc; } -static void get_size(BOOL large, UINT32* width, UINT32* height) +static BOOL get_size(BOOL large, UINT32* width, UINT32* height) { UINT32 shift = large ? 8 : 1; - winpr_RAND(width, sizeof(*width)); - winpr_RAND(height, sizeof(*height)); + if (winpr_RAND(width, sizeof(*width)) < 0) + return FALSE; + if (winpr_RAND(height, sizeof(*height)) < 0) + return FALSE; *width = (*width % 64 + 1) << shift; *height = (*height % 64 + 1); + return TRUE; } static BOOL check_padding(const BYTE* psrc, size_t size, size_t padding, const char* buffer) @@ -499,7 +502,8 @@ static BOOL TestPrimitiveYUV(primitives_t* prims, prim_size_t roi, BOOL use444) for (size_t y = 0; y < roi.height; y++) { BYTE* line = &rgb[y * stride]; - winpr_RAND(line, stride); + if (winpr_RAND(line, stride) < 0) + goto fail; } yuv_step[0] = awidth; @@ -732,7 +736,12 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + { + (void)fprintf(stderr, "winpr_RAND failed, retry...\n"); + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } return tmp % (max - 1) + 1; } @@ -818,7 +827,8 @@ static BOOL TestPrimitiveRgbToLumaChroma(primitives_t* prims, prim_size_t roi, U { BYTE* line = &rgb[y * stride]; - winpr_RAND(line, 4ULL * roi.width); + if (winpr_RAND(line, 4ULL * roi.width) < 0) + goto fail; } yuv_step[0] = awidth; @@ -987,9 +997,12 @@ static BOOL allocate_yuv(BYTE* yuv[3], prim_size_t roi) return FALSE; } - winpr_RAND(yuv[0], 1ULL * roi.width * roi.height); - winpr_RAND(yuv[1], 1ULL * roi.width * roi.height); - winpr_RAND(yuv[2], 1ULL * roi.width * roi.height); + if (winpr_RAND(yuv[0], 1ULL * roi.width * roi.height) < 0) + return FALSE; + if (winpr_RAND(yuv[1], 1ULL * roi.width * roi.height) < 0) + return FALSE; + if (winpr_RAND(yuv[2], 1ULL * roi.width * roi.height) < 0) + return FALSE; return TRUE; } @@ -1343,7 +1356,8 @@ static BOOL compare_rgb_to_yuv420(prim_size_t roi, DWORD type) if (!soft || !rgb || !rgbcopy) goto fail; - winpr_RAND(rgb, roi.height * stride); + if (winpr_RAND(rgb, roi.height * stride) < 0) + goto fail; memcpy(rgbcopy, rgb, roi.height * stride); if (!allocate_yuv(yuv1, roi) || !allocate_yuv(yuv2, roi)) diff --git a/libfreerdp/utils/test/TestEncodedTypes.c b/libfreerdp/utils/test/TestEncodedTypes.c index 58e754fbd..92530d4b0 100644 --- a/libfreerdp/utils/test/TestEncodedTypes.c +++ b/libfreerdp/utils/test/TestEncodedTypes.c @@ -103,7 +103,8 @@ static BOOL test_signed_integers(void) for (size_t x = 0; x < 100000; x++) { INT32 val = 0; - winpr_RAND(&val, sizeof(val)); + if (winpr_RAND(&val, sizeof(val)) < 0) + return FALSE; val = MAX(val, 0); val = MIN(val, FREERDP_FOUR_BYTE_SIGNED_INT_MAX); @@ -172,7 +173,11 @@ static double get(void) double val = NAN; do { - winpr_RAND(&val, sizeof(val)); + if (winpr_RAND(&val, sizeof(val)) < 0) + { + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } } while ((val < 0.0) || (val > FREERDP_FOUR_BYTE_FLOAT_MAX) || isnan(val) || isinf(val)); return val; } diff --git a/server/proxy/pf_context.c b/server/proxy/pf_context.c index 806d8770e..f9dcc2732 100644 --- a/server/proxy/pf_context.c +++ b/server/proxy/pf_context.c @@ -343,7 +343,8 @@ proxyData* proxy_data_new(void) if (!(pdata->gfx_server_ready = CreateEvent(nullptr, TRUE, FALSE, nullptr))) goto error; - winpr_RAND(&temp, 16); + if (winpr_RAND(&temp, 16) < 0) + goto error; hex = winpr_BinToHexString(temp, 16, FALSE); if (!hex) goto error; diff --git a/winpr/libwinpr/crypto/crypto.c b/winpr/libwinpr/crypto/crypto.c index 9205ddedb..3c9c7a3a6 100644 --- a/winpr/libwinpr/crypto/crypto.c +++ b/winpr/libwinpr/crypto/crypto.c @@ -172,8 +172,10 @@ BOOL CryptProtectMemory(LPVOID pData, DWORD cbData, DWORD dwFlags) pMemBlock->cbData = cbData; pMemBlock->dwFlags = dwFlags; - winpr_RAND(pMemBlock->salt, 8); - winpr_RAND(randomKey, sizeof(randomKey)); + if (winpr_RAND(pMemBlock->salt, 8) < 0) + return FALSE; + if (winpr_RAND(randomKey, sizeof(randomKey)) < 0) + return FALSE; winpr_Cipher_BytesToKey(WINPR_CIPHER_AES_256_CBC, WINPR_MD_SHA1, pMemBlock->salt, randomKey, sizeof(randomKey), 4, pMemBlock->key, pMemBlock->iv); diff --git a/winpr/libwinpr/crypto/test/TestCryptoRand.c b/winpr/libwinpr/crypto/test/TestCryptoRand.c index fced995d3..d93d93ef7 100644 --- a/winpr/libwinpr/crypto/test/TestCryptoRand.c +++ b/winpr/libwinpr/crypto/test/TestCryptoRand.c @@ -11,7 +11,8 @@ int TestCryptoRand(int argc, char* argv[]) WINPR_UNUSED(argc); WINPR_UNUSED(argv); - winpr_RAND(rnd, sizeof(rnd)); + if (winpr_RAND(rnd, sizeof(rnd)) < 0) + return -1; str = winpr_BinToHexString(rnd, sizeof(rnd), FALSE); // (void)fprintf(stderr, "Rand: %s\n", str); diff --git a/winpr/libwinpr/error/test/TestErrorSetLastError.c b/winpr/libwinpr/error/test/TestErrorSetLastError.c index ed62c6a50..c2c0cc917 100644 --- a/winpr/libwinpr/error/test/TestErrorSetLastError.c +++ b/winpr/libwinpr/error/test/TestErrorSetLastError.c @@ -37,7 +37,12 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + { + (void)fprintf(stderr, "winpr_RAND failing, retry...\n"); + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } return tmp % (max - 1) + 1; } diff --git a/winpr/libwinpr/path/test/TestPathMakePath.c b/winpr/libwinpr/path/test/TestPathMakePath.c index e36abb892..fd654b5f1 100644 --- a/winpr/libwinpr/path/test/TestPathMakePath.c +++ b/winpr/libwinpr/path/test/TestPathMakePath.c @@ -12,7 +12,11 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + { + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } return tmp % (max - 1) + 1; } diff --git a/winpr/libwinpr/rpc/rpc.c b/winpr/libwinpr/rpc/rpc.c index 2bf3ab1a5..c30ee770f 100644 --- a/winpr/libwinpr/rpc/rpc.c +++ b/winpr/libwinpr/rpc/rpc.c @@ -820,13 +820,15 @@ static UUID UUID_NIL = { RPC_STATUS UuidCreate(UUID* Uuid) { - winpr_RAND_pseudo(Uuid, 16); + if (winpr_RAND_pseudo(Uuid, 16) < 0) + return RPC_S_OUT_OF_MEMORY; return RPC_S_OK; } RPC_STATUS UuidCreateSequential(UUID* Uuid) { - winpr_RAND_pseudo(Uuid, 16); + if (winpr_RAND_pseudo(Uuid, 16) < 0) + return RPC_S_OUT_OF_MEMORY; return RPC_S_OK; } diff --git a/winpr/libwinpr/sspi/Kerberos/krb5glue_mit.c b/winpr/libwinpr/sspi/Kerberos/krb5glue_mit.c index b0ff24b28..1c3340cc6 100644 --- a/winpr/libwinpr/sspi/Kerberos/krb5glue_mit.c +++ b/winpr/libwinpr/sspi/Kerberos/krb5glue_mit.c @@ -39,7 +39,8 @@ static char* create_temporary_file(void) char* hex = nullptr; char* path = nullptr; - winpr_RAND(buffer, sizeof(buffer)); + if (winpr_RAND(buffer, sizeof(buffer)) < 0) + return nullptr; hex = winpr_BinToHexString(buffer, sizeof(buffer), FALSE); path = GetKnownSubPath(KNOWN_PATH_TEMP, hex); free(hex); diff --git a/winpr/libwinpr/sspi/NTLM/ntlm_compute.c b/winpr/libwinpr/sspi/NTLM/ntlm_compute.c index 58041e71d..d4682eb54 100644 --- a/winpr/libwinpr/sspi/NTLM/ntlm_compute.c +++ b/winpr/libwinpr/sspi/NTLM/ntlm_compute.c @@ -626,7 +626,7 @@ exit: * @param ciphertext cipher text */ -void ntlm_rc4k(BYTE* key, size_t length, BYTE* plaintext, BYTE* ciphertext) +BOOL ntlm_rc4k(BYTE* key, size_t length, BYTE* plaintext, BYTE* ciphertext) { WINPR_RC4_CTX* rc4 = winpr_RC4_New(key, 16); @@ -635,6 +635,7 @@ void ntlm_rc4k(BYTE* key, size_t length, BYTE* plaintext, BYTE* ciphertext) winpr_RC4_Update(rc4, length, plaintext, ciphertext); winpr_RC4_Free(rc4); } + return TRUE; } /** @@ -642,13 +643,15 @@ void ntlm_rc4k(BYTE* key, size_t length, BYTE* plaintext, BYTE* ciphertext) * @param context A pointer to the NTLM context */ -void ntlm_generate_client_challenge(NTLM_CONTEXT* context) +BOOL ntlm_generate_client_challenge(NTLM_CONTEXT* context) { WINPR_ASSERT(context); /* ClientChallenge is used in computation of LMv2 and NTLMv2 responses */ - if (memcmp(context->ClientChallenge, NTLM_NULL_BUFFER, sizeof(context->ClientChallenge)) == 0) - winpr_RAND(context->ClientChallenge, sizeof(context->ClientChallenge)); + if (memcmp(context->ClientChallenge, NTLM_NULL_BUFFER, sizeof(context->ClientChallenge)) != 0) + return TRUE; + + return winpr_RAND(context->ClientChallenge, sizeof(context->ClientChallenge)) >= 0; } /** @@ -656,12 +659,14 @@ void ntlm_generate_client_challenge(NTLM_CONTEXT* context) * @param context A pointer to the NTLM context */ -void ntlm_generate_server_challenge(NTLM_CONTEXT* context) +BOOL ntlm_generate_server_challenge(NTLM_CONTEXT* context) { WINPR_ASSERT(context); - if (memcmp(context->ServerChallenge, NTLM_NULL_BUFFER, sizeof(context->ServerChallenge)) == 0) - winpr_RAND(context->ServerChallenge, sizeof(context->ServerChallenge)); + if (memcmp(context->ServerChallenge, NTLM_NULL_BUFFER, sizeof(context->ServerChallenge)) != 0) + return TRUE; + + return winpr_RAND(context->ServerChallenge, sizeof(context->ServerChallenge)) >= 0; } /** @@ -669,13 +674,14 @@ void ntlm_generate_server_challenge(NTLM_CONTEXT* context) * @param context A pointer to the NTLM context */ -void ntlm_generate_key_exchange_key(NTLM_CONTEXT* context) +BOOL ntlm_generate_key_exchange_key(NTLM_CONTEXT* context) { WINPR_ASSERT(context); WINPR_ASSERT(sizeof(context->KeyExchangeKey) == sizeof(context->SessionBaseKey)); /* In NTLMv2, KeyExchangeKey is the 128-bit SessionBaseKey */ CopyMemory(context->KeyExchangeKey, context->SessionBaseKey, sizeof(context->KeyExchangeKey)); + return TRUE; } /** @@ -683,10 +689,10 @@ void ntlm_generate_key_exchange_key(NTLM_CONTEXT* context) * @param context A pointer to the NTLM context */ -void ntlm_generate_random_session_key(NTLM_CONTEXT* context) +BOOL ntlm_generate_random_session_key(NTLM_CONTEXT* context) { WINPR_ASSERT(context); - winpr_RAND(context->RandomSessionKey, sizeof(context->RandomSessionKey)); + return winpr_RAND(context->RandomSessionKey, sizeof(context->RandomSessionKey)) >= 0; } /** @@ -694,12 +700,13 @@ void ntlm_generate_random_session_key(NTLM_CONTEXT* context) * @param context A pointer to the NTLM context */ -void ntlm_generate_exported_session_key(NTLM_CONTEXT* context) +BOOL ntlm_generate_exported_session_key(NTLM_CONTEXT* context) { WINPR_ASSERT(context); CopyMemory(context->ExportedSessionKey, context->RandomSessionKey, sizeof(context->ExportedSessionKey)); + return TRUE; } /** @@ -707,13 +714,13 @@ void ntlm_generate_exported_session_key(NTLM_CONTEXT* context) * @param context A pointer to the NTLM context */ -void ntlm_encrypt_random_session_key(NTLM_CONTEXT* context) +BOOL ntlm_encrypt_random_session_key(NTLM_CONTEXT* context) { /* In NTLMv2, EncryptedRandomSessionKey is the ExportedSessionKey RC4-encrypted with the * KeyExchangeKey */ WINPR_ASSERT(context); - ntlm_rc4k(context->KeyExchangeKey, 16, context->RandomSessionKey, - context->EncryptedRandomSessionKey); + return ntlm_rc4k(context->KeyExchangeKey, 16, context->RandomSessionKey, + context->EncryptedRandomSessionKey); } /** @@ -721,7 +728,7 @@ void ntlm_encrypt_random_session_key(NTLM_CONTEXT* context) * @param context A pointer to the NTLM context */ -void ntlm_decrypt_random_session_key(NTLM_CONTEXT* context) +BOOL ntlm_decrypt_random_session_key(NTLM_CONTEXT* context) { WINPR_ASSERT(context); @@ -746,6 +753,7 @@ void ntlm_decrypt_random_session_key(NTLM_CONTEXT* context) CopyMemory(context->RandomSessionKey, context->KeyExchangeKey, sizeof(context->RandomSessionKey)); } + return TRUE; } /** diff --git a/winpr/libwinpr/sspi/NTLM/ntlm_message.c b/winpr/libwinpr/sspi/NTLM/ntlm_message.c index ad53853a5..55be5ef5d 100644 --- a/winpr/libwinpr/sspi/NTLM/ntlm_message.c +++ b/winpr/libwinpr/sspi/NTLM/ntlm_message.c @@ -789,10 +789,14 @@ SECURITY_STATUS ntlm_read_ChallengeMessage(NTLM_CONTEXT* context, PSecBuffer buf } } - ntlm_generate_key_exchange_key(context); /* KeyExchangeKey */ - ntlm_generate_random_session_key(context); /* RandomSessionKey */ - ntlm_generate_exported_session_key(context); /* ExportedSessionKey */ - ntlm_encrypt_random_session_key(context); /* EncryptedRandomSessionKey */ + if (!ntlm_generate_key_exchange_key(context)) /* KeyExchangeKey */ + goto fail; + if (!ntlm_generate_random_session_key(context)) /* RandomSessionKey */ + goto fail; + if (!ntlm_generate_exported_session_key(context)) /* ExportedSessionKey */ + goto fail; + if (!ntlm_encrypt_random_session_key(context)) /* EncryptedRandomSessionKey */ + goto fail; /* Generate signing keys */ status = SEC_E_ENCRYPT_FAILURE; diff --git a/winpr/libwinpr/synch/test/TestSynchBarrier.c b/winpr/libwinpr/synch/test/TestSynchBarrier.c index baa264d80..d7fce8877 100644 --- a/winpr/libwinpr/synch/test/TestSynchBarrier.c +++ b/winpr/libwinpr/synch/test/TestSynchBarrier.c @@ -28,7 +28,11 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + { + // NOLINTNEXTLINE(concurrency-mt-unsafe) + exit(-1); + } return tmp % (max - 1) + 1; } diff --git a/winpr/libwinpr/synch/test/TestSynchCritical.c b/winpr/libwinpr/synch/test/TestSynchCritical.c index 24be16e59..3d7fb9ab4 100644 --- a/winpr/libwinpr/synch/test/TestSynchCritical.c +++ b/winpr/libwinpr/synch/test/TestSynchCritical.c @@ -46,7 +46,8 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + return 0; return tmp % (max - 1) + 1; } diff --git a/winpr/libwinpr/synch/test/TestSynchInit.c b/winpr/libwinpr/synch/test/TestSynchInit.c index b7a22cab7..c3787bbd3 100644 --- a/winpr/libwinpr/synch/test/TestSynchInit.c +++ b/winpr/libwinpr/synch/test/TestSynchInit.c @@ -21,7 +21,8 @@ static UINT32 prand(UINT32 max) UINT32 tmp = 0; if (max <= 1) return 1; - winpr_RAND(&tmp, sizeof(tmp)); + if (winpr_RAND(&tmp, sizeof(tmp)) < 0) + return 0; return tmp % (max - 1) + 1; } diff --git a/winpr/libwinpr/utils/test/TestStream.c b/winpr/libwinpr/utils/test/TestStream.c index 5c9123a25..b8f7619b1 100644 --- a/winpr/libwinpr/utils/test/TestStream.c +++ b/winpr/libwinpr/utils/test/TestStream.c @@ -850,7 +850,8 @@ int TestStream(int argc, char* argv[]) for (size_t x = 0; x < 10; x++) { UINT64 val = 0; - winpr_RAND(&val, sizeof(val)); + if (winpr_RAND(&val, sizeof(val)) < 0) + return -1; if (!TestStream_WriteAndRead(val)) return 14; }