diff --git a/NEWS b/NEWS index 574eb9f5b83c9b97a0ca7706b00c1dfb2ab20760..1ddc651fa0a737302bd80a0cd1ed15212871d20d 100644 --- a/NEWS +++ b/NEWS @@ -34,6 +34,8 @@ documents those changes that are of interest to users and administrators. completeion, resulting in underflow error messages. -- Make "scontrol show daemons" work with long node names. -- CRAY - Collect energy using a uint64_t instead of uint32_t. + -- Fix incorrect if statements when determining if the user has a default + account or wckey. * Changes in Slurm 16.05.0 ========================== diff --git a/src/api/step_launch.c b/src/api/step_launch.c index 63a9eb3cb1ac5b8627a3de0ef08634e83e996c88..ed02de0c2289f03ba929f4debe9a1c9d7f1a9bbc 100644 --- a/src/api/step_launch.c +++ b/src/api/step_launch.c @@ -962,6 +962,12 @@ static int _connect_srun_cr(char *addr) unsigned int sa_len; int fd, rc; +#ifdef UNIX_PATH_MAX + if (addr && (strlen(addr) > UNIX_PATH_MAX)) { + error("%s: socket path name too long (%s)", __func__, addr); + return -1; + } +#endif fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { error("failed creating cr socket: %m"); diff --git a/src/common/proc_args.c b/src/common/proc_args.c index 7978f1040d7f811e61c72077a108555c369a724d..4fd6db3e8584c6ef6524b5fbb3037a497f35b0c0 100644 --- a/src/common/proc_args.c +++ b/src/common/proc_args.c @@ -833,16 +833,14 @@ bool verify_socket_core_thread_count(const char *arg, int *min_sockets, cpu_bind_type_t *cpu_bind_type) { bool tmp_val,ret_val; - int i,j; + int i, j; int max_sockets = 0, max_cores = 0, max_threads = 0; const char *cur_ptr = arg; char buf[3][48]; /* each can hold INT64_MAX - INT64_MAX */ - buf[0][0] = '\0'; - buf[1][0] = '\0'; - buf[2][0] = '\0'; - for (j=0;j<3;j++) { - for (i=0;i<47;i++) { + memset(buf, 0, sizeof(buf)); + for (j = 0; j < 3; j++) { + for (i = 0; i < 47; i++) { if (*cur_ptr == '\0' || *cur_ptr ==':') break; buf[j][i] = *cur_ptr++; @@ -850,7 +848,6 @@ bool verify_socket_core_thread_count(const char *arg, int *min_sockets, if (*cur_ptr == '\0') break; xassert(*cur_ptr == ':'); - buf[j][i] = '\0'; cur_ptr++; } /* if cpu_bind_type doesn't already have a auto preference, choose @@ -868,7 +865,6 @@ bool verify_socket_core_thread_count(const char *arg, int *min_sockets, *cpu_bind_type |= CPU_BIND_TO_THREADS; } } - buf[j][i] = '\0'; ret_val = true; tmp_val = get_resource_arg_range(&buf[0][0], "first arg of -B", diff --git a/src/common/xstring.c b/src/common/xstring.c index 7faf22aba6e9cde1e09ba234faacfd4f8b804b55..4d7b455410cefad7d2a2c76cd4babff90bd587d4 100644 --- a/src/common/xstring.c +++ b/src/common/xstring.c @@ -402,12 +402,14 @@ char * xstrndup(const char *str, size_t n) long int xstrntol(const char *str, char **endptr, size_t n, int base) { long int number = 0; - char new_str[n+1]; + char new_str[n+1], *new_endptr = NULL; memcpy(new_str, str, n); new_str[n] = '\0'; - number = strtol(new_str, endptr, base); + number = strtol(new_str, &new_endptr, base); + if (endptr) + *endptr = ((char *)str) + (new_endptr - new_str); return number; } diff --git a/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c b/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c index 96b38d117254e468208ce81f534e1d8a832b7e5e..4bed009411e0865e7356e25b27663d357c1d74cc 100644 --- a/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c +++ b/src/plugins/accounting_storage/filetxt/filetxt_jobacct_process.c @@ -1426,7 +1426,7 @@ extern int filetxt_jobacct_process_archive(slurmdb_archive_cond_t *arch_cond) } /* reopen new logfile in append mode, since slurmctld may write it */ - if (freopen(filein, "a", new_logfile) == NULL) { + if ((new_logfile = freopen(filein, "a", new_logfile)) == NULL) { perror("reopening new logfile"); goto finished2; } diff --git a/src/plugins/accounting_storage/mysql/as_mysql_assoc.c b/src/plugins/accounting_storage/mysql/as_mysql_assoc.c index e279f7cb2247f8b27b0ea218d4d668c234e83966..904f7432f16f160d08d666a84c440905f8bf4da9 100644 --- a/src/plugins/accounting_storage/mysql/as_mysql_assoc.c +++ b/src/plugins/accounting_storage/mysql/as_mysql_assoc.c @@ -410,7 +410,7 @@ static int _make_sure_users_have_default( break; } } - if (!rc != SLURM_SUCCESS) + if (rc != SLURM_SUCCESS) break; list_iterator_reset(clus_itr); } diff --git a/src/plugins/accounting_storage/mysql/as_mysql_wckey.c b/src/plugins/accounting_storage/mysql/as_mysql_wckey.c index 0495dcee31b4a07b00355d8166a7810e178acc24..8ddd686d051f35ba1280f38c0c6ea00a7cc2771f 100644 --- a/src/plugins/accounting_storage/mysql/as_mysql_wckey.c +++ b/src/plugins/accounting_storage/mysql/as_mysql_wckey.c @@ -184,7 +184,7 @@ static int _make_sure_users_have_default( break; } } - if (!rc != SLURM_SUCCESS) + if (rc != SLURM_SUCCESS) break; list_iterator_reset(clus_itr); } diff --git a/src/plugins/acct_gather_energy/rapl/acct_gather_energy_rapl.c b/src/plugins/acct_gather_energy/rapl/acct_gather_energy_rapl.c index a3e839ee775a943ea6faffb541971190661590d9..9650e014ab964fb0dc609e19ee5d72bb7f2c2fb1 100644 --- a/src/plugins/acct_gather_energy/rapl/acct_gather_energy_rapl.c +++ b/src/plugins/acct_gather_energy/rapl/acct_gather_energy_rapl.c @@ -248,7 +248,7 @@ static void _hardware(void) if (!xstrncmp(buf, "physical id", sizeof("physical id") - 1)) { sscanf(buf, "physical id\t: %d", &pkg); - if (pkg > MAX_PKGS) + if (pkg >= MAX_PKGS) fatal("Slurm can only handle %d sockets for " "rapl, you seem to have more than that. " "Update src/plugins/acct_gather_energy/" diff --git a/src/plugins/mpi/pmi2/agent.c b/src/plugins/mpi/pmi2/agent.c index 872f596b1e1863a4659ac92712bfc2f5704e610d..3b2389154e0b88d2a2ef0db5e1c6be0d833b7d54 100644 --- a/src/plugins/mpi/pmi2/agent.c +++ b/src/plugins/mpi/pmi2/agent.c @@ -254,7 +254,7 @@ _handle_pmi1_init(int fd, int lrank) debug3("mpi/pmi2: in _handle_pmi1_init"); while ( (n = read(fd, buf, 64)) < 0 && errno == EINTR); - if (n < 0) { + if ((n < 0) || (n >= 64)) { error("mpi/pmi2: failed to read PMI1 init command"); return SLURM_ERROR; } diff --git a/src/plugins/proctrack/linuxproc/kill_tree.c b/src/plugins/proctrack/linuxproc/kill_tree.c index 8ba5e494907f4e7a3e58b23312a08cae38adff8d..d38259c65e7eb7b3855598437f2b59424a9094d5 100644 --- a/src/plugins/proctrack/linuxproc/kill_tree.c +++ b/src/plugins/proctrack/linuxproc/kill_tree.c @@ -322,39 +322,48 @@ extern int kill_proc_tree(pid_t top, int sig) */ extern pid_t find_ancestor(pid_t process, char *process_name) { - char path[PATH_MAX], rbuf[1024]; + char path[PATH_MAX], *rbuf; + ssize_t buf_used; int fd; long pid, ppid; + rbuf = xmalloc(4096); pid = ppid = (long)process; do { if (ppid <= 1) { - return 0; + pid = 0; + break; } sprintf(path, "/proc/%ld/stat", ppid); if ((fd = open(path, O_RDONLY)) < 0) { - return 0; + pid = 0; + break; } - if (read(fd, rbuf, 1024) <= 0) { + buf_used = read(fd, rbuf, 4096); + if ((buf_used <= 0) || (buf_used >= 4096)) { close(fd); - return 0; + pid = 0; + break; } close(fd); if (sscanf(rbuf, "%ld %*s %*s %ld", &pid, &ppid) != 2) { - return 0; + pid = 0; + break; } sprintf(path, "/proc/%ld/cmdline", pid); if ((fd = open(path, O_RDONLY)) < 0) { continue; } - if (read(fd, rbuf, 1024) <= 0) { + buf_used = read(fd, rbuf, 4096); + if ((buf_used <= 0) || (buf_used >= 4096)) { close(fd); continue; } close(fd); } while (!strstr(rbuf, process_name)); + xfree(rbuf); return pid; } diff --git a/src/plugins/task/affinity/cpuset.c b/src/plugins/task/affinity/cpuset.c index 470fc78b667c4e0ce03402f076ad811f35eb367a..219e46db96d989434a22024b3a5ab579808ecb05 100644 --- a/src/plugins/task/affinity/cpuset.c +++ b/src/plugins/task/affinity/cpuset.c @@ -230,6 +230,7 @@ int slurm_set_cpuset(char *base, char *path, pid_t pid, size_t size, * "mems" must be set before any tasks can be added. */ snprintf(file_path, sizeof(file_path), "%s/%smems", base, cpuset_prefix); + memset(mstr, 0, sizeof(mstr)); fd = open(file_path, O_RDONLY); if (fd < 0) { error("open(%s): %m", file_path); diff --git a/src/sattach/sattach.c b/src/sattach/sattach.c index 8cbec5dbefd046cae8a16054b28a944ae3bcea78..b404107686bbf21d799b8b751574fb9aabc29387 100644 --- a/src/sattach/sattach.c +++ b/src/sattach/sattach.c @@ -281,6 +281,7 @@ static slurm_cred_t *_generate_fake_cred(uint32_t jobid, uint32_t stepid, slurm_cred_arg_t arg; slurm_cred_t *cred; + memset(&arg, 0, sizeof(slurm_cred_arg_t)); arg.jobid = jobid; arg.stepid = stepid; arg.uid = uid; diff --git a/src/slurmd/slurmstepd/pdebug.c b/src/slurmd/slurmstepd/pdebug.c index d2541a2dc16456f5f38c14aff3827dc067a3cfe8..d842a107d5b645c265e4f12331d1986c1b852f3c 100644 --- a/src/slurmd/slurmstepd/pdebug.c +++ b/src/slurmd/slurmstepd/pdebug.c @@ -145,24 +145,32 @@ pdebug_stop_current(stepd_step_rec_t *job) static bool _pid_to_wake(pid_t pid) { #ifdef CLONE_PTRACE - char proc_stat[1024], proc_name[22], state[1], *str_ptr; + char *proc_stat, proc_name[22], state[1], *str_ptr; int len, proc_fd, ppid, pgrp, session, tty, tpgid; long unsigned flags; sprintf (proc_name, "/proc/%d/stat", (int) pid); if ((proc_fd = open(proc_name, O_RDONLY, 0)) == -1) return false; /* process is now gone */ - len = read(proc_fd, proc_stat, sizeof(proc_stat)); + proc_stat = xmalloc(4096); + len = read(proc_fd, proc_stat, 4096); close(proc_fd); - if (len < 14) + if (len < 14) { + xfree(proc_stat); return false; + } /* skip over "PID (CMD) " */ - if ((str_ptr = (char *)strrchr(proc_stat, ')')) == NULL) + if ((str_ptr = (char *)strrchr(proc_stat, ')')) == NULL) { + xfree(proc_stat); return false; + } if (sscanf(str_ptr + 2, "%c %d %d %d %d %d %lu ", - state, &ppid, &pgrp, &session, &tty, &tpgid, &flags) != 7) + state, &ppid, &pgrp, &session, &tty, &tpgid, &flags) != 7) { + xfree(proc_stat); return false; + } + xfree(proc_stat); if ((flags & CLONE_PTRACE) == 0) return true; return false; diff --git a/src/slurmd/slurmstepd/slurmstepd_job.c b/src/slurmd/slurmstepd/slurmstepd_job.c index 91aff8d37baafc240af8d4d991142e3adcee69bf..1e4b18d01dc497d41f3761c40a4cf2baaff8f63e 100644 --- a/src/slurmd/slurmstepd/slurmstepd_job.c +++ b/src/slurmd/slurmstepd/slurmstepd_job.c @@ -349,6 +349,8 @@ stepd_step_rec_create(launch_tasks_request_msg_t *msg, uint16_t protocol_version slurm_set_addr(&resp_addr, msg->resp_port[nodeid % msg->num_resp_port], NULL); + } else { + memset(&resp_addr, 0, sizeof(slurm_addr_t)); } job->user_managed_io = msg->user_managed_io; if (!msg->io_port) @@ -358,6 +360,8 @@ stepd_step_rec_create(launch_tasks_request_msg_t *msg, uint16_t protocol_version slurm_set_addr(&io_addr, msg->io_port[nodeid % msg->num_io_port], NULL); + } else { + memset(&io_addr, 0, sizeof(slurm_addr_t)); } srun = srun_info_create(msg->cred, &resp_addr, &io_addr,