summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcorvid <corvid@lavabit.com>2010-01-13 21:43:58 +0000
committercorvid <corvid@lavabit.com>2010-01-13 21:43:58 +0000
commitf8afde1435b04f0b4f48993572e892c2a2a65154 (patch)
tree7e7882837d1f6316dcdef2066c24ce29a039429d
parent6ccd839d091c6e05c68cae7e6a9303aa05412543 (diff)
cookies: be more robust in rejecting IP addr partial matches
The code was already such that, even if we accepted 123.45 as a domain for host 1.2.123.45, it wouldn't be sent back to anyone. But it would be easy to make some small change later that would break that, so...
-rw-r--r--dpi/cookies.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/dpi/cookies.c b/dpi/cookies.c
index 709f3be3..82075020 100644
--- a/dpi/cookies.c
+++ b/dpi/cookies.c
@@ -793,6 +793,31 @@ static int Cookies_cmp(const void *a, const void *b)
}
/*
+ * Is the domain an IP address?
+ */
+static bool_t Cookies_domain_is_ip(const char *domain)
+{
+ uint_t len;
+
+ if (!domain)
+ return FALSE;
+
+ len = strlen(domain);
+
+ if (len == strspn(domain, "0123456789.")) {
+ MSG("an IPv4 address\n");
+ return TRUE;
+ }
+ if (*domain == '[' &&
+ (len == strspn(domain, "0123456789abcdefABCDEF:.[]"))) {
+ /* The precise format is shown in section 3.2.2 of rfc 3986 */
+ MSG("an IPv6 address\n");
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*
* Check whether url_path path-matches cookie_path
*
* Note different user agents apparently vary in path-matching behaviour,
@@ -858,6 +883,9 @@ static bool_t Cookies_domain_matches(char *A, char *B)
if (!dStrcasecmp(A, B))
return TRUE;
+ if (Cookies_domain_is_ip(B))
+ return FALSE;
+
diff = strlen(A) - strlen(B);
if (diff > 0) {
@@ -922,31 +950,6 @@ static uint_t Cookies_internal_dots_required(const char *host)
}
/*
- * Is the domain an IP address?
- */
-static bool_t Cookies_domain_is_ip(const char *domain)
-{
- uint_t len;
-
- if (!domain)
- return FALSE;
-
- len = strlen(domain);
-
- if (len == strspn(domain, "0123456789.")) {
- MSG("an IPv4 address\n");
- return TRUE;
- }
- if (*domain == '[' &&
- (len == strspn(domain, "0123456789abcdefABCDEF:.[]"))) {
- /* The precise format is shown in section 3.2.2 of rfc 3986 */
- MSG("an IPv6 address\n");
- return TRUE;
- }
- return FALSE;
-}
-
-/*
* Validate cookies domain against some security checks.
*/
static bool_t Cookies_validate_domain(CookieData_t *cookie, char *host)