Check revoked file writes independently of cancellation callbacks

This commit is contained in:
evgeny committed 2026-11-03 21:42:11 +01:00
1 parent 27eb0fa546
commit 33db6c909f
1 file changed
+5 -1
+5 -1
View File
@@ -866,14 +866,18 @@ static int transfer_isolation(void) {
check("FILE_TRANSFER revoke cancels B operation before callback", !transfers.pulls[1] && transfers.done[1] == 1 &&
transfers.error[1] == -2 && !receiver->file_transfer->ops);
etcp_router_set_receive_ready(receiver, ETCP_RT_ID_FILE_TRANSFER, NULL);
etcp_router_resume_receive(receiver, 112, sender->node_id, ETCP_RT_ID_FILE_TRANSFER);
REQUIRE(!send_routed(&saved, data, sizeof(data), ROUTE_CRYPTO_SIGN));
uint8_t request[49] = {FT_REQUEST}; request[1] = 0x77; memcpy(request + 17, object, 16);
uint64_t size = sizeof(bytes); memcpy(request + 33, &size, 8); saved.seq++;
unsigned lookups = transfers.lookups;
REQUIRE(!send_routed(&saved, request, sizeof(request), ROUTE_CRYPTO_SIGN));
check("revoked signed FILE_TRANSFER REQUEST never reaches lookup", transfers.lookups == lookups);
if (transfers.pulls[1]) REQUIRE(!fflush(transfers.pulls[1]->file));
struct stat state; REQUIRE(!stat(paths[1], &state));
check("revoked FILE_TRANSFER queue and late DATA cannot write destination", state.st_size == 0 && transfers.done[1] == 1);
DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "isolation revoked file bytes=%lld offset=%llu completions=%u", (long long)state.st_size,
(unsigned long long)(transfers.pulls[1] ? transfers.pulls[1]->offset : 0), transfers.done[1]);
check("revoked FILE_TRANSFER queue and late DATA cannot write destination", state.st_size == 0);
/* Та же личная копия повторяется через разрешённую A с новым transfer ID. */
if (transfers.pulls[1]) file_transfer_cancel(transfers.pulls[1]);
transfers.done[1] = 0;