]> Kevux Git Server - fll/commitdiff
Bugfix: invalid memory access and only process if not empty
authorKevin Day <thekevinday@gmail.com>
Sat, 6 Jun 2020 16:43:39 +0000 (11:43 -0500)
committerKevin Day <thekevinday@gmail.com>
Sat, 6 Jun 2020 16:43:39 +0000 (11:43 -0500)
If the path_headers is not defined, an invalid memory read was triggered.
This happens because I was only assigning path_headers variable when path_heades setting was defined but I was still attempting to copy that path regardless.

Make sure to not bother attempting any copy or compile build operations if that setting has not properties (such as build_sources_program being empty).

level_3/fake/c/private-build.c

index 8973d48dade4888c8a8260d2f08eae8686f6865d..a8d7cf7e4c40c93d373ba14c838347e6cbf5f9f6 100644 (file)
@@ -292,6 +292,13 @@ extern "C" {
       path_headers.used = directory_headers_length;
       path_headers.size = directory_headers_length + 1;
     }
+    else {
+      directory_headers[0] = 0;
+
+      path_headers.string = directory_headers;
+      path_headers.used = 0;
+      path_headers.size = directory_headers_length + 1;
+    }
 
     const f_string_static *directorys[] = {
       &data.path_build,
@@ -552,6 +559,7 @@ extern "C" {
 #ifndef _di_fake_build_libraries_shared_
   void fake_build_libraries_shared(const fake_data data, const fake_build_data data_build, const f_mode mode, const f_string_static file_stage, f_status *status) {
     if (F_status_is_error(*status) || f_file_exists(file_stage.string) == F_true) return;
+    if (!data_build.setting.build_sources_library.used) return;
 
     if (data.verbosity != fake_verbosity_quiet) {
       printf("%cCompiling shared library.%c", f_string_eol[0], f_string_eol[0]);
@@ -757,6 +765,7 @@ extern "C" {
 #ifndef _di_fake_build_libraries_static_
   void fake_build_libraries_static(const fake_data data, const fake_build_data data_build, const f_mode mode, const f_string_static file_stage, f_status *status) {
     if (F_status_is_error(*status) || f_file_exists(file_stage.string) == F_true) return;
+    if (!data_build.setting.build_sources_library.used) return;
 
     if (data.verbosity != fake_verbosity_quiet) {
       printf("%cCompiling static library.%c", f_string_eol[0], f_string_eol[0]);
@@ -1843,6 +1852,7 @@ extern "C" {
 #ifndef _di_fake_build_objects_static_
   void fake_build_objects_static(const fake_data data, const fake_build_data data_build, const f_mode mode, const f_string_static file_stage, f_status *status) {
     if (F_status_is_error(*status) || f_file_exists(file_stage.string) == F_true) return;
+    if (!data_build.setting.build_sources_library.used) return;
 
     if (data.verbosity != fake_verbosity_quiet) {
       printf("%cCompiling static objects.%c", f_string_eol[0], f_string_eol[0]);
@@ -1968,13 +1978,10 @@ extern "C" {
       }
     }
     else {
-      {
-        const f_string_static *path_sources = 0;
+      if (data_build.setting.build_sources_headers.used) {
+        const f_string_static *path_sources = &data.path_sources_c;
 
-        if (data_build.setting.build_language == fake_build_language_type_c) {
-          path_sources = &data.path_sources_c;
-        }
-        else if (data_build.setting.build_language == fake_build_language_type_cpp) {
+        if (data_build.setting.build_language == fake_build_language_type_cpp) {
           path_sources = &data.path_sources_cpp;
         }
 
@@ -1993,6 +2000,15 @@ extern "C" {
           path_headers.used = directory_headers_length;
           path_headers.size = directory_headers_length + 1;
         }
+        else {
+          memcpy(directory_headers, data.path_build_includes.string, data.path_build_includes.used);
+
+          directory_headers[directory_headers_length] = 0;
+
+          path_headers.string = directory_headers;
+          path_headers.used = directory_headers_length;
+          path_headers.size = directory_headers_length + 1;
+        }
 
         fake_build_copy(data, mode, "header files", *path_sources, path_headers, data_build.setting.build_sources_headers, stage.file_sources_headers, &status);
       }
@@ -2038,6 +2054,7 @@ extern "C" {
 #ifndef _di_fake_build_programs_shared_
   void fake_build_programs_shared(const fake_data data, const fake_build_data data_build, const f_mode mode, const f_string_static file_stage, f_status *status) {
     if (F_status_is_error(*status) || f_file_exists(file_stage.string) == F_true) return;
+    if (!data_build.setting.build_sources_program.used) return;
 
     if (data.verbosity != fake_verbosity_quiet) {
       printf("%cCompiling shared program.%c", f_string_eol[0], f_string_eol[0]);
@@ -2046,12 +2063,9 @@ extern "C" {
     f_string_dynamics arguments = f_string_dynamics_initialize;
 
     {
-      const f_string_static *path_sources = 0;
+      const f_string_static *path_sources = &data.path_sources_c;
 
-      if (data_build.setting.build_language == fake_build_language_type_c) {
-        path_sources = &data.path_sources_c;
-      }
-      else if (data_build.setting.build_language == fake_build_language_type_cpp) {
+      if (data_build.setting.build_language == fake_build_language_type_cpp) {
         path_sources = &data.path_sources_cpp;
       }
 
@@ -2131,6 +2145,7 @@ extern "C" {
 #ifndef _di_fake_build_programs_static_
   void fake_build_programs_static(const fake_data data, const fake_build_data data_build, const f_mode mode, const f_string_static file_stage, f_status *status) {
     if (F_status_is_error(*status) || f_file_exists(file_stage.string) == F_true) return;
+    if (!data_build.setting.build_sources_program.used) return;
 
     if (data.verbosity != fake_verbosity_quiet) {
       printf("%cCompiling static program.%c", f_string_eol[0], f_string_eol[0]);
@@ -2139,18 +2154,17 @@ extern "C" {
     f_string_dynamics arguments = f_string_dynamics_initialize;
 
     {
-      const f_string_static *path_sources = 0;
+      const f_string_static *path_sources = &data.path_sources_c;
 
-      if (data_build.setting.build_language == fake_build_language_type_c) {
-        path_sources = &data.path_sources_c;
-      }
-      else if (data_build.setting.build_language == fake_build_language_type_cpp) {
+      if (data_build.setting.build_language == fake_build_language_type_cpp) {
         path_sources = &data.path_sources_cpp;
       }
 
       f_string_length source_length = 0;
 
       for (f_array_length i = 0; i < data_build.setting.build_sources_program.used; i++) {
+        if (!data_build.setting.build_sources_program.array[i].used) continue;
+
         source_length = path_sources->used + data_build.setting.build_sources_program.array[i].used;
 
         char source[source_length + 1];