libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 03e6baf671e2f50696bc1f2e0a28299064081c5a
parent 1e11e972c5089c43061d382cb39a573d3adedcce
Author: Christian Grothoff <christian@grothoff.org>
Date:   Fri,  3 Sep 2010 12:11:11 +0000

fix

Diffstat:
Msrc/daemon/digestauth.c | 37++++++++++++++++++++++++-------------
1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/daemon/digestauth.c b/src/daemon/digestauth.c @@ -205,10 +205,12 @@ lookup_sub_value(char *dest, const char *key) { size_t keylen = strlen(key); + size_t len; const char *ptr = data; const char *eq; const char *q1; const char *q2; + const char *qn; if (0 == size) return 0; @@ -216,17 +218,21 @@ lookup_sub_value(char *dest, { if (NULL == (eq = strstr (ptr, "="))) return 0; - q1 = strstr (eq, "\""); - if (q1 == NULL) + q1 = eq + 1; + while (' ' == *q1) + q1++; + if ('\"' != *q1) { - q1 = eq + 1; q2 = strstr (q1, ","); + qn = q2; } else { - q2 = strstr (q1 + 1, "\""); + q1++; + q2 = strstr (q1, "\""); if (NULL == q2) return 0; /* end quote not found */ + qn = q2 + 1; } if (0 == strncasecmp (ptr, key, @@ -234,26 +240,31 @@ lookup_sub_value(char *dest, { if (q2 == NULL) { + len = strlen (q1) + 1; + if (size > len) + size = len; + size--; strncpy (dest, - q1 + 1, - size - 1); - dest[size-1] = '\0'; - return strlen (dest); + q1, + size); + dest[size] = '\0'; + return size; } else { - if (size >= q2 - q1) - size = (q2 - q1) - 1; + if (size > (q2 - q1) + 1) + size = (q2 - q1) + 1; + size--; memcpy (dest, - q1 + 1, + q1, size); dest[size] = '\0'; return size; } } - if (NULL == q2) + if (NULL == qn) return 0; - ptr = strstr (q2, ","); + ptr = strstr (qn, ","); if (NULL == ptr) return 0; ptr++;