fix(d5-daemon-core): cppcheck const-correctness, wire module length cap, daemonize chdir/umask, daemon confinement tests

- daemon_conf.c/server.c/test_daemon_conf.c: const-qualify parse/loop pointers;
  scope user_path static inside its block (clears the 9-wave-A cppcheck findings)
- config.c receive_daemon_module: reject invalid/over-long wire module names
  (> DAEMON_MAX_MODULE_NAME) with a clean STATUS_ERROR; client side already
  enforced via daemon_module_name_valid in config_parse_daemon_dest
- server.c daemonize: chdir(/) and umask(0) so module paths resolve from /
  and config-requested file modes are honored; PROTOCOL_VERSION stays 2.15.0
- test_daemon.py: confinement (read-only/unknown no-write anywhere), module-less
  and dot-dot destination refusal, real daemon_detach double-fork path
This commit is contained in:
2026-09-09 18:30:52 +02:00
parent b3d7d64347
commit 7c55409a6b
6 changed files with 127 additions and 11 deletions
+6 -5
View File
@@ -148,7 +148,7 @@ static void test_daemon_conf_unknown_key_rejected() {
char* path;
char err[256];
EXPECT_EQ_INT(write_conf("bogus_key = 1\n", &path), 0);
DaemonConf* conf = daemon_conf_load(path, err, sizeof(err));
const DaemonConf* conf = daemon_conf_load(path, err, sizeof(err));
free(path);
EXPECT_NULL(conf);
EXPECT_TRUE(strstr(err, "unknown global key") != NULL);
@@ -163,7 +163,7 @@ static void test_daemon_conf_unknown_key_rejected() {
static void test_daemon_conf_malformed_rejected() {
char* path;
char err[256];
DaemonConf* conf;
const DaemonConf* conf;
EXPECT_EQ_INT(write_conf("port 8734\n", &path), 0);
conf = daemon_conf_load(path, err, sizeof(err));
@@ -235,7 +235,7 @@ static void test_daemon_conf_duplicate_module_rejected() {
char* path;
char err[256];
EXPECT_EQ_INT(write_conf("[m]\npath = /a\n[m]\npath = /b\n", &path), 0);
DaemonConf* conf = daemon_conf_load(path, err, sizeof(err));
const DaemonConf* conf = daemon_conf_load(path, err, sizeof(err));
free(path);
EXPECT_NULL(conf);
EXPECT_TRUE(strstr(err, "duplicate module") != NULL);
@@ -249,7 +249,7 @@ static void test_daemon_conf_long_line_rejected() {
memcpy(body, "[m]\npath = /x\nport = ", 21);
body[sizeof(body) - 1] = '\0';
EXPECT_EQ_INT(write_conf(body, &path), 0);
DaemonConf* conf = daemon_conf_load(path, err, sizeof(err));
const DaemonConf* conf = daemon_conf_load(path, err, sizeof(err));
free(path);
EXPECT_NULL(conf);
EXPECT_TRUE(strstr(err, "exceeds the") != NULL);
@@ -257,7 +257,8 @@ static void test_daemon_conf_long_line_rejected() {
static void test_daemon_conf_missing_file_rejected() {
char err[256];
DaemonConf* conf = daemon_conf_load("/nonexistent/fastsync_daemon_conf_zzz", err, sizeof(err));
const DaemonConf* conf =
daemon_conf_load("/nonexistent/fastsync_daemon_conf_zzz", err, sizeof(err));
EXPECT_NULL(conf);
EXPECT_TRUE(strstr(err, "cannot open") != NULL);
}