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
+40 -12
View File
@@ -1,4 +1,5 @@
#include "transport_ssh.h"
#include "utils.h"
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
@@ -8,39 +9,58 @@
#include <unistd.h>
typedef struct {
char user[256];
char host[256];
char remote_path[4096];
char* user;
char* host;
char* remote_path;
} RemoteDest;
static void remote_dest_destroy(RemoteDest* r) {
free(r->user);
free(r->host);
free(r->remote_path);
}
static int parse_remote_dest(const char* dest, RemoteDest* r) {
memset(r, 0, sizeof(*r));
const char* colon = strchr(dest, ':');
if (!colon)
return -1;
size_t remote_path_len = strlen(colon + 1);
if (remote_path_len >= sizeof(r->remote_path))
r->remote_path = str_dup(colon + 1);
if (!r->remote_path)
return -1;
memcpy(r->remote_path, colon + 1, remote_path_len + 1);
const char* at = memchr(dest, '@', colon - dest);
if (at) {
size_t user_len = at - dest;
if (user_len >= sizeof(r->user))
r->user = malloc(user_len + 1);
if (!r->user) {
remote_dest_destroy(r);
return -1;
}
memcpy(r->user, dest, user_len);
r->user[user_len] = '\0';
size_t host_len = colon - at - 1;
if (host_len >= sizeof(r->host))
r->host = malloc(host_len + 1);
if (!r->host) {
remote_dest_destroy(r);
return -1;
}
memcpy(r->host, at + 1, host_len);
r->host[host_len] = '\0';
} else {
r->user[0] = '\0';
size_t host_len = colon - dest;
if (host_len >= sizeof(r->host))
r->user = str_dup("");
if (!r->user) {
remote_dest_destroy(r);
return -1;
}
size_t host_len = colon - dest;
r->host = malloc(host_len + 1);
if (!r->host) {
remote_dest_destroy(r);
return -1;
}
memcpy(r->host, dest, host_len);
r->host[host_len] = '\0';
}
@@ -57,6 +77,7 @@ Client* client_connect_ssh(const char* destination, int port) {
int sv[2];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0) {
perror("socketpair failed");
remote_dest_destroy(&r);
return NULL;
}
@@ -71,6 +92,7 @@ Client* client_connect_ssh(const char* destination, int port) {
perror("pipe failed");
close(sv[0]);
close(sv[1]);
remote_dest_destroy(&r);
return NULL;
}
@@ -81,6 +103,7 @@ Client* client_connect_ssh(const char* destination, int port) {
close(sv[1]);
close(exec_pipe[0]);
close(exec_pipe[1]);
remote_dest_destroy(&r);
return NULL;
}
@@ -88,6 +111,8 @@ Client* client_connect_ssh(const char* destination, int port) {
close(sv[0]);
close(exec_pipe[0]);
fcntl(exec_pipe[1], F_SETFD, FD_CLOEXEC);
// Child doesn't need the RemoteDest strings
remote_dest_destroy(&r);
if (sv[1] != STDIN_FILENO)
dup2(sv[1], STDIN_FILENO);
@@ -97,7 +122,7 @@ Client* client_connect_ssh(const char* destination, int port) {
close(sv[1]);
char ssh_user[512];
if (r.user[0] != '\0')
if (r.user && r.user[0] != '\0')
snprintf(ssh_user, sizeof(ssh_user), "%s@%s", r.user, r.host);
else
snprintf(ssh_user, sizeof(ssh_user), "%s", r.host);
@@ -138,10 +163,13 @@ Client* client_connect_ssh(const char* destination, int port) {
if (n > 0) {
close(sv[0]);
waitpid(pid, NULL, 0);
remote_dest_destroy(&r);
fprintf(stderr, "Error: could not launch 'fastsync-server --stdio' on remote\n");
return NULL;
}
remote_dest_destroy(&r);
Client* client = malloc(sizeof(Client));
if (client == NULL) {
close(sv[0]);