1
1

Merge pull request #8144 from devreal/fix_opal_add_to_env_str_alloc

OPAL: fix string buffer allocation for large env variables
Этот коммит содержится в:
Jeff Squyres 2020-10-30 14:39:01 -04:00 коммит произвёл GitHub
родитель 25e47411e0 320a9a1660
Коммит dca2058e2f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23

Просмотреть файл

@ -276,21 +276,37 @@ static int save_param_name (void)
static int add_to_env_str(char *var, char *val) static int add_to_env_str(char *var, char *val)
{ {
int sz, varsz, valsz; int sz, varsz, valsz, new_envsize;
void *tmp; void *tmp;
if (NULL == var) { if (NULL == var) {
return OPAL_ERR_BAD_PARAM; return OPAL_ERR_BAD_PARAM;
} }
varsz = strlen(var);
if (NULL != val) {
valsz = strlen(val);
/* account for '=' */
valsz += 1;
}
sz = 0;
if (NULL != env_str) { if (NULL != env_str) {
varsz = strlen(var); sz = strlen(env_str);
valsz = (NULL != val) ? strlen(val) : 0; /* account for ';' */
sz = strlen(env_str)+varsz+valsz+2; sz += 1;
if (envsize <= sz) { }
envsize *=2; /* add required new size incl NUL byte */
sz += varsz+valsz+1;
tmp = realloc(env_str, envsize); /* make sure we have sufficient space */
new_envsize = envsize;
while (new_envsize <= sz) {
new_envsize *=2;
}
if (NULL != env_str) {
if (new_envsize > envsize) {
tmp = realloc(env_str, new_envsize);
if (NULL == tmp) { if (NULL == tmp) {
return OPAL_ERR_OUT_OF_RESOURCE; return OPAL_ERR_OUT_OF_RESOURCE;
} }
@ -298,11 +314,12 @@ static int add_to_env_str(char *var, char *val)
} }
strcat(env_str, ";"); strcat(env_str, ";");
} else { } else {
env_str = calloc(1, envsize); env_str = calloc(1, new_envsize);
if (NULL == env_str) { if (NULL == env_str) {
return OPAL_ERR_OUT_OF_RESOURCE; return OPAL_ERR_OUT_OF_RESOURCE;
} }
} }
envsize = new_envsize;
strcat(env_str, var); strcat(env_str, var);
if (NULL != val) { if (NULL != val) {