Skip to content

Commit 5b6bae0

Browse files
committed
YARN-4017. container-executor overuses PATH_MAX. Contributed by Sidharta Seethana
1 parent 69b025d commit 5b6bae0

File tree

4 files changed

+28
-22
lines changed

4 files changed

+28
-22
lines changed

hadoop-yarn-project/CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,8 @@ Release 2.8.0 - UNRELEASED
929929
YARN-4230. RM crashes with NPE when increasing container resource if there is no headroom left.
930930
(Meng Ding via jianhe)
931931

932+
YARN-4017. container-executor overuses PATH_MAX. (Sidharta Seethana via vvasudev)
933+
932934
Release 2.7.2 - UNRELEASED
933935

934936
INCOMPATIBLE CHANGES

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/configuration.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ static int is_only_root_writable(const char *file) {
9595
*/
9696
char *resolve_config_path(const char* file_name, const char *root) {
9797
const char *real_fname = NULL;
98-
char buffer[PATH_MAX*2 + 1];
98+
char buffer[EXECUTOR_PATH_MAX*2 + 1];
9999

100100
if (file_name[0] == '/') {
101101
real_fname = file_name;
102102
} else if (realpath(root, buffer) != NULL) {
103-
strncpy(strrchr(buffer, '/') + 1, file_name, PATH_MAX);
103+
strncpy(strrchr(buffer, '/') + 1, file_name, EXECUTOR_PATH_MAX);
104104
real_fname = buffer;
105105
}
106106

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/configuration.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
#include <stddef.h>
2020

21+
/** Define a platform-independent constant instead of using PATH_MAX */
22+
23+
#define EXECUTOR_PATH_MAX 4096
24+
2125
/**
2226
* Ensure that the configuration file and all of the containing directories
2327
* are only writable by root. Otherwise, an attacker can change the

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,17 @@ void set_nm_uid(uid_t user, gid_t group) {
6868
* get the executable filename.
6969
*/
7070
char* get_executable() {
71-
char buffer[PATH_MAX];
72-
snprintf(buffer, PATH_MAX, "/proc/%" PRId64 "/exe", (int64_t)getpid());
73-
char *filename = malloc(PATH_MAX);
74-
ssize_t len = readlink(buffer, filename, PATH_MAX);
71+
char buffer[EXECUTOR_PATH_MAX];
72+
snprintf(buffer, EXECUTOR_PATH_MAX, "/proc/%" PRId64 "/exe", (int64_t)getpid());
73+
char *filename = malloc(EXECUTOR_PATH_MAX);
74+
ssize_t len = readlink(buffer, filename, EXECUTOR_PATH_MAX);
7575
if (len == -1) {
7676
fprintf(ERRORFILE, "Can't get executable name from %s - %s\n", buffer,
7777
strerror(errno));
7878
exit(-1);
79-
} else if (len >= PATH_MAX) {
79+
} else if (len >= EXECUTOR_PATH_MAX) {
8080
fprintf(ERRORFILE, "Executable name %.*s is longer than %d characters.\n",
81-
PATH_MAX, filename, PATH_MAX);
81+
EXECUTOR_PATH_MAX, filename, EXECUTOR_PATH_MAX);
8282
exit(-1);
8383
}
8484
filename[len] = '\0';
@@ -1060,8 +1060,8 @@ char* parse_docker_command_file(const char* command_file) {
10601060
int run_docker(const char *command_file) {
10611061
char* docker_command = parse_docker_command_file(command_file);
10621062
char* docker_binary = get_value(DOCKER_BINARY_KEY);
1063-
char* docker_command_with_binary = calloc(sizeof(char), PATH_MAX);
1064-
snprintf(docker_command_with_binary, PATH_MAX, "%s %s", docker_binary, docker_command);
1063+
char* docker_command_with_binary = calloc(sizeof(char), EXECUTOR_PATH_MAX);
1064+
snprintf(docker_command_with_binary, EXECUTOR_PATH_MAX, "%s %s", docker_binary, docker_command);
10651065
char **args = extract_values_delim(docker_command_with_binary, " ");
10661066

10671067
int exit_code = -1;
@@ -1207,11 +1207,11 @@ int launch_docker_container_as_user(const char * user, const char *app_id,
12071207
char *script_file_dest = NULL;
12081208
char *cred_file_dest = NULL;
12091209
char *exit_code_file = NULL;
1210-
char docker_command_with_binary[PATH_MAX];
1211-
char docker_wait_command[PATH_MAX];
1212-
char docker_logs_command[PATH_MAX];
1213-
char docker_inspect_command[PATH_MAX];
1214-
char docker_rm_command[PATH_MAX];
1210+
char docker_command_with_binary[EXECUTOR_PATH_MAX];
1211+
char docker_wait_command[EXECUTOR_PATH_MAX];
1212+
char docker_logs_command[EXECUTOR_PATH_MAX];
1213+
char docker_inspect_command[EXECUTOR_PATH_MAX];
1214+
char docker_rm_command[EXECUTOR_PATH_MAX];
12151215
int container_file_source =-1;
12161216
int cred_file_source = -1;
12171217
int BUFFER_SIZE = 4096;
@@ -1256,7 +1256,7 @@ int launch_docker_container_as_user(const char * user, const char *app_id,
12561256
goto cleanup;
12571257
}
12581258

1259-
snprintf(docker_command_with_binary, PATH_MAX, "%s %s", docker_binary, docker_command);
1259+
snprintf(docker_command_with_binary, EXECUTOR_PATH_MAX, "%s %s", docker_binary, docker_command);
12601260

12611261
FILE* start_docker = popen(docker_command_with_binary, "r");
12621262
if (pclose (start_docker) != 0)
@@ -1268,7 +1268,7 @@ int launch_docker_container_as_user(const char * user, const char *app_id,
12681268
goto cleanup;
12691269
}
12701270

1271-
snprintf(docker_inspect_command, PATH_MAX,
1271+
snprintf(docker_inspect_command, EXECUTOR_PATH_MAX,
12721272
"%s inspect --format {{.State.Pid}} %s",
12731273
docker_binary, container_id);
12741274

@@ -1307,7 +1307,7 @@ int launch_docker_container_as_user(const char * user, const char *app_id,
13071307
goto cleanup;
13081308
}
13091309

1310-
snprintf(docker_wait_command, PATH_MAX,
1310+
snprintf(docker_wait_command, EXECUTOR_PATH_MAX,
13111311
"%s wait %s", docker_binary, container_id);
13121312

13131313
FILE* wait_docker = popen(docker_wait_command, "r");
@@ -1318,7 +1318,7 @@ int launch_docker_container_as_user(const char * user, const char *app_id,
13181318
fflush(ERRORFILE);
13191319
}
13201320
if(exit_code != 0) {
1321-
snprintf(docker_logs_command, PATH_MAX, "%s logs --tail=250 %s",
1321+
snprintf(docker_logs_command, EXECUTOR_PATH_MAX, "%s logs --tail=250 %s",
13221322
docker_binary, container_id);
13231323
FILE* logs = popen(docker_logs_command, "r");
13241324
if(logs != NULL) {
@@ -1347,7 +1347,7 @@ int launch_docker_container_as_user(const char * user, const char *app_id,
13471347
}
13481348
}
13491349

1350-
snprintf(docker_rm_command, PATH_MAX,
1350+
snprintf(docker_rm_command, EXECUTOR_PATH_MAX,
13511351
"%s rm %s", docker_binary, container_id);
13521352
FILE* rm_docker = popen(docker_rm_command, "w");
13531353
if (pclose (rm_docker) != 0)
@@ -1766,7 +1766,7 @@ int mount_cgroup(const char *pair, const char *hierarchy) {
17661766
#else
17671767
char *controller = malloc(strlen(pair));
17681768
char *mount_path = malloc(strlen(pair));
1769-
char hier_path[PATH_MAX];
1769+
char hier_path[EXECUTOR_PATH_MAX];
17701770
int result = 0;
17711771

17721772
if (get_kv_key(pair, controller, strlen(pair)) < 0 ||
@@ -1778,7 +1778,7 @@ int mount_cgroup(const char *pair, const char *hierarchy) {
17781778
if (mount("none", mount_path, "cgroup", 0, controller) == 0) {
17791779
char *buf = stpncpy(hier_path, mount_path, strlen(mount_path));
17801780
*buf++ = '/';
1781-
snprintf(buf, PATH_MAX - (buf - hier_path), "%s", hierarchy);
1781+
snprintf(buf, EXECUTOR_PATH_MAX - (buf - hier_path), "%s", hierarchy);
17821782

17831783
// create hierarchy as 0750 and chown to Hadoop NM user
17841784
const mode_t perms = S_IRWXU | S_IRGRP | S_IXGRP;

0 commit comments

Comments
 (0)