Skip to content
Snippets Groups Projects
Commit 30b9c5df authored by Moe Jette's avatar Moe Jette
Browse files

avoid huge arrays in the stack, add xmalloc/xfree calls instead

parent 37cca1eb
No related branches found
No related tags found
No related merge requests found
...@@ -78,7 +78,7 @@ strong_alias(env_array_append_fmt, slurm_env_array_append_fmt); ...@@ -78,7 +78,7 @@ strong_alias(env_array_append_fmt, slurm_env_array_append_fmt);
strong_alias(env_array_overwrite, slurm_env_array_overwrite); strong_alias(env_array_overwrite, slurm_env_array_overwrite);
strong_alias(env_array_overwrite_fmt, slurm_env_array_overwrite_fmt); strong_alias(env_array_overwrite_fmt, slurm_env_array_overwrite_fmt);
#define ENV_BUFSIZE (64 * 1024) #define ENV_BUFSIZE (256 * 1024)
/* /*
* Return pointer to `name' entry in environment if found, or * Return pointer to `name' entry in environment if found, or
...@@ -168,15 +168,16 @@ int ...@@ -168,15 +168,16 @@ int
setenvfs(const char *fmt, ...) setenvfs(const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[ENV_BUFSIZE]; char *buf, *bufcpy;
char *bufcpy;
int rc; int rc;
buf = xmalloc(ENV_BUFSIZE);
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
bufcpy = xstrdup(buf); bufcpy = xstrdup(buf);
buf = xmalloc(ENV_BUFSIZE);
rc = putenv(bufcpy); rc = putenv(bufcpy);
return rc; return rc;
} }
...@@ -184,17 +185,18 @@ setenvfs(const char *fmt, ...) ...@@ -184,17 +185,18 @@ setenvfs(const char *fmt, ...)
int int
setenvf(char ***envp, const char *name, const char *fmt, ...) setenvf(char ***envp, const char *name, const char *fmt, ...)
{ {
char buf[ENV_BUFSIZE];
char **ep = NULL; char **ep = NULL;
char *str = NULL; char *str = NULL;
va_list ap; va_list ap;
int rc; int rc;
char *bufcpy; char *buf, *bufcpy;
buf = xmalloc(ENV_BUFSIZE);
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf (buf, sizeof(buf), fmt, ap); vsnprintf (buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
bufcpy = xstrdup(buf); bufcpy = xstrdup(buf);
xfree(buf);
xstrfmtcat (str, "%s=%s", name, bufcpy); xstrfmtcat (str, "%s=%s", name, bufcpy);
xfree(bufcpy); xfree(bufcpy);
...@@ -978,30 +980,28 @@ char **env_array_create(void) ...@@ -978,30 +980,28 @@ char **env_array_create(void)
int env_array_append_fmt(char ***array_ptr, const char *name, int env_array_append_fmt(char ***array_ptr, const char *name,
const char *value_fmt, ...) const char *value_fmt, ...)
{ {
char buf[ENV_BUFSIZE]; char *buf;
char **ep = NULL; char **ep = NULL;
char *str = NULL; char *str = NULL;
va_list ap; va_list ap;
buf[0] = '\0'; if (array_ptr == NULL)
if (array_ptr == NULL) {
return 0; return 0;
}
if (*array_ptr == NULL) { if (*array_ptr == NULL)
*array_ptr = env_array_create(); *array_ptr = env_array_create();
}
ep = _find_name_in_env(*array_ptr, name);
if (*ep != NULL)
return 0;
buf = xmalloc(ENV_BUFSIZE);
va_start(ap, value_fmt); va_start(ap, value_fmt);
vsnprintf (buf, sizeof(buf), value_fmt, ap); vsnprintf (buf, sizeof(buf), value_fmt, ap);
va_end(ap); va_end(ap);
ep = _find_name_in_env(*array_ptr, name);
if (*ep != NULL) {
return 0;
}
xstrfmtcat (str, "%s=%s", name, buf); xstrfmtcat (str, "%s=%s", name, buf);
xfree(buf);
ep = _extend_env(array_ptr); ep = _extend_env(array_ptr);
*ep = str; *ep = str;
...@@ -1021,18 +1021,15 @@ int env_array_append(char ***array_ptr, const char *name, ...@@ -1021,18 +1021,15 @@ int env_array_append(char ***array_ptr, const char *name,
char **ep = NULL; char **ep = NULL;
char *str = NULL; char *str = NULL;
if (array_ptr == NULL) { if (array_ptr == NULL)
return 0; return 0;
}
if (*array_ptr == NULL) { if (*array_ptr == NULL)
*array_ptr = env_array_create(); *array_ptr = env_array_create();
}
ep = _find_name_in_env(*array_ptr, name); ep = _find_name_in_env(*array_ptr, name);
if (*ep != NULL) { if (*ep != NULL)
return 0; return 0;
}
xstrfmtcat (str, "%s=%s", name, value); xstrfmtcat (str, "%s=%s", name, value);
ep = _extend_env(array_ptr); ep = _extend_env(array_ptr);
...@@ -1054,25 +1051,25 @@ int env_array_append(char ***array_ptr, const char *name, ...@@ -1054,25 +1051,25 @@ int env_array_append(char ***array_ptr, const char *name,
int env_array_overwrite_fmt(char ***array_ptr, const char *name, int env_array_overwrite_fmt(char ***array_ptr, const char *name,
const char *value_fmt, ...) const char *value_fmt, ...)
{ {
char buf[ENV_BUFSIZE]; char *buf;
char **ep = NULL; char **ep = NULL;
char *str = NULL; char *str = NULL;
va_list ap; va_list ap;
buf[0] = '\0'; buf[0] = '\0';
if (array_ptr == NULL) { if (array_ptr == NULL)
return 0; return 0;
}
if (*array_ptr == NULL) { if (*array_ptr == NULL)
*array_ptr = env_array_create(); *array_ptr = env_array_create();
}
buf = xmalloc(ENV_BUFSIZE);
va_start(ap, value_fmt); va_start(ap, value_fmt);
vsnprintf (buf, sizeof(buf), value_fmt, ap); vsnprintf (buf, sizeof(buf), value_fmt, ap);
va_end(ap); va_end(ap);
xstrfmtcat (str, "%s=%s", name, buf); xstrfmtcat (str, "%s=%s", name, buf);
xfree(buf);
ep = _find_name_in_env(*array_ptr, name); ep = _find_name_in_env(*array_ptr, name);
if (*ep != NULL) { if (*ep != NULL) {
xfree (*ep); xfree (*ep);
...@@ -1188,16 +1185,17 @@ static int _env_array_entry_splitter(const char *entry, ...@@ -1188,16 +1185,17 @@ static int _env_array_entry_splitter(const char *entry,
*/ */
static int _env_array_putenv(const char *string) static int _env_array_putenv(const char *string)
{ {
char name[256]; int rc = 0;
char value[ENV_BUFSIZE]; char name[256], *value;
if (!_env_array_entry_splitter(string, name, sizeof(name), value = xmalloc(ENV_BUFSIZE);
value, sizeof(value))) if ((_env_array_entry_splitter(string, name, sizeof(name),
return 0; value, ENV_BUFSIZE)) &&
if (setenv(name, value, 1) == -1) (setenv(name, value, 1) != -1))
return 0; rc = 1;
return 1; xfree(value);
return rc;
} }
/* /*
...@@ -1224,17 +1222,18 @@ void env_array_set_environment(char **env_array) ...@@ -1224,17 +1222,18 @@ void env_array_set_environment(char **env_array)
void env_array_merge(char ***dest_array, const char **src_array) void env_array_merge(char ***dest_array, const char **src_array)
{ {
char **ptr; char **ptr;
char name[256]; char name[256], *value;
char value[ENV_BUFSIZE];
if (src_array == NULL) if (src_array == NULL)
return; return;
value = xmalloc(ENV_BUFSIZE);
for (ptr = (char **)src_array; *ptr != NULL; ptr++) { for (ptr = (char **)src_array; *ptr != NULL; ptr++) {
if (_env_array_entry_splitter(*ptr, name, sizeof(name), if (_env_array_entry_splitter(*ptr, name, sizeof(name),
value, sizeof(value))) value, sizeof(value)))
env_array_overwrite(dest_array, name, value); env_array_overwrite(dest_array, name, value);
} }
xfree(value);
} }
/* /*
...@@ -1261,7 +1260,7 @@ static void _strip_cr_nl(char *line) ...@@ -1261,7 +1260,7 @@ static void _strip_cr_nl(char *line)
static char **_load_env_cache(const char *username) static char **_load_env_cache(const char *username)
{ {
char *state_save_loc, fname[MAXPATHLEN]; char *state_save_loc, fname[MAXPATHLEN];
char line[ENV_BUFSIZE], name[256], value[ENV_BUFSIZE]; char *line, name[256], *value;
char **env = NULL; char **env = NULL;
FILE *fp; FILE *fp;
int i; int i;
...@@ -1282,6 +1281,8 @@ static char **_load_env_cache(const char *username) ...@@ -1282,6 +1281,8 @@ static char **_load_env_cache(const char *username)
verbose("Getting cached environment variables at %s", fname); verbose("Getting cached environment variables at %s", fname);
env = env_array_create(); env = env_array_create();
line = xmalloc(ENV_BUFSIZE);
value = xmalloc(ENV_BUFSIZE);
while (1) { while (1) {
if (!fgets(line, sizeof(line), fp)) if (!fgets(line, sizeof(line), fp))
break; break;
...@@ -1291,6 +1292,9 @@ static char **_load_env_cache(const char *username) ...@@ -1291,6 +1292,9 @@ static char **_load_env_cache(const char *username)
(!_discard_env(name, value))) (!_discard_env(name, value)))
env_array_overwrite(&env, name, value); env_array_overwrite(&env, name, value);
} }
xfree(line);
xfree(value);
fclose(fp); fclose(fp);
return env; return env;
} }
...@@ -1313,8 +1317,7 @@ static char **_load_env_cache(const char *username) ...@@ -1313,8 +1317,7 @@ static char **_load_env_cache(const char *username)
*/ */
char **env_array_user_default(const char *username, int timeout, int mode) char **env_array_user_default(const char *username, int timeout, int mode)
{ {
char *line = NULL, *last = NULL, name[128], value[ENV_BUFSIZE]; char *line = NULL, *last = NULL, name[128], *value, *buffer;
char buffer[ENV_BUFSIZE];
char **env = NULL; char **env = NULL;
char *starttoken = "XXXXSLURMSTARTPARSINGHEREXXXX"; char *starttoken = "XXXXSLURMSTARTPARSINGHEREXXXX";
char *stoptoken = "XXXXSLURMSTOPPARSINGHEREXXXXX"; char *stoptoken = "XXXXSLURMSTOPPARSINGHEREXXXXX";
...@@ -1396,7 +1399,7 @@ char **env_array_user_default(const char *username, int timeout, int mode) ...@@ -1396,7 +1399,7 @@ char **env_array_user_default(const char *username, int timeout, int mode)
timeout = config_timeout; /* != 0 test above */ timeout = config_timeout; /* != 0 test above */
found = 0; found = 0;
buf_read = 0; buf_read = 0;
bzero(buffer, sizeof(buffer)); buffer = xmalloc(ENV_BUFSIZE);
while (1) { while (1) {
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
timeleft = timeout * 1000; timeleft = timeout * 1000;
...@@ -1428,7 +1431,7 @@ char **env_array_user_default(const char *username, int timeout, int mode) ...@@ -1428,7 +1431,7 @@ char **env_array_user_default(const char *username, int timeout, int mode)
} }
break; break;
} }
buf_rem = sizeof(buffer) - buf_read; buf_rem = ENV_BUFSIZE - buf_read;
if (buf_rem == 0) { if (buf_rem == 0) {
error("buffer overflow loading env vars"); error("buffer overflow loading env vars");
break; break;
...@@ -1447,6 +1450,7 @@ char **env_array_user_default(const char *username, int timeout, int mode) ...@@ -1447,6 +1450,7 @@ char **env_array_user_default(const char *username, int timeout, int mode)
close(fildes[0]); close(fildes[0]);
if (!found) { if (!found) {
error("Failed to load current user environment variables"); error("Failed to load current user environment variables");
xfree(buffer);
return _load_env_cache(username); return _load_env_cache(username);
} }
...@@ -1463,6 +1467,7 @@ char **env_array_user_default(const char *username, int timeout, int mode) ...@@ -1463,6 +1467,7 @@ char **env_array_user_default(const char *username, int timeout, int mode)
} }
if (!found) { if (!found) {
error("Failed to get current user environment variables"); error("Failed to get current user environment variables");
xfree(buffer);
return _load_env_cache(username); return _load_env_cache(username);
} }
...@@ -1471,17 +1476,20 @@ char **env_array_user_default(const char *username, int timeout, int mode) ...@@ -1471,17 +1476,20 @@ char **env_array_user_default(const char *username, int timeout, int mode)
found = 0; found = 0;
env = env_array_create(); env = env_array_create();
line = strtok_r(NULL, "\n", &last); line = strtok_r(NULL, "\n", &last);
value = xmalloc(ENV_BUFSIZE);
while (!found && line) { while (!found && line) {
if (!strncmp(line, stoptoken, len)) { if (!strncmp(line, stoptoken, len)) {
found = 1; found = 1;
break; break;
} }
if (_env_array_entry_splitter(line, name, sizeof(name), if (_env_array_entry_splitter(line, name, sizeof(name),
value, sizeof(value)) && value, ENV_BUFSIZE) &&
(!_discard_env(name, value))) (!_discard_env(name, value)))
env_array_overwrite(&env, name, value); env_array_overwrite(&env, name, value);
line = strtok_r(NULL, "\n", &last); line = strtok_r(NULL, "\n", &last);
} }
xfree(value);
xfree(buffer);
if (!found) { if (!found) {
error("Failed to get all user environment variables"); error("Failed to get all user environment variables");
env_array_free(env); env_array_free(env);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment