diff options
author | corvid <corvid@lavabit.com> | 2010-03-22 19:45:34 +0000 |
---|---|---|
committer | corvid <corvid@lavabit.com> | 2010-03-22 19:45:34 +0000 |
commit | ac24eebdf9509474b3465d5588bc544f82fe894c (patch) | |
tree | ab96d5f96759a2ed72d92c4e7ad4463fce83357d /src/cookies.c | |
parent | 3c80d1785e36e5400bdf8eea590c9832b89be221 (diff) |
use the most specific cookiesrc rule
Diffstat (limited to 'src/cookies.c')
-rw-r--r-- | src/cookies.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/cookies.c b/src/cookies.c index ea386be5..7b9062e2 100644 --- a/src/cookies.c +++ b/src/cookies.c @@ -234,7 +234,6 @@ static int Cookie_control_init(void) char line[LINE_MAXLEN]; char domain[LINE_MAXLEN]; char rule[LINE_MAXLEN]; - int i, j; bool_t enabled = FALSE; /* Get a file pointer */ @@ -259,8 +258,7 @@ static int Cookie_control_init(void) dStrstrip(line); if (line[0] != '\0' && line[0] != '#') { - i = 0; - j = 0; + int i = 0, j = 0; /* Get the domain */ while (line[i] != '\0' && !dIsspace(line[i])) @@ -295,8 +293,17 @@ static int Cookie_control_init(void) default_action = cc.action; dFree(cc.domain); } else { + int i; + uint_t len = strlen(cc.domain); + + /* Insert into list such that longest rules come first. */ a_List_add(ccontrol, num_ccontrol, num_ccontrol_max); - ccontrol[num_ccontrol++] = cc; + for (i = num_ccontrol++; + i > 0 && (len > strlen(ccontrol[i-1].domain)); + i--) { + ccontrol[i] = ccontrol[i-1]; + } + ccontrol[i] = cc; } if (cc.action != COOKIE_DENY) @@ -310,7 +317,9 @@ static int Cookie_control_init(void) } /* - * Check the rules for an appropriate action for this domain + * Check the rules for an appropriate action for this domain. + * The rules are ordered by domain length, with longest first, so the + * first match is the most specific. */ static CookieControlAction Cookies_control_check_domain(const char *domain) { |