@cryptotaxi247 / netdata-1 / commits / ea4d075de

make status file use fixed size character arrays (#19761)

* make status file use fixed size character arrays * fix copied cause * flush the buffer before getting the stack trace * add deadly signal cause * do not overwrite version_saved

Costa Tsaousis committed Mar 4, 2025 at 08:31 UTC ea4d075de3ff0dc6195340ff78116052010ffb5d
4 files changed +141 -101
src/daemon/daemon-status-file.c
+103 -77
@@ -9,7 +9,7 @@
9 #include <openssl/pem.h>
10 #include <openssl/err.h>
11
12 -#define STATUS_FILE_VERSION 8
12 +#define STATUS_FILE_VERSION 9
13
14 #define STATUS_FILENAME "status-netdata.json"
15
@@ -38,7 +38,7 @@ ENUM_STR_MAP_DEFINE(DAEMON_OS_TYPE) = {
38 ENUM_STR_DEFINE_FUNCTIONS(DAEMON_OS_TYPE, DAEMON_OS_TYPE_UNKNOWN, "unknown");
39
40 static DAEMON_STATUS_FILE last_session_status = {
41 - .v = STATUS_FILE_VERSION,
41 + .v = 0,
42 .spinlock = SPINLOCK_INITIALIZER,
43 .fatal = {
44 .spinlock = SPINLOCK_INITIALIZER,
@@ -63,7 +63,7 @@ static void daemon_status_file_out_of_memory(void);
63
64 // these are used instead of locks when locks cannot be used (signal handler, out of memory, etc)
65 #define dsf_acquire(ds) __atomic_load_n(&(ds).v, __ATOMIC_ACQUIRE)
66 -#define dsf_release(ds) __atomic_store_n(&(ds).v, STATUS_FILE_VERSION, __ATOMIC_RELEASE)
66 +#define dsf_release(ds) __atomic_store_n(&(ds).v, (ds).v, __ATOMIC_RELEASE)
67
68 // --------------------------------------------------------------------------------------------------------------------
69 // json generation
@@ -241,7 +241,7 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *
241 JSONC_PARSE_ARRAY_OF_TXT2BITMAP_OR_ERROR_AND_RETURN(jobj, path, "ND_exit_reason", EXIT_REASON_2id_one, ds->exit_reason, error, required_v1);
242 JSONC_PARSE_TXT2UUID_OR_ERROR_AND_RETURN(jobj, path, "ND_node_id", ds->node_id.uuid, error, required_v1);
243 JSONC_PARSE_TXT2UUID_OR_ERROR_AND_RETURN(jobj, path, "ND_claim_id", ds->claim_id.uuid, error, required_v1);
244 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "ND_install_type", ds->install_type, error, required_v3);
244 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "ND_install_type", ds->install_type, error, required_v3);
245
246 JSONC_PARSE_SUBOBJECT(jobj, path, "ND_timings", error, required_v1, {
247 JSONC_PARSE_UINT64_OR_ERROR_AND_RETURN(jobj, path, "init", ds->timings.init, error, required_v1);
@@ -254,9 +254,9 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *
254
255 // Parse host object
256 JSONC_PARSE_SUBOBJECT(jobj, path, "host", error, required_v1, {
257 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "architecture", ds->architecture, error, required_v1);
258 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "virtualization", ds->virtualization, error, required_v1);
259 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "container", ds->container, error, required_v1);
257 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "architecture", ds->architecture, error, required_v1);
258 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "virtualization", ds->virtualization, error, required_v1);
259 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "container", ds->container, error, required_v1);
260 JSONC_PARSE_UINT64_OR_ERROR_AND_RETURN(jobj, path, "uptime", ds->boottime, error, required_v1);
261
262 JSONC_PARSE_SUBOBJECT(jobj, path, "boot", error, required_v1, {
@@ -286,21 +286,21 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *
286 // Parse os object
287 JSONC_PARSE_SUBOBJECT(jobj, path, "os", error, required_v1, {
288 JSONC_PARSE_TXT2ENUM_OR_ERROR_AND_RETURN(jobj, path, "type", DAEMON_OS_TYPE_2id, ds->os_type, error, required_v1);
289 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "kernel", ds->kernel_version, error, required_v1);
290 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "name", ds->os_name, error, required_v1);
291 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "version", ds->os_version, error, required_v1);
292 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "family", ds->os_id, error, required_v1);
293 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "platform", ds->os_id_like, error, required_v1);
289 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "kernel", ds->kernel_version, error, required_v1);
290 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "name", ds->os_name, error, required_v1);
291 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "version", ds->os_version, error, required_v1);
292 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "family", ds->os_id, error, required_v1);
293 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "platform", ds->os_id_like, error, required_v1);
294 });
295
296 // Parse fatal object
297 JSONC_PARSE_SUBOBJECT(jobj, path, "fatal", error, required_v1, {
298 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "filename", ds->fatal.filename, error, required_v1);
299 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "function", ds->fatal.function, error, required_v1);
300 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "message", ds->fatal.message, error, required_v1);
298 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "filename", ds->fatal.filename, error, required_v1);
299 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "function", ds->fatal.function, error, required_v1);
300 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "message", ds->fatal.message, error, required_v1);
301 JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "stack_trace", ds->fatal.stack_trace, error, required_v1);
302 JSONC_PARSE_UINT64_OR_ERROR_AND_RETURN(jobj, path, "line", ds->fatal.line, error, required_v1);
303 - JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "errno", ds->fatal.errno_str, error, required_v3);
303 + JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "errno", ds->fatal.errno_str, error, required_v3);
304 JSONC_PARSE_TXT2CHAR_OR_ERROR_AND_RETURN(jobj, path, "thread", ds->fatal.thread, error, required_v5);
305 });
306
@@ -406,22 +406,22 @@ static void daemon_status_file_refresh(DAEMON_STATUS status) {
406 session_status.node_id = last_session_status.node_id;
407 if(UUIDiszero(session_status.host_id))
408 session_status.host_id = last_session_status.host_id;
409 - if(!session_status.architecture && last_session_status.architecture)
410 - session_status.architecture = strdupz(last_session_status.architecture);
411 - if(!session_status.virtualization && last_session_status.virtualization)
412 - session_status.virtualization = strdupz(last_session_status.virtualization);
413 - if(!session_status.container && last_session_status.container)
414 - session_status.container = strdupz(last_session_status.container);
415 - if(!session_status.kernel_version && last_session_status.kernel_version)
416 - session_status.kernel_version = strdupz(last_session_status.kernel_version);
417 - if(!session_status.os_name && last_session_status.os_name)
418 - session_status.os_name = strdupz(last_session_status.os_name);
419 - if(!session_status.os_version && last_session_status.os_version)
420 - session_status.os_version = strdupz(last_session_status.os_version);
421 - if(!session_status.os_id && last_session_status.os_id)
422 - session_status.os_id = strdupz(last_session_status.os_id);
423 - if(!session_status.os_id_like && last_session_status.os_id_like)
424 - session_status.os_id_like = strdupz(last_session_status.os_id_like);
409 + if(!session_status.architecture[0] && last_session_status.architecture[0])
410 + strncpyz(session_status.architecture, last_session_status.architecture, sizeof(session_status.architecture) - 1);
411 + if(!session_status.virtualization[0] && last_session_status.virtualization[0])
412 + strncpyz(session_status.virtualization, last_session_status.virtualization, sizeof(session_status.virtualization) - 1);
413 + if(!session_status.container[0] && last_session_status.container[0])
414 + strncpyz(session_status.container, last_session_status.container, sizeof(session_status.container) - 1);
415 + if(!session_status.kernel_version[0] && last_session_status.kernel_version[0])
416 + strncpyz(session_status.kernel_version, last_session_status.kernel_version, sizeof(session_status.kernel_version) - 1);
417 + if(!session_status.os_name[0] && last_session_status.os_name[0])
418 + strncpyz(session_status.os_name, last_session_status.os_name, sizeof(session_status.os_name) - 1);
419 + if(!session_status.os_version[0] && last_session_status.os_version[0])
420 + strncpyz(session_status.os_version, last_session_status.os_version, sizeof(session_status.os_version) - 1);
421 + if(!session_status.os_id[0] && last_session_status.os_id[0])
422 + strncpyz(session_status.os_id, last_session_status.os_id, sizeof(session_status.os_id) - 1);
423 + if(!session_status.os_id_like[0] && last_session_status.os_id_like[0])
424 + strncpyz(session_status.os_id_like, last_session_status.os_id_like, sizeof(session_status.os_id_like) - 1);
425 if(!session_status.restarts)
426 session_status.restarts = last_session_status.restarts + 1;
427
@@ -432,12 +432,16 @@ static void daemon_status_file_refresh(DAEMON_STATUS status) {
432 }
433 }
434
435 - if(!session_status.install_type) {
435 + if(!session_status.install_type[0]) {
436 char *install_type = NULL, *prebuilt_arch = NULL, *prebuilt_dist = NULL;
437 get_install_type_internal(&install_type, &prebuilt_arch, &prebuilt_dist);
438 +
439 + if(install_type)
440 + strncpyz(session_status.install_type, install_type, sizeof(session_status.install_type) - 1);
441 +
442 freez(prebuilt_arch);
443 freez(prebuilt_dist);
440 - session_status.install_type = install_type;
444 + freez(install_type);
445 }
446
447 get_daemon_status_fields_from_system_info(&session_status);
@@ -513,8 +517,7 @@ static bool load_status_file(const char *filename, DAEMON_STATUS_FILE *status) {
517 return json_parse_payload_or_error(wb, error, daemon_status_file_from_json, status) == HTTP_RESP_OK;
518 }
519
516 -DAEMON_STATUS_FILE daemon_status_file_load(void) {
517 - DAEMON_STATUS_FILE status = {0};
520 +void daemon_status_file_load(DAEMON_STATUS_FILE *ds) {
521 char newest_filename[FILENAME_MAX] = "";
522 char current_filename[FILENAME_MAX];
523 time_t newest_mtime = 0, current_mtime;
@@ -536,13 +539,11 @@ DAEMON_STATUS_FILE daemon_status_file_load(void) {
539
540 // Load the newest file found
541 if(*newest_filename) {
539 - if(!load_status_file(newest_filename, &status))
542 + if(!load_status_file(newest_filename, ds))
543 nd_log(NDLS_DAEMON, NDLP_ERR, "Failed to load newest status file: %s", newest_filename);
544 }
545 else
546 nd_log(NDLS_DAEMON, NDLP_ERR, "Cannot find a status file in any location");
544 -
545 - return status;
547 }
548
549 // --------------------------------------------------------------------------------------------------------------------
@@ -818,7 +819,7 @@ void daemon_status_file_check_crash(void) {
819
820 mallocz_register_out_of_memory_cb(daemon_status_file_out_of_memory);
821
821 - last_session_status = daemon_status_file_load();
822 + daemon_status_file_load(&last_session_status);
823 daemon_status_file_update_status(DAEMON_STATUS_INITIALIZING);
824 struct log_priority pri = PRI_ALL_NORMAL;
825
@@ -843,6 +844,12 @@ void daemon_status_file_check_crash(void) {
844 if(!last_session_status.timestamp_ut)
845 dump_json = false;
846 }
847 + else if(is_deadly_signal(last_session_status.exit_reason)) {
848 + cause = "deadly signal and exit";
849 + msg = "Netdata was last stopped gracefully after receiving a deadly signal";
850 + pri = PRI_NETDATA_BUG;
851 + post_crash_report = true;
852 + }
853 else if(last_session_status.exit_reason != EXIT_REASON_NONE &&
854 !is_exit_reason_normal(last_session_status.exit_reason)) {
855 cause = "fatal and exit";
@@ -878,13 +885,19 @@ void daemon_status_file_check_crash(void) {
885 msg = "The system was abnormally powered off while Netdata was starting";
886 pri = PRI_USER_SHOULD_FIX;
887 }
888 + else if(is_deadly_signal(last_session_status.exit_reason)) {
889 + cause = "deadly signal on start";
890 + msg = "Netdata was last crashed while starting after receiving a deadly signal";
891 + pri = PRI_NETDATA_BUG;
892 + post_crash_report = true;
893 + }
894 else if (last_session_status.exit_reason & EXIT_REASON_OUT_OF_MEMORY) {
895 cause = "out of memory";
896 msg = "Netdata was last crashed while starting, because it couldn't allocate memory";
897 pri = PRI_USER_SHOULD_FIX;
898 }
899 else if (last_session_status.exit_reason & EXIT_REASON_ALREADY_RUNNING) {
887 - cause = "out of memory";
900 + cause = "already running";
901 msg = "Netdata couldn't start, because it was already running";
902 pri = PRI_USER_SHOULD_FIX;
903 }
@@ -922,7 +935,13 @@ void daemon_status_file_check_crash(void) {
935 break;
936
937 case DAEMON_STATUS_EXITING:
925 - if(last_session_status.exit_reason != EXIT_REASON_NONE &&
938 + if(is_deadly_signal(last_session_status.exit_reason)) {
939 + cause = "deadly signal on exit";
940 + msg = "Netdata was last crashed while exiting after receiving a deadly signal";
941 + pri = PRI_NETDATA_BUG;
942 + post_crash_report = true;
943 + }
944 + else if(last_session_status.exit_reason != EXIT_REASON_NONE &&
945 !is_exit_reason_normal(last_session_status.exit_reason)) {
946 cause = "fatal on exit";
947 msg = "Netdata was last killed/crashed while exiting after encountering an error";
@@ -957,6 +976,12 @@ void daemon_status_file_check_crash(void) {
976 msg = "Netdata was last crashed because it couldn't allocate memory";
977 pri = PRI_USER_SHOULD_FIX;
978 }
979 + else if(is_deadly_signal(last_session_status.exit_reason)) {
980 + cause = "deadly signal";
981 + msg = "Netdata was last crashed after receiving a deadly signal";
982 + pri = PRI_NETDATA_BUG;
983 + post_crash_report = true;
984 + }
985 else if (last_session_status.exit_reason != EXIT_REASON_NONE &&
986 !is_exit_reason_normal(last_session_status.exit_reason)) {
987 cause = "killed fatal";
@@ -1013,38 +1038,41 @@ void daemon_status_file_check_crash(void) {
1038 void daemon_status_file_register_fatal(const char *filename, const char *function, const char *message, const char *errno_str, const char *stack_trace, long line) {
1039 FUNCTION_RUN_ONCE();
1040
1016 - CLEAN_BUFFER *wb = buffer_create(0, NULL);
1017 -
1041 dsf_acquire(session_status);
1042 spinlock_lock(&session_status.fatal.spinlock);
1043
1021 - // do not check the function, because it may have a startup step in it
1022 - if(session_status.fatal.filename || session_status.fatal.message || session_status.fatal.errno_str || session_status.fatal.thread[0]) {
1023 - spinlock_unlock(&session_status.fatal.spinlock);
1024 - freez((void *)filename);
1025 - freez((void *)function);
1026 - freez((void *)message);
1027 - freez((void *)errno_str);
1028 - freez((void *)stack_trace);
1029 - return;
1030 - }
1031 -
1044 exit_initiated_add(EXIT_REASON_FATAL);
1045 strncpyz(session_status.fatal.thread, nd_thread_tag(), sizeof(session_status.fatal.thread) - 1);
1046
1035 - session_status.fatal.filename = filename;
1036 - freez((char *)session_status.fatal.function); // it may have a startup step
1037 - session_status.fatal.function = function;
1038 - session_status.fatal.message = message;
1039 - session_status.fatal.errno_str = errno_str;
1040 - strncpyz(session_status.fatal.stack_trace, stack_trace, sizeof(session_status.fatal.stack_trace) - 1);
1041 - freez((char *)stack_trace);
1042 - session_status.fatal.line = line;
1047 + if(!session_status.fatal.filename[0])
1048 + strncpyz(session_status.fatal.filename, filename, sizeof(session_status.fatal.filename) - 1);
1049 +
1050 + if(!session_status.fatal.function[0])
1051 + strncpyz(session_status.fatal.function, function, sizeof(session_status.fatal.function) - 1);
1052 +
1053 + if(!session_status.fatal.message[0])
1054 + strncpyz(session_status.fatal.message, message, sizeof(session_status.fatal.message) - 1);
1055 +
1056 + if(!session_status.fatal.errno_str[0])
1057 + strncpyz(session_status.fatal.errno_str, errno_str, sizeof(session_status.fatal.errno_str) - 1);
1058 +
1059 + if(!session_status.fatal.stack_trace[0])
1060 + strncpyz(session_status.fatal.stack_trace, stack_trace, sizeof(session_status.fatal.stack_trace) - 1);
1061 +
1062 + if(!session_status.fatal.line)
1063 + session_status.fatal.line = line;
1064
1065 spinlock_unlock(&session_status.fatal.spinlock);
1066 dsf_release(session_status);
1067
1068 + CLEAN_BUFFER *wb = buffer_create(0, NULL);
1069 daemon_status_file_save(wb, &session_status, false);
1070 +
1071 + freez((void *)filename);
1072 + freez((void *)function);
1073 + freez((void *)message);
1074 + freez((void *)errno_str);
1075 + freez((void *)stack_trace);
1076 }
1077
1078 // --------------------------------------------------------------------------------------------------------------------
@@ -1092,6 +1120,7 @@ void daemon_status_file_deadly_signal_received(EXIT_REASON reason) {
1120 daemon_status_file_save(static_save_buffer, &session_status, false);
1121
1122 if(!session_status.fatal.stack_trace[0]) {
1123 + buffer_flush(static_save_buffer);
1124 capture_stack_trace(static_save_buffer);
1125 strncpyz(session_status.fatal.stack_trace, buffer_tostring(static_save_buffer), sizeof(session_status.fatal.stack_trace) - 1);
1126 daemon_status_file_save(static_save_buffer, &session_status, false);
@@ -1110,30 +1139,27 @@ bool daemon_status_file_was_incomplete_shutdown(void) {
1139 // startup and shutdown steps
1140
1141 void daemon_status_file_startup_step(const char *step) {
1113 - if(session_status.fatal.filename)
1142 + if(session_status.fatal.filename[0])
1143 // we have a fatal logged
1144 return;
1145
1117 - freez((char *)session_status.fatal.function);
1118 - session_status.fatal.function = step ? strdupz(step) : NULL;
1146 if(step != NULL)
1120 - daemon_status_file_update_status(DAEMON_STATUS_NONE);
1147 + strncpyz(session_status.fatal.function, step, sizeof(session_status.fatal.function) - 1);
1148 + else
1149 + session_status.fatal.function[0] = '\0';
1150 +
1151 + daemon_status_file_update_status(DAEMON_STATUS_NONE);
1152 }
1153
1154 void daemon_status_file_shutdown_step(const char *step) {
1124 - if(session_status.fatal.filename)
1155 + if(session_status.fatal.filename[0])
1156 // we have a fatal logged
1157 return;
1158
1128 - freez((char *)session_status.fatal.function);
1129 - if(!step)
1130 - session_status.fatal.function = NULL;
1131 -
1132 - else {
1133 - char buf[1024];
1134 - snprintfz(buf, sizeof(buf), "shutdown(%s)", step);
1135 - session_status.fatal.function = strdupz(buf);
1136 - }
1159 + if(step != NULL)
1160 + snprintfz(session_status.fatal.function, sizeof(session_status.fatal.function), "shutdown(%s)", step);
1161 + else
1162 + session_status.fatal.function[0] = '\0';
1163
1164 daemon_status_file_update_status(DAEMON_STATUS_NONE);
1165 }
src/daemon/daemon-status-file.h
+13 -16
@@ -55,24 +55,24 @@ typedef struct daemon_status_file {
55 OS_SYSTEM_MEMORY memory;
56 OS_SYSTEM_DISK_SPACE var_cache;
57
58 - const char *install_type;
59 - const char *architecture; // ECS: host.architecture
60 - const char *virtualization;
61 - const char *container;
62 - const char *kernel_version; // ECS: os.kernel
63 - const char *os_name; // ECS: os.name
64 - const char *os_version; // ECS: os.version
65 - const char *os_id; // ECS: os.family
66 - const char *os_id_like; // ECS: os.platform
58 + char install_type[32];
59 + char architecture[32]; // ECS: host.architecture
60 + char virtualization[32];
61 + char container[32];
62 + char kernel_version[32]; // ECS: os.kernel
63 + char os_name[32]; // ECS: os.name
64 + char os_version[32]; // ECS: os.version
65 + char os_id[64]; // ECS: os.family
66 + char os_id_like[64]; // ECS: os.platform
67 bool read_system_info;
68
69 struct {
70 SPINLOCK spinlock;
71 long line;
72 - const char *filename;
73 - const char *function;
74 - const char *errno_str;
75 - const char *message;
72 + char filename[256];
73 + char function[128];
74 + char errno_str[64];
75 + char message[512];
76 char stack_trace[2048];
77 char thread[ND_THREAD_TAG_MAX + 1];
78 } fatal;
@@ -86,9 +86,6 @@ typedef struct daemon_status_file {
86 } dedup;
87 } DAEMON_STATUS_FILE;
88
89 -// loads the last status saved
90 -DAEMON_STATUS_FILE daemon_status_file_load(void);
91 -
89 // saves the current status
90 void daemon_status_file_update_status(DAEMON_STATUS status);
91 void daemon_status_file_deadly_signal_received(EXIT_REASON reason);
src/database/rrdhost-system-info.c
+24 -8
@@ -632,13 +632,29 @@ void get_daemon_status_fields_from_system_info(DAEMON_STATUS_FILE *ds) {
632 freez((char *)ds->os_id);
633 freez((char *)ds->os_id_like);
634
635 - ds->architecture = strdupz(ri->architecture ? ri->architecture : "");
636 - ds->virtualization = strdupz(ri->virtualization ? ri->virtualization : "");
637 - ds->container = strdupz(ri->container ? ri->container : "");
638 - ds->kernel_version = strdupz(ri->kernel_version ? ri->kernel_version : "");
639 - ds->os_name = strdupz(ri->host_os_name ? ri->host_os_name : "");
640 - ds->os_version = strdupz(ri->host_os_version ? ri->host_os_version : "");
641 - ds->os_id = strdupz(ri->host_os_id ? ri->host_os_id : "");
642 - ds->os_id_like = strdupz(ri->host_os_id_like ? ri->host_os_id_like : "");
635 + if(ri->architecture)
636 + strncpyz(ds->architecture, ri->architecture, sizeof(ds->architecture) - 1);
637 +
638 + if(ri->virtualization)
639 + strncpyz(ds->virtualization, ri->virtualization, sizeof(ds->virtualization) - 1);
640 +
641 + if(ri->container)
642 + strncpyz(ds->container, ri->container, sizeof(ds->container) - 1);
643 +
644 + if(ri->kernel_version)
645 + strncpyz(ds->kernel_version, ri->kernel_version, sizeof(ds->kernel_version) - 1);
646 +
647 + if(ri->host_os_name)
648 + strncpyz(ds->os_name, ri->host_os_name, sizeof(ds->os_name) - 1);
649 +
650 + if(ri->host_os_version)
651 + strncpyz(ds->os_version, ri->host_os_version, sizeof(ds->os_version) - 1);
652 +
653 + if(ri->host_os_id)
654 + strncpyz(ds->os_id, ri->host_os_id, sizeof(ds->os_id) - 1);
655 +
656 + if(ri->host_os_id_like)
657 + strncpyz(ds->os_id_like, ri->host_os_id_like, sizeof(ds->os_id_like) - 1);
658 +
659 ds->read_system_info = true;
660 }
src/libnetdata/exit/exit_initiated.h
+1
@@ -43,6 +43,7 @@ typedef enum {
43 #define EXIT_REASON_NORMAL (EXIT_REASON_SIGINT|EXIT_REASON_SIGTERM|EXIT_REASON_SIGQUIT|EXIT_REASON_API_QUIT|EXIT_REASON_CMD_EXIT|EXIT_REASON_SERVICE_STOP|EXIT_REASON_SYSTEM_SHUTDOWN|EXIT_REASON_UPDATE)
44 #define EXIT_REASON_ABNORMAL (EXIT_REASON_SIGBUS|EXIT_REASON_SIGSEGV|EXIT_REASON_SIGFPE|EXIT_REASON_SIGILL|EXIT_REASON_FATAL|EXIT_REASON_OUT_OF_MEMORY)
45
46 +#define is_deadly_signal(reason) ((reason) & (EXIT_REASON_SIGBUS|EXIT_REASON_SIGSEGV|EXIT_REASON_SIGFPE|EXIT_REASON_SIGILL))
47 #define is_exit_reason_normal(reason) (((reason) & EXIT_REASON_NORMAL) && !((reason) & EXIT_REASON_ABNORMAL))
48
49 typedef struct web_buffer BUFFER;