Browse Source

Fix segmentation fault (#6011)

* Fix segmentation fault

* Make system info printing safe

* Fix quotes for OS name
Vladimir Kobal 5 years ago
parent
commit
0d5fa83e22
3 changed files with 53 additions and 40 deletions
  1. 26 13
      database/rrdhost.c
  2. 14 14
      streaming/rrdpush.c
  3. 13 13
      web/api/web_api_v1.c

+ 26 - 13
database/rrdhost.c

@@ -825,19 +825,32 @@ struct rrdhost_system_info *rrdhost_system_info_dup(struct rrdhost_system_info *
     struct rrdhost_system_info *ret = callocz(1, sizeof(struct rrdhost_system_info));
 
     if(likely(system_info)) {
-        ret->os_name = strdupz(system_info->os_name);
-        ret->os_id = strdupz(system_info->os_id);
-        ret->os_id_like = strdupz(system_info->os_id_like);
-        ret->os_version = strdupz(system_info->os_version);
-        ret->os_version_id = strdupz(system_info->os_version_id);
-        ret->os_detection = strdupz(system_info->os_detection);
-        ret->kernel_name = strdupz(system_info->kernel_name);
-        ret->kernel_version = strdupz(system_info->kernel_version);
-        ret->architecture = strdupz(system_info->architecture);
-        ret->virtualization = strdupz(system_info->virtualization);
-        ret->virt_detection = strdupz(system_info->virt_detection);
-        ret->container = strdupz(system_info->container);
-        ret->container_detection = strdupz(system_info->container_detection);
+        if(system_info->os_name)
+            ret->os_name = strdupz(system_info->os_name);
+        if(system_info->os_id)
+            ret->os_id = strdupz(system_info->os_id);
+        if(system_info->os_id_like)
+            ret->os_id_like = strdupz(system_info->os_id_like);
+        if(system_info->os_version)
+            ret->os_version = strdupz(system_info->os_version);
+        if(system_info->os_version_id)
+            ret->os_version_id = strdupz(system_info->os_version_id);
+        if(system_info->os_detection)
+            ret->os_detection = strdupz(system_info->os_detection);
+        if(system_info->kernel_name)
+            ret->kernel_name = strdupz(system_info->kernel_name);
+        if(system_info->kernel_version)
+            ret->kernel_version = strdupz(system_info->kernel_version);
+        if(system_info->architecture)
+            ret->architecture = strdupz(system_info->architecture);
+        if(system_info->virtualization)
+            ret->virtualization = strdupz(system_info->virtualization);
+        if(system_info->virt_detection)
+            ret->virt_detection = strdupz(system_info->virt_detection);
+        if(system_info->container)
+            ret->container = strdupz(system_info->container);
+        if(system_info->container_detection)
+            ret->container_detection = strdupz(system_info->container_detection);
     }
 
     return ret;

+ 14 - 14
streaming/rrdpush.c

@@ -469,20 +469,20 @@ static int rrdpush_sender_thread_connect_to_master(RRDHOST *host, int default_po
               , default_rrd_update_every
               , host->os
               , host->timezone
-              , (host->tags)?host->tags:""
-              , host->system_info->os_name
-              , host->system_info->os_id
-              , host->system_info->os_id_like
-              , host->system_info->os_version
-              , host->system_info->os_version_id
-              , host->system_info->os_detection
-              , host->system_info->kernel_name
-              , host->system_info->kernel_version
-              , host->system_info->architecture
-              , host->system_info->virtualization
-              , host->system_info->virt_detection
-              , host->system_info->container
-              , host->system_info->container_detection
+              , (host->tags) ? host->tags : ""
+              , (host->system_info->os_name) ? host->system_info->os_name : ""
+              , (host->system_info->os_id) ? host->system_info->os_id : ""
+              , (host->system_info->os_id_like) ? host->system_info->os_id_like : ""
+              , (host->system_info->os_version) ? host->system_info->os_version : ""
+              , (host->system_info->os_version_id) ? host->system_info->os_version_id : ""
+              , (host->system_info->os_detection) ? host->system_info->os_detection : ""
+              , (host->system_info->kernel_name) ? host->system_info->kernel_name : ""
+              , (host->system_info->kernel_version) ? host->system_info->kernel_version : ""
+              , (host->system_info->architecture) ? host->system_info->architecture : ""
+              , (host->system_info->virtualization) ? host->system_info->virtualization : ""
+              , (host->system_info->virt_detection) ? host->system_info->virt_detection : ""
+              , (host->system_info->container) ? host->system_info->container : ""
+              , (host->system_info->container_detection) ? host->system_info->container_detection : ""
               , host->program_name
               , host->program_version
     );

+ 13 - 13
web/api/web_api_v1.c

@@ -736,19 +736,19 @@ inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, c
     web_client_api_request_v1_info_summary_alarm_statuses(host, wb);
     buffer_strcat(wb, "\t},\n");
 
-    buffer_sprintf(wb, "\t\"os_name\": %s,\n", host->system_info->os_name);
-    buffer_sprintf(wb, "\t\"os_id\": \"%s\",\n", host->system_info->os_id);
-    buffer_sprintf(wb, "\t\"os_id_like\": \"%s\",\n", host->system_info->os_id_like);
-    buffer_sprintf(wb, "\t\"os_version\": \"%s\",\n", host->system_info->os_version);
-    buffer_sprintf(wb, "\t\"os_version_id\": \"%s\",\n", host->system_info->os_version_id);
-    buffer_sprintf(wb, "\t\"os_detection\": \"%s\",\n", host->system_info->os_detection);
-    buffer_sprintf(wb, "\t\"kernel_name\": \"%s\",\n", host->system_info->kernel_name);
-    buffer_sprintf(wb, "\t\"kernel_version\": \"%s\",\n", host->system_info->kernel_version);
-    buffer_sprintf(wb, "\t\"architecture\": \"%s\",\n", host->system_info->architecture);
-    buffer_sprintf(wb, "\t\"virtualization\": \"%s\",\n", host->system_info->virtualization);
-    buffer_sprintf(wb, "\t\"virt_detection\": \"%s\",\n", host->system_info->virt_detection);
-    buffer_sprintf(wb, "\t\"container\": \"%s\",\n", host->system_info->container);
-    buffer_sprintf(wb, "\t\"container_detection\": \"%s\",\n", host->system_info->container_detection);
+    buffer_sprintf(wb, "\t\"os_name\": %s,\n", (host->system_info->os_name) ? host->system_info->os_name : "\"\"");
+    buffer_sprintf(wb, "\t\"os_id\": \"%s\",\n", (host->system_info->os_id) ? host->system_info->os_id : "");
+    buffer_sprintf(wb, "\t\"os_id_like\": \"%s\",\n", (host->system_info->os_id_like) ? host->system_info->os_id_like : "");
+    buffer_sprintf(wb, "\t\"os_version\": \"%s\",\n", (host->system_info->os_version) ? host->system_info->os_version : "");
+    buffer_sprintf(wb, "\t\"os_version_id\": \"%s\",\n", (host->system_info->os_version_id) ? host->system_info->os_version_id : "");
+    buffer_sprintf(wb, "\t\"os_detection\": \"%s\",\n", (host->system_info->os_detection) ? host->system_info->os_detection : "");
+    buffer_sprintf(wb, "\t\"kernel_name\": \"%s\",\n", (host->system_info->kernel_name) ? host->system_info->kernel_name : "");
+    buffer_sprintf(wb, "\t\"kernel_version\": \"%s\",\n", (host->system_info->kernel_version) ? host->system_info->kernel_version : "");
+    buffer_sprintf(wb, "\t\"architecture\": \"%s\",\n", (host->system_info->architecture) ? host->system_info->architecture : "");
+    buffer_sprintf(wb, "\t\"virtualization\": \"%s\",\n", (host->system_info->virtualization) ? host->system_info->virtualization : "");
+    buffer_sprintf(wb, "\t\"virt_detection\": \"%s\",\n", (host->system_info->virt_detection) ? host->system_info->virt_detection : "");
+    buffer_sprintf(wb, "\t\"container\": \"%s\",\n", (host->system_info->container) ? host->system_info->container : "");
+    buffer_sprintf(wb, "\t\"container_detection\": \"%s\",\n", (host->system_info->container_detection) ? host->system_info->container_detection : "");
 
     buffer_strcat(wb, "\t\"collectors\": [");
     chartcollectors2json(host, wb);