summaryrefslogtreecommitdiff
path: root/src/cookies.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cookies.c')
-rw-r--r--src/cookies.c19
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)
{