--- modules/aaa/mod_auth_digest.c (révision 1411845) +++ modules/aaa/mod_auth_digest.c (copie de travail) @@ -91,7 +91,7 @@ const char *dir_name; authn_provider_list *providers; const char *realm; - char **qop_list; + apr_array_header_t *qop_list; apr_sha1_ctx_t nonce_ctx; apr_time_t nonce_lifetime; const char *nonce_format; @@ -451,8 +451,7 @@ conf = (digest_config_rec *) apr_pcalloc(p, sizeof(digest_config_rec)); if (conf) { - conf->qop_list = apr_palloc(p, sizeof(char*)); - conf->qop_list[0] = NULL; + conf->qop_list = apr_array_make(p, 10, sizeof(char *)); conf->nonce_lifetime = DFLT_NONCE_LIFE; conf->dir_name = apr_pstrdup(p, dir); conf->algorithm = DFLT_ALGORITHM; @@ -532,15 +531,10 @@ static const char *set_qop(cmd_parms *cmd, void *config, const char *op) { digest_config_rec *conf = (digest_config_rec *) config; - char **tmp; - int cnt; if (!strcasecmp(op, "none")) { - if (conf->qop_list[0] == NULL) { - conf->qop_list = apr_palloc(cmd->pool, 2 * sizeof(char*)); - conf->qop_list[1] = NULL; - } - conf->qop_list[0] = "none"; + apr_array_clear(conf->qop_list); + *(const char **)apr_array_push(conf->qop_list) = "none"; return NULL; } @@ -551,15 +545,8 @@ return apr_pstrcat(cmd->pool, "Unrecognized qop: ", op, NULL); } - for (cnt = 0; conf->qop_list[cnt] != NULL; cnt++) - ; + *(const char **)apr_array_push(conf->qop_list) = apr_pstrdup(cmd->pool, op); - tmp = apr_palloc(cmd->pool, (cnt + 2) * sizeof(char*)); - memcpy(tmp, conf->qop_list, cnt*sizeof(char*)); - tmp[cnt] = apr_pstrdup(cmd->pool, op); - tmp[cnt+1] = NULL; - conf->qop_list = tmp; - return NULL; } @@ -1251,19 +1238,17 @@ const char *qop, *opaque, *opaque_param, *domain, *nonce; /* Setup qop */ - if (conf->qop_list[0] == NULL) { + if (apr_is_empty_array(conf->qop_list)) { qop = ", qop=\"auth\""; } - else if (!strcasecmp(conf->qop_list[0], "none")) { + else if (!strcasecmp(*(const char **)(conf->qop_list->elts), "none")) { qop = ""; } else { - int cnt; - qop = apr_pstrcat(r->pool, ", qop=\"", conf->qop_list[0], NULL); - for (cnt = 1; conf->qop_list[cnt] != NULL; cnt++) { - qop = apr_pstrcat(r->pool, qop, ",", conf->qop_list[cnt], NULL); - } - qop = apr_pstrcat(r->pool, qop, "\"", NULL); + qop = apr_pstrcat(r->pool, ", qop=\"", + apr_array_pstrcat(r->pool, conf->qop_list, ','), + "\"", + NULL); } /* Setup opaque */ @@ -1464,9 +1449,8 @@ return OK; } - if ((conf->qop_list != NULL) - &&(conf->qop_list[0] != NULL) - &&!strcasecmp(conf->qop_list[0], "none")) { + if (!apr_is_empty_array(conf->qop_list) && + !strcasecmp(*(const char **)(conf->qop_list->elts), "none")) { /* qop is none, client must not send a nonce count */ if (snc != NULL) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01772) @@ -1893,15 +1877,17 @@ else { const char *exp_digest; int match = 0, idx; - for (idx = 0; conf->qop_list[idx] != NULL; idx++) { - if (!strcasecmp(conf->qop_list[idx], resp->message_qop)) { + const char **tmp = (const char **)(conf->qop_list->elts); + for (idx = 0; idx < conf->qop_list->nelts; idx++) { + if (!strcasecmp(*tmp, resp->message_qop)) { match = 1; break; } + ++tmp; } if (!match - && !(conf->qop_list[0] == NULL + && !(apr_is_empty_array(conf->qop_list) && !strcasecmp(resp->message_qop, "auth"))) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01793) "invalid qop `%s' received: %s", @@ -1983,7 +1969,8 @@ /* do rfc-2069 digest */ - if (conf->qop_list[0] && !strcasecmp(conf->qop_list[0], "none") + if (!apr_is_empty_array(conf->qop_list) && + !strcasecmp(*(const char **)(conf->qop_list->elts), "none") && resp->message_qop == NULL) { /* use only RFC-2069 format */ ai = nextnonce;