diff options
author | Eduardo Chappa <chappa@washington.edu> | 2020-07-06 21:42:41 -0600 |
---|---|---|
committer | Eduardo Chappa <chappa@washington.edu> | 2020-07-06 21:42:41 -0600 |
commit | 6170c9d0c1fc9185c4731c6e8bb8acbb14c451b3 (patch) | |
tree | 0260e6f28c81dec9115f03561a9a0b3ad11723ab /alpine | |
parent | 38c46d8606c418af54929c17bd462884377aa7c2 (diff) | |
download | alpine-6170c9d0c1fc9185c4731c6e8bb8acbb14c451b3.tar.xz |
* Fix in the XOAUTH2 configuration screen, where a crash was happening due to
incorrect allocation of memory. The fix was to count the amount of memory
needed to be allocated and allocate it at once.
Diffstat (limited to 'alpine')
-rw-r--r-- | alpine/xoauth2conf.c | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/alpine/xoauth2conf.c b/alpine/xoauth2conf.c index 0058a3e..7af3679 100644 --- a/alpine/xoauth2conf.c +++ b/alpine/xoauth2conf.c @@ -579,13 +579,7 @@ write_xoauth_conf_entry(XOAUTH2_INFO_S *x, XOAUTH2_INFO_S *y, CONF_S **cl, CONF_ int i, p = *pp; char tmp[1024], tmp2[16]; - i = 2; /* client_id and users always appear */ - if(x->client_secret) i++; - if(x->tenant) i++; - sprintf(tmp2, "%d", key); - fs_resize((void **) varlistp, (p + i + 1)*sizeof(struct variable **)); - memset((void *) (*varlistp + p*sizeof(struct variable *)), 0, (i + 1)*sizeof(struct variable *)); varlist = *varlistp; new_confline(cl)->var = NULL; @@ -743,7 +737,7 @@ alpine_xoauth2_configuration(struct pine *ps, int edit_exceptions) char *name, *id, *tenant, *secret, **user; char *name_lval, *id_lval, *tenant_lval, *secret_lval, *user_lval, *id_def, *tenant_def, *secret_def; - int i, j, k, l, p, q, ln = 0, readonly_warning = 0, pos; + int i, j, k, l, p, q, ln = 0, readonly_warning = 0, pos, count_vars; CONF_S *ctmpa = NULL, *ctmpb, *first_line; FEATURE_S *feature; PINERC_S *prc = NULL; @@ -795,6 +789,43 @@ alpine_xoauth2_configuration(struct pine *ps, int edit_exceptions) do { ctmpa = first_line = NULL; + for(i = 0, count_vars = 0; xoauth_default[i].name != NULL; i++){ + /* always start with the default configuration */ + for(k = 0, q = 0; lval && lval[k]; k++){ + y = xoauth_parse_client_info(lval[k]); + if(same_xoauth2_info(xoauth_default[i], *y)) + break; + free_xoauth2_info(&y); + } + if(lval == NULL || lval[k] == NULL){ + count_vars += 2; + if(xoauth_default[i].client_secret) count_vars++; + if(xoauth_default[i].tenant) count_vars++; + } + for(k = 0; lval && lval[k]; k++){ + y = xoauth_parse_client_info(lval[k]); + if(y && (!y->name || strcmp(y->name, xoauth_default[i].name))){ + free_xoauth2_info(&y); + continue; + } + count_vars += 2; + if(xoauth_default[i].client_secret != NULL) count_vars++; + if(xoauth_default[i].tenant != NULL) count_vars++; + free_xoauth2_info(&y); + } + } + + for(i = 0; varlist && varlist[i]; i++){ + free_variable_values(varlist[i]); + if(varlist[i]->descrip) fs_give((void **) &varlist[i]->descrip); + if(varlist[i]->dname) fs_give((void **) &varlist[i]->dname); + fs_give((void **) &varlist[i]); + } + if(varlist) fs_give((void **) varlist); + + varlist = fs_get((count_vars + 1)*sizeof(struct variable *)); + memset((void *) varlist, 0, (count_vars +1)*sizeof(struct variable *)); + for(i = 0, p = 0; xoauth_default[i].name != NULL; i++){ /* always start with the default configuration */ for(k = 0, q = 0; lval && lval[k]; k++){ @@ -935,14 +966,6 @@ alpine_xoauth2_configuration(struct pine *ps, int edit_exceptions) } } while (pos >= 0); - for(i = 0; varlist && varlist[i]; i++){ - free_variable_values(varlist[i]); - if(varlist[i]->descrip) fs_give((void **) &varlist[i]->descrip); - if(varlist[i]->dname) fs_give((void **) &varlist[i]->dname); - fs_give((void **) &varlist[i]); - } - if(varlist) fs_give((void **) varlist); - #ifdef _WINDOWS mswin_set_quit_confirm (F_OFF(F_QUIT_WO_CONFIRM, ps_global)); #endif |