|
@@ -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;
|
|
|
}
|
|
|
|