You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by sf...@apache.org on 2013/03/31 22:10:44 UTC

svn commit: r1463044 - /httpd/httpd/trunk/modules/aaa/mod_auth_digest.c

Author: sf
Date: Sun Mar 31 20:10:43 2013
New Revision: 1463044

URL: http://svn.apache.org/r1463044
Log:
use apr_array for an array
    
Submitted by: Christophe JAILLET (with small tweaks by myself)
PR: 52881

Modified:
    httpd/httpd/trunk/modules/aaa/mod_auth_digest.c

Modified: httpd/httpd/trunk/modules/aaa/mod_auth_digest.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/aaa/mod_auth_digest.c?rev=1463044&r1=1463043&r2=1463044&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/aaa/mod_auth_digest.c (original)
+++ httpd/httpd/trunk/modules/aaa/mod_auth_digest.c Sun Mar 31 20:10:43 2013
@@ -91,7 +91,7 @@ typedef struct digest_config_struct {
     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 @@ static void *create_digest_dir_config(ap
 
     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, 2, 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 *add_authn_provider(cm
 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,14 +545,7 @@ static const char *set_qop(cmd_parms *cm
         return apr_pstrcat(cmd->pool, "Unrecognized qop: ", op, NULL);
     }
 
-    for (cnt = 0; conf->qop_list[cnt] != NULL; cnt++)
-        ;
-
-    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;
+    *(const char **)apr_array_push(conf->qop_list) = op;
 
     return NULL;
 }
@@ -1244,19 +1231,17 @@ static void note_digest_auth_failure(req
     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 */
@@ -1457,9 +1442,8 @@ static int check_nc(const request_rec *r
         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)
@@ -1886,15 +1870,17 @@ static int authenticate_digest_user(requ
     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",
@@ -1976,7 +1962,8 @@ static int add_auth_info(request_rec *r)
 
     /* 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;