diff --git a/mongoose.c b/mongoose.c index 85ba9600fd52dc480c402a9f6be7c68388cfd203..8d92ecb640c4b4dfab2ab8e3b1047b84c83034c8 100644 --- a/mongoose.c +++ b/mongoose.c @@ -1706,32 +1706,37 @@ int mg_get_cookie(const struct mg_connection *conn, const char *cookie_name, const char *s, *p, *end; int name_len, len = -1; - dst[0] = '\0'; - if ((s = mg_get_header(conn, "Cookie")) == NULL) { - return -1; - } - - name_len = (int) strlen(cookie_name); - end = s + strlen(s); + if (dst == NULL || dst_size == 0) { + len = -2; + } else if (cookie_name == NULL || (s = mg_get_header(conn, "Cookie")) == NULL) { + len = -1; + dst[0] = '\0'; + } else { + name_len = (int) strlen(cookie_name); + end = s + strlen(s); + dst[0] = '\0'; - for (; (s = strstr(s, cookie_name)) != NULL; s += name_len) - if (s[name_len] == '=') { - s += name_len + 1; - if ((p = strchr(s, ' ')) == NULL) - p = end; - if (p[-1] == ';') - p--; - if (*s == '"' && p[-1] == '"' && p > s + 1) { - s++; - p--; - } - if ((size_t) (p - s) < dst_size) { - len = p - s; - mg_strlcpy(dst, s, (size_t) len + 1); + for (; (s = strstr(s, cookie_name)) != NULL; s += name_len) { + if (s[name_len] == '=') { + s += name_len + 1; + if ((p = strchr(s, ' ')) == NULL) + p = end; + if (p[-1] == ';') + p--; + if (*s == '"' && p[-1] == '"' && p > s + 1) { + s++; + p--; + } + if ((size_t) (p - s) < dst_size) { + len = p - s; + mg_strlcpy(dst, s, (size_t) len + 1); + } else { + len = -2; + } + break; } - break; } - + } return len; } diff --git a/mongoose.h b/mongoose.h index a9f98c34c1678a56ba254b08a701da7747127f07..18f3439508416db38cee47d4695efa83268caf6f 100644 --- a/mongoose.h +++ b/mongoose.h @@ -308,9 +308,9 @@ int mg_get_var(const char *data, size_t data_len, // // Return: // On success, value length. -// On error, -1 (either "Cookie:" header is not present at all, or the -// requested parameter is not found, or destination buffer is too small -// to hold the value). +// On error: +// -1 (either "Cookie:" header is not present at all or the requested parameter is not found). +// -2 (destination buffer is NULL, zero length or too small to hold the value). int mg_get_cookie(const struct mg_connection *, const char *cookie_name, char *buf, size_t buf_len);