Merge pull request #8144 from devreal/fix_opal_add_to_env_str_alloc
OPAL: fix string buffer allocation for large env variables
Этот коммит содержится в:
Коммит
dca2058e2f
@ -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) {
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user