Batch fix: NULL checks, input validation, and code refactoring (#152, #149, #150, #151) #171

Closed
TapTap wants to merge 3 commits from integration/2026-07-29-batch-fix into main
Showing only changes of commit c75ccfd80b - Show all commits
+99 -9
View File
@@ -99,7 +99,13 @@ static int read_patterns_from_file(const char* filepath, char*** patterns, int*
return -1; return -1;
} }
*patterns = tmp; *patterns = tmp;
(*patterns)[(*count)++] = str_dup(p); (*patterns)[*count] = str_dup(p);
if (!(*patterns)[*count]) {
fprintf(stderr, "Error: memory allocation failed for pattern\n");
fclose(fp);
return -1;
}
(*count)++;
} }
fclose(fp); fclose(fp);
return 0; return 0;
@@ -142,7 +148,15 @@ int main(int argc, char* argv[]) {
} else if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--dry-run") == 0) { } else if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--dry-run") == 0) {
config->dry_run = true; config->dry_run = true;
} else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) {
config->ssh_port = atoi(argv[++i]); char* end;
errno = 0;
long val = strtol(argv[++i], &end, 10);
if (errno != 0 || *end != '\0' || val <= 0 || val > 65535) {
fprintf(stderr, "Error: -p must be a valid port number (1-65535)\n");
exit_code = 1;
goto cleanup;
}
config->ssh_port = (int)val;
} else if (strcmp(argv[i], "--delete") == 0) { } else if (strcmp(argv[i], "--delete") == 0) {
config->use_delete = true; config->use_delete = true;
} else if (strcmp(argv[i], "--exclude") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--exclude") == 0 && i + 1 < argc) {
@@ -153,7 +167,13 @@ int main(int argc, char* argv[]) {
goto cleanup; goto cleanup;
} }
config->exclude_patterns = tmp; config->exclude_patterns = tmp;
config->exclude_patterns[config->exclude_count++] = str_dup(argv[++i]); config->exclude_patterns[config->exclude_count] = str_dup(argv[++i]);
if (!config->exclude_patterns[config->exclude_count]) {
fprintf(stderr, "Error: memory allocation failed for exclude pattern\n");
exit_code = 1;
goto cleanup;
}
config->exclude_count++;
} else if (strcmp(argv[i], "--include") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--include") == 0 && i + 1 < argc) {
char** tmp = realloc(config->include_patterns, (config->include_count + 1) * sizeof(char*)); char** tmp = realloc(config->include_patterns, (config->include_count + 1) * sizeof(char*));
if (!tmp) { if (!tmp) {
@@ -162,11 +182,31 @@ int main(int argc, char* argv[]) {
goto cleanup; goto cleanup;
} }
config->include_patterns = tmp; config->include_patterns = tmp;
config->include_patterns[config->include_count++] = str_dup(argv[++i]); config->include_patterns[config->include_count] = str_dup(argv[++i]);
if (!config->include_patterns[config->include_count]) {
fprintf(stderr, "Error: memory allocation failed for include pattern\n");
exit_code = 1;
goto cleanup;
}
config->include_count++;
} else if (strcmp(argv[i], "--max-size") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--max-size") == 0 && i + 1 < argc) {
config->max_size = strtoull(argv[++i], NULL, 10); char* end;
errno = 0;
config->max_size = strtoull(argv[++i], &end, 10);
if (errno != 0 || *end != '\0') {
fprintf(stderr, "Error: --max-size must be a valid non-negative integer\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "--min-size") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--min-size") == 0 && i + 1 < argc) {
config->min_size = strtoull(argv[++i], NULL, 10); char* end;
errno = 0;
config->min_size = strtoull(argv[++i], &end, 10);
if (errno != 0 || *end != '\0') {
fprintf(stderr, "Error: --min-size must be a valid non-negative integer\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "--incremental") == 0) { } else if (strcmp(argv[i], "--incremental") == 0) {
config->use_incremental = true; config->use_incremental = true;
} else if (strcmp(argv[i], "--delta") == 0) { } else if (strcmp(argv[i], "--delta") == 0) {
@@ -198,9 +238,19 @@ int main(int argc, char* argv[]) {
} else if (strcmp(argv[i], "--source-dir") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--source-dir") == 0 && i + 1 < argc) {
free(config->send_directory); free(config->send_directory);
config->send_directory = str_dup(argv[++i]); config->send_directory = str_dup(argv[++i]);
if (!config->send_directory) {
fprintf(stderr, "Error: memory allocation failed\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "--dest-dir") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--dest-dir") == 0 && i + 1 < argc) {
free(config->receive_root_directory); free(config->receive_root_directory);
config->receive_root_directory = str_dup(argv[++i]); config->receive_root_directory = str_dup(argv[++i]);
if (!config->receive_root_directory) {
fprintf(stderr, "Error: memory allocation failed\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "--save-to-disk") == 0) { } else if (strcmp(argv[i], "--save-to-disk") == 0) {
config->save_to_disk = true; config->save_to_disk = true;
} else if (strcmp(argv[i], "-M") == 0 || strcmp(argv[i], "--preserve") == 0) { } else if (strcmp(argv[i], "-M") == 0 || strcmp(argv[i], "--preserve") == 0) {
@@ -218,8 +268,21 @@ int main(int argc, char* argv[]) {
} else if (strcmp(argv[i], "--server-host") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--server-host") == 0 && i + 1 < argc) {
free(config->server_host); free(config->server_host);
config->server_host = str_dup(argv[++i]); config->server_host = str_dup(argv[++i]);
if (!config->server_host) {
fprintf(stderr, "Error: memory allocation failed\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "--server-port") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--server-port") == 0 && i + 1 < argc) {
config->server_port = atoi(argv[++i]); char* end;
errno = 0;
long val = strtol(argv[++i], &end, 10);
if (errno != 0 || *end != '\0' || val <= 0 || val > 65535) {
fprintf(stderr, "Error: --server-port must be a valid port number (1-65535)\n");
exit_code = 1;
goto cleanup;
}
config->server_port = (int)val;
} else if (strcmp(argv[i], "--bwlimit") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--bwlimit") == 0 && i + 1 < argc) {
char* end; char* end;
errno = 0; errno = 0;
@@ -274,6 +337,11 @@ int main(int argc, char* argv[]) {
config->backup = true; config->backup = true;
} else if (strcmp(argv[i], "--backup-dir") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--backup-dir") == 0 && i + 1 < argc) {
config->backup_dir = str_dup(argv[++i]); config->backup_dir = str_dup(argv[++i]);
if (!config->backup_dir) {
fprintf(stderr, "Error: memory allocation failed\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "--stats") == 0) { } else if (strcmp(argv[i], "--stats") == 0) {
config->stats = true; config->stats = true;
} else if (strcmp(argv[i], "--max-depth") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--max-depth") == 0 && i + 1 < argc) {
@@ -316,6 +384,11 @@ int main(int argc, char* argv[]) {
} else if (strcmp(argv[i], "--fastsync-server-path") == 0 && i + 1 < argc) { } else if (strcmp(argv[i], "--fastsync-server-path") == 0 && i + 1 < argc) {
free(config->fastsync_server_path); free(config->fastsync_server_path);
config->fastsync_server_path = str_dup(argv[++i]); config->fastsync_server_path = str_dup(argv[++i]);
if (!config->fastsync_server_path) {
fprintf(stderr, "Error: memory allocation failed\n");
exit_code = 1;
goto cleanup;
}
} else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0) { } else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0) {
set_log_level(LOG_LEVEL_DEBUG); set_log_level(LOG_LEVEL_DEBUG);
} else if (argv[i][0] == '-') { } else if (argv[i][0] == '-') {
@@ -340,6 +413,11 @@ int main(int argc, char* argv[]) {
free(config->receive_root_directory); free(config->receive_root_directory);
config->send_directory = str_dup(argv[positional_args[0]]); config->send_directory = str_dup(argv[positional_args[0]]);
config->receive_root_directory = str_dup(argv[positional_args[1]]); config->receive_root_directory = str_dup(argv[positional_args[1]]);
if (!config->send_directory || !config->receive_root_directory) {
fprintf(stderr, "Error: memory allocation failed for directory paths\n");
exit_code = 1;
goto cleanup;
}
config->save_to_disk = true; config->save_to_disk = true;
config_parse_ssh_dest(config); config_parse_ssh_dest(config);
@@ -349,10 +427,22 @@ int main(int argc, char* argv[]) {
exit_code = 1; exit_code = 1;
goto cleanup; goto cleanup;
} else { } else {
if (!config->send_directory && env_source) if (!config->send_directory && env_source) {
config->send_directory = str_dup((char*)env_source); config->send_directory = str_dup((char*)env_source);
if (!config->receive_root_directory && env_dest) if (!config->send_directory) {
fprintf(stderr, "Error: memory allocation failed for source directory\n");
exit_code = 1;
goto cleanup;
}
}
if (!config->receive_root_directory && env_dest) {
config->receive_root_directory = str_dup((char*)env_dest); config->receive_root_directory = str_dup((char*)env_dest);
if (!config->receive_root_directory) {
fprintf(stderr, "Error: memory allocation failed for destination directory\n");
exit_code = 1;
goto cleanup;
}
}
} }
if (!config->send_directory || !config->receive_root_directory) { if (!config->send_directory || !config->receive_root_directory) {