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
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:
+27
-12
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user