From ac24eebdf9509474b3465d5588bc544f82fe894c Mon Sep 17 00:00:00 2001 From: corvid Date: Mon, 22 Mar 2010 19:45:34 +0000 Subject: use the most specific cookiesrc rule --- src/cookies.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src') 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) { -- cgit v1.2.3