28
static volatile bool spawn_server_sigchld = false;
29
static SPAWN_REQUEST *spawn_server_requests = NULL;
30
31
+static size_t spawn_server_max_unix_socket_path_length(void) {
32
+ struct sockaddr_un server_addr = { 0 };
33
+ return sizeof(server_addr.sun_path) - 1;
34
+}
35
+
36
+static bool spawn_server_set_unix_socket_path(struct sockaddr_un *server_addr, const char *path, bool log, const char *action) {
37
+ const size_t max_path_length = sizeof(server_addr->sun_path) - 1;
38
+
39
+ if(strlen(path) > max_path_length) {
40
+ errno = ENAMETOOLONG;
41
+ if(log)
42
+ nd_log(NDLS_COLLECTORS, NDLP_ERR,
43
+ "%s '%s': exceeds the %zu-byte AF_UNIX limit",
44
+ action, path, max_path_length);
45
+ return false;
46
+ }
47
+
48
+ strncpyz(server_addr->sun_path, path, max_path_length);
49
+ return true;
50
+}
51
+
52
// --------------------------------------------------------------------------------------------------------------------
53
54
static int connect_to_spawn_server(const char *path, bool log) {
55
int sock = -1;
56
+ struct sockaddr_un server_addr = {
57
+ .sun_family = AF_UNIX,
58
+ };
59
+
60
+ if(!spawn_server_set_unix_socket_path(&server_addr, path, log,
61
+ "SPAWN PARENT: Cannot connect() to spawn server on path"))
62
+ return -1;
63
64
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
65
if(log)
67
return -1;
68
}
69
42
- struct sockaddr_un server_addr = {
43
- .sun_family = AF_UNIX,
44
- };
45
- strcpy(server_addr.sun_path, path);
46
-
70
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
71
if(log)
72
nd_log(NDLS_COLLECTORS, NDLP_ERR, "SPAWN PARENT: Cannot connect() to spawn server on path '%s'.", path);
979
return false;
980
}
981
982
+ struct sockaddr_un server_addr = {
983
+ .sun_family = AF_UNIX,
984
+ };
985
+
986
+ if(!spawn_server_set_unix_socket_path(&server_addr, server->path, true,
987
+ "SPAWN SERVER: Cannot listen on path"))
988
+ return false;
989
+
990
if ((server->sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
991
nd_log(NDLS_COLLECTORS, NDLP_ERR, "SPAWN SERVER: Failed to create socket()");
992
return false;
993
}
994
964
- struct sockaddr_un server_addr = {
965
- .sun_family = AF_UNIX,
966
- };
967
- strcpy(server_addr.sun_path, server->path);
995
unlink(server->path);
996
errno = 0;
997
1080
runtime_directory = "/tmp";
1081
1082
char path[1024];
1083
+ int path_length;
1084
+ const size_t max_path_length = spawn_server_max_unix_socket_path_length();
1085
if(name && *name) {
1086
server->name = strdupz(name);
1058
- snprintf(path, sizeof(path), "%s/netdata-spawn-%s.sock", runtime_directory, name);
1087
+ path_length = snprintf(path, sizeof(path), "%s/netdata-spawn-%s.sock", runtime_directory, name);
1088
}
1089
else {
1090
server->name = strdupz("unnamed");
1062
- snprintf(path, sizeof(path), "%s/netdata-spawn-%d-%zu.sock", runtime_directory, getpid(), server->id);
1091
+ path_length = snprintf(path, sizeof(path), "%s/netdata-spawn-%d-%zu.sock", runtime_directory, getpid(), server->id);
1092
+ }
1093
+
1094
+ if(path_length < 0) {
1095
+ nd_log(NDLS_COLLECTORS, NDLP_ERR,
1096
+ "SPAWN SERVER: failed to generate socket path for '%s'",
1097
+ server->name);
1098
+ goto cleanup;
1099
+ }
1100
+
1101
+ if((size_t)path_length >= sizeof(path)) {
1102
+ errno = ENAMETOOLONG;
1103
+ nd_log(NDLS_COLLECTORS, NDLP_ERR,
1104
+ "SPAWN SERVER: socket path for '%s' in runtime directory '%s' was truncated (needed %d chars plus NUL, buffer is %zu bytes)",
1105
+ server->name, runtime_directory, path_length, sizeof(path));
1106
+ goto cleanup;
1107
+ }
1108
+
1109
+ if((size_t)path_length > max_path_length) {
1110
+ errno = ENAMETOOLONG;
1111
+ nd_log(NDLS_COLLECTORS, NDLP_ERR,
1112
+ "SPAWN SERVER: socket path for '%s' in runtime directory '%s' exceeds the %zu-byte AF_UNIX limit",
1113
+ server->name, runtime_directory, max_path_length);
1114
+ goto cleanup;
1115
}
1116
1117
server->path = strdupz(path);