Fix 11 Gitea issues (#29, #30, #31, #35, #38, #41, #42, #43, #44, #45, #46)
CI / lint (push) Failing after 3s
CI / build-and-test (push) Has been skipped
CI / sanitizers (address) (push) Has been skipped
CI / clang-tidy (push) Has been skipped
CI / lint (pull_request) Failing after 2s
CI / build-and-test (pull_request) Has been skipped
CI / sanitizers (address) (pull_request) Has been skipped
CI / clang-tidy (pull_request) Has been skipped

#29 - compression_level now used in data_compress()
#30 - chunk_size no longer truncated to 32-bit
#31 - chmod/chown failures now logged
#35 - strtok -> strtok_r for thread safety
#38 - open_next_directory returns -1 on opendir failure
#41 - file_send_sendfile uses compression_level param
#42 - dirname() uses copy to avoid modifying input
#43 - delete_extras_walk checks manifest before rmdir
#44 - server_host/port moved into Config struct
#45 - SSH parse_remote_dest uses dynamic allocation
#46 - send_chunk refactored, reduced nesting/duplication
This commit is contained in:
2026-07-20 17:09:12 +02:00
parent 51a984871c
commit 38be7c090a
11 changed files with 194 additions and 92 deletions
+27 -12
View File
@@ -409,33 +409,48 @@ File* receive_incremental_check(int fd, const Config* config, bool* skipped) {
}
bool to_disk(const char* path, const void* data, unsigned long long data_size) {
char* directory = str_dup(path);
char* dir_to_free = directory;
directory = dirname(directory);
if (!mkdir_r(directory)) {
free(dir_to_free);
// dirname() may modify its argument and may return a pointer to static storage.
// We must use a copy of the result to be safe.
char* path_dup = str_dup(path);
if (!path_dup)
return false;
char* dir_result = dirname(path_dup);
char* directory = str_dup(dir_result);
free(path_dup);
if (!directory)
return false;
bool ok = true;
if (!mkdir_r(directory)) {
ok = false;
goto done;
}
FILE* file_pointer = fopen(path, "wb");
if (file_pointer == NULL) {
perror("Could not open File");
free(dir_to_free);
return false;
ok = false;
goto done;
}
if (fwrite(data, 1, data_size, file_pointer) != data_size) {
perror("Failed to write all data to disk");
fclose(file_pointer);
free(dir_to_free);
return false;
ok = false;
goto done;
}
fclose(file_pointer);
free(dir_to_free);
return true;
done:
free(directory);
return ok;
}
bool file_send_sendfile(File* file, int file_descriptor, bool use_metadata, int compression_level,
bool send_path) {
(void)compression_level;
// sendfile is incompatible with compression (kernel zero-copy).
// If compression is requested, fall back to the regular send path.
if (compression_level > 0)
return file_send_single_calls(file, file_descriptor, use_metadata, compression_level, send_path);
if (send_path && !send_str(file_descriptor, file->path))
return false;
if (use_metadata && !metadata_send(file_descriptor, file->metadata))