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;