Skip to content

Commit 084b205

Browse files
committed
Explicitly invoke to_hex with size to force non-strlen overload
Potentially a string view is being initialised as a char* in some situations assuming that the underlying stream is null-terminated which might be causing a crash on the CI builds but not locally.
1 parent fa223c0 commit 084b205

File tree

1 file changed

+40
-34
lines changed

1 file changed

+40
-34
lines changed

tests/test_pro_backend.cpp

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,17 @@ static bool string8_equals(string8 s8, std::string_view str) {
2020
}
2121
[[maybe_unused]] static void dump_pro_proof_to_stderr(const session_protocol_pro_proof& proof) {
2222
fprintf(stderr, "proof.version: %u\n", proof.version);
23-
fprintf(stderr, "proof.gen_index_hash: %s\n", oxenc::to_hex(proof.gen_index_hash.data).c_str());
23+
fprintf(stderr,
24+
"proof.gen_index_hash: %s\n",
25+
oxenc::to_hex(proof.gen_index_hash.data, std::end(proof.gen_index_hash.data)).c_str());
2426
fprintf(stderr,
2527
"proof.rotating_pubkey: %s\n",
26-
oxenc::to_hex(proof.rotating_pubkey.data).c_str());
28+
oxenc::to_hex(proof.rotating_pubkey.data, std::end(proof.rotating_pubkey.data))
29+
.c_str());
2730
fprintf(stderr, "proof.expiry_unix_ts_ms: %" PRIu64 "\n", proof.expiry_unix_ts_ms);
28-
fprintf(stderr, "proof.sig: %s\n", oxenc::to_hex(proof.sig.data).c_str());
31+
fprintf(stderr,
32+
"proof.sig: %s\n",
33+
oxenc::to_hex(proof.sig.data, std::end(proof.sig.data)).c_str());
2934
}
3035

3136
[[maybe_unused]] static void dump_pro_payment_item(
@@ -62,7 +67,9 @@ static bool string8_equals(string8 s8, std::string_view str) {
6267
[[maybe_unused]] static void dump_pro_revocation(
6368
const session_pro_backend_pro_revocation_item& item) {
6469
fprintf(stderr, "item.expiry_unix_ts: %" PRIu64 "zu\n", item.expiry_unix_ts_ms);
65-
fprintf(stderr, "item.gen_index_hash: %s\n", oxenc::to_hex(item.gen_index_hash.data).c_str());
70+
fprintf(stderr,
71+
"item.gen_index_hash: %s\n",
72+
oxenc::to_hex(item.gen_index_hash.data, std::end(item.gen_index_hash.data)).c_str());
6673
}
6774

6875
TEST_CASE("Pro Backend C API", "[pro_backend]") {
@@ -76,13 +83,13 @@ TEST_CASE("Pro Backend C API", "[pro_backend]") {
7683
crypto_sign_ed25519_keypair(rotating_pubkey.data, rotating_privkey.data);
7784

7885
{
79-
char fake_google_payment_token[8];
80-
randombytes_buf(fake_google_payment_token, sizeof(fake_google_payment_token));
86+
std::array<uint8_t, 8> fake_google_payment_token;
87+
randombytes_buf(fake_google_payment_token.data(), fake_google_payment_token.size());
8188
std::string fake_google_payment_token_hex =
8289
"DEV." + oxenc::to_hex(fake_google_payment_token);
8390

84-
char fake_google_order_id[8];
85-
randombytes_buf(fake_google_order_id, sizeof(fake_google_order_id));
91+
std::array<uint8_t, 8> fake_google_order_id;
92+
randombytes_buf(fake_google_order_id.data(), fake_google_order_id.size());
8693
std::string fake_google_order_id_hex = "DEV." + oxenc::to_hex(fake_google_order_id);
8794

8895
session_pro_backend_add_pro_payment_user_transaction payment_tx = {};
@@ -445,20 +452,18 @@ TEST_CASE("Pro Backend C API", "[pro_backend]") {
445452
}
446453

447454
SECTION("session_pro_backend_add_pro_payment_or_generate_pro_proof_response_parse") {
448-
char fake_gen_index_hash[32];
449-
randombytes_buf(fake_gen_index_hash, sizeof(fake_gen_index_hash));
455+
std::array<uint8_t, 32> fake_gen_index_hash;
456+
randombytes_buf(fake_gen_index_hash.data(), fake_gen_index_hash.size());
450457

451458
nlohmann::json j;
452459
j["status"] = SESSION_PRO_BACKEND_STATUS_SUCCESS;
453460
j["result"] = {
454461
{"version", 0},
455462
{"expiry_unix_ts_ms", unix_ts_ms},
456-
{"gen_index_hash",
457-
oxenc::to_hex(
458-
fake_gen_index_hash,
459-
fake_gen_index_hash + sizeof(fake_gen_index_hash))},
460-
{"rotating_pkey", oxenc::to_hex(rotating_pubkey.data)},
461-
{"sig", oxenc::to_hex(master_privkey.data)}};
463+
{"gen_index_hash", oxenc::to_hex(fake_gen_index_hash)},
464+
{"rotating_pkey",
465+
oxenc::to_hex(rotating_pubkey.data, std::end(rotating_pubkey.data))},
466+
{"sig", oxenc::to_hex(master_privkey.data, std::end(master_privkey.data))}};
462467
std::string json = j.dump();
463468

464469
// Valid JSON
@@ -479,8 +484,8 @@ TEST_CASE("Pro Backend C API", "[pro_backend]") {
479484
REQUIRE(result.proof.expiry_unix_ts_ms == unix_ts_ms);
480485
REQUIRE(std::memcmp(
481486
result.proof.gen_index_hash.data,
482-
fake_gen_index_hash,
483-
sizeof(fake_gen_index_hash)) == 0);
487+
fake_gen_index_hash.data(),
488+
fake_gen_index_hash.size()) == 0);
484489
REQUIRE(std::memcmp(
485490
result.proof.rotating_pubkey.data,
486491
rotating_pubkey.data,
@@ -552,13 +557,12 @@ TEST_CASE("Pro Backend C API", "[pro_backend]") {
552557
j["result"]["ticket"] = 123;
553558
j["result"]["items"] = nlohmann::json::array();
554559

555-
char fake_gen_index_hash[32];
556-
randombytes_buf(fake_gen_index_hash, sizeof(fake_gen_index_hash));
560+
std::array<uint8_t, 32> fake_gen_index_hash;
561+
randombytes_buf(fake_gen_index_hash.data(), fake_gen_index_hash.size());
557562

558563
auto obj = nlohmann::json::object();
559564
obj["expiry_unix_ts_ms"] = unix_ts_ms;
560-
obj["gen_index_hash"] = oxenc::to_hex(
561-
fake_gen_index_hash, fake_gen_index_hash + sizeof(fake_gen_index_hash));
565+
obj["gen_index_hash"] = oxenc::to_hex(fake_gen_index_hash);
562566
j["result"]["items"].push_back(obj);
563567

564568
std::string json = j.dump();
@@ -580,8 +584,8 @@ TEST_CASE("Pro Backend C API", "[pro_backend]") {
580584
REQUIRE(result.items[0].expiry_unix_ts_ms == unix_ts_ms);
581585
REQUIRE(std::memcmp(
582586
result.items[0].gen_index_hash.data,
583-
fake_gen_index_hash,
584-
sizeof(fake_gen_index_hash)) == 0);
587+
fake_gen_index_hash.data(),
588+
fake_gen_index_hash.size()) == 0);
585589
}
586590

587591
// After freeeing
@@ -913,13 +917,13 @@ TEST_CASE("Pro Backend Dev Server", "[pro_backend][dev_server]") {
913917
// Add pro payment
914918
session_protocol_pro_proof first_pro_proof = {};
915919
{
916-
char fake_google_payment_token[8];
917-
randombytes_buf(fake_google_payment_token, sizeof(fake_google_payment_token));
920+
std::array<uint8_t, 8> fake_google_payment_token;
921+
randombytes_buf(fake_google_payment_token.data(), fake_google_payment_token.size());
918922
std::string fake_google_payment_token_hex =
919923
"DEV." + oxenc::to_hex(fake_google_payment_token);
920924

921-
char fake_google_order_id[8];
922-
randombytes_buf(fake_google_order_id, sizeof(fake_google_order_id));
925+
std::array<uint8_t, 8> fake_google_order_id;
926+
randombytes_buf(fake_google_order_id.data(), fake_google_order_id.size());
923927
std::string fake_google_order_id_hex = "DEV." + oxenc::to_hex(fake_google_order_id);
924928

925929
session_pro_backend_add_pro_payment_user_transaction payment_tx = {};
@@ -981,8 +985,10 @@ TEST_CASE("Pro Backend Dev Server", "[pro_backend][dev_server]") {
981985

982986
// Verify response
983987
first_pro_proof = response.proof;
984-
INFO("Signature: " << oxenc::to_hex(first_pro_proof.sig.data) << ", backend pubkey: "
985-
<< oxenc::to_hex(DEV_BACKEND_PUBKEY) << ", response: " << response_json);
988+
INFO("Signature: " << oxenc::to_hex(
989+
first_pro_proof.sig.data, std::end(first_pro_proof.sig.data))
990+
<< ", backend pubkey: " << oxenc::to_hex(DEV_BACKEND_PUBKEY)
991+
<< ", response: " << response_json);
986992
REQUIRE(session_protocol_pro_proof_verify_signature(
987993
&first_pro_proof, DEV_BACKEND_PUBKEY.data(), DEV_BACKEND_PUBKEY.size()));
988994
REQUIRE(std::memcmp(
@@ -1154,13 +1160,13 @@ TEST_CASE("Pro Backend Dev Server", "[pro_backend][dev_server]") {
11541160
// Add _another_ payment, same details
11551161
session_pro_backend_add_pro_payment_user_transaction another_payment_tx = {};
11561162
{
1157-
char fake_google_payment_token[8];
1158-
randombytes_buf(fake_google_payment_token, sizeof(fake_google_payment_token));
1163+
std::array<uint8_t, 8> fake_google_payment_token;
1164+
randombytes_buf(fake_google_payment_token.data(), fake_google_payment_token.size());
11591165
std::string fake_google_payment_token_hex =
11601166
"DEV." + oxenc::to_hex(fake_google_payment_token);
11611167

1162-
char fake_google_order_id[8];
1163-
randombytes_buf(fake_google_order_id, sizeof(fake_google_order_id));
1168+
std::array<uint8_t, 8> fake_google_order_id;
1169+
randombytes_buf(fake_google_order_id.data(), fake_google_order_id.size());
11641170
std::string fake_google_order_id_hex = "DEV." + oxenc::to_hex(fake_google_order_id);
11651171

11661172
another_payment_tx.provider = SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE;

0 commit comments

Comments
 (0)