diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index 9e72258044aaf7c96a5c1769f31cc8b09c55ff2d..d1de8a70f91d2c31a76bd02651a6fd24651da1a2 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -2214,6 +2214,32 @@ _xduparray(uint16_t size, char ** array) return result; } +/* like _xduparray(), but performs a single xmalloc() */ +static char ** +_xduparray2(uint16_t size, char ** array) +{ + int i, len = 0; + char *ptr, ** result; + + if (size == 0) + return (char **) NULL; + + for (i=0; i<size; i++) + len += (strlen(array[i]) + 1); + ptr = xmalloc(sizeof(char *) * size + len); + result = (char **) ptr; + + ptr += (sizeof(char *) * size); + for (i=0; i<size; i++) { + len = strlen(array[i]); + strcpy(ptr, array[i]); + ptr += (len + 1); + } + + return result; +} + + int _max_nprocs(struct job_record *job_ptr) { @@ -2329,7 +2355,7 @@ int _launch_batch_step(job_desc_msg_t *job_desc_msg, uid_t uid, launch_msg_ptr->argv = _xduparray(job_desc_msg->argc, job_desc_msg->argv); launch_msg_ptr->script = xstrdup(job_desc_msg->script); - launch_msg_ptr->environment = _xduparray(job_desc_msg->env_size, + launch_msg_ptr->environment = _xduparray2(job_desc_msg->env_size, job_desc_msg->environment); launch_msg_ptr->envc = job_desc_msg->env_size;