aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSlendi <slendi@socopon.com>2024-01-14 15:09:56 +0200
committerSlendi <slendi@socopon.com>2024-01-14 15:09:56 +0200
commit5b1f02799f851f630d56f4d70b455bbc15eb6b36 (patch)
tree81c4b6b6801ad003d02f9afdae1116bf4c5eca4f
parent4f37633315177d340cd7876df6c812377a178504 (diff)
Fix bug in string list iteration
Signed-off-by: Slendi <slendi@socopon.com>
-rw-r--r--cbuild_impl.c30
-rwxr-xr-xtest_project/build.c3
2 files changed, 22 insertions, 11 deletions
diff --git a/cbuild_impl.c b/cbuild_impl.c
index 99fd050..cefd00b 100644
--- a/cbuild_impl.c
+++ b/cbuild_impl.c
@@ -303,8 +303,8 @@ void build(project_t build) {
bool find_sources_in_directory(char *pattern, char *directory, char **sources) {
int strlen_directory = strlen(directory);
- char *sources_buffer = malloc(1);
- size_t sources_buffer_size = 1;
+ char *sources_buffer = NULL;
+ size_t sources_buffer_size = 0;
struct dirent *entry;
regex_t reg;
@@ -320,20 +320,30 @@ bool find_sources_in_directory(char *pattern, char *directory, char **sources) {
}
while ((entry = readdir(d))) {
if (!regexec(&reg, entry->d_name, 0, NULL, 0)) {
+ printf("found: %s\n", entry->d_name);
size_t len = strlen(entry->d_name);
- sources_buffer = realloc(sources_buffer, sources_buffer_size + len + 2 +
- strlen_directory + 1);
- strcpy(sources_buffer + sources_buffer_size - 1, directory);
- sources_buffer[sources_buffer_size + strlen_directory - 1] = '/';
- strcpy(sources_buffer + sources_buffer_size + strlen_directory,
+ size_t new_size = sources_buffer_size + len + 2 + strlen_directory + 1;
+
+ sources_buffer = realloc(sources_buffer, new_size);
+
+ if (sources_buffer == NULL) {
+ fprintf(stderr, "Memory allocation error\n");
+ closedir(d);
+ regfree(&reg);
+ return false;
+ }
+
+ strcpy(sources_buffer + sources_buffer_size, directory);
+ sources_buffer[sources_buffer_size + strlen_directory] = '/';
+ strcpy(sources_buffer + sources_buffer_size + strlen_directory + 1,
entry->d_name);
- sources_buffer[sources_buffer_size + strlen_directory + len] = '\0';
- sources_buffer[sources_buffer_size + strlen_directory + len + 1] = '\0';
- sources_buffer_size += len + 2 + strlen_directory + 1;
+
+ sources_buffer_size = new_size;
}
}
closedir(d);
regfree(&reg);
+
*sources = sources_buffer;
return true;
}
diff --git a/test_project/build.c b/test_project/build.c
index 0a8433e..a2ff2be 100755
--- a/test_project/build.c
+++ b/test_project/build.c
@@ -15,7 +15,8 @@ int main(int argc, char **argv) {
exit(1);
}
fprintf(stderr, "Sources: \n");
- for (int offset = 0; sources[offset] != '\0'; offset += strlen(sources) + 1) {
+ for (int offset = 0; sources[offset] != '\0';
+ offset += strlen(sources + offset) + 1) {
fprintf(stderr, " - %s\n", sources + offset);
}
executable_t exe =