description);
smartlist_add(target->country_names, countryname);
added_countries = 1;
- } else if ((strchr(nick,'.') || strchr(nick, '*')) &&
- (p = router_parse_addr_policy_item_from_string(
+ } else if ((strchr(nick,'.') || strchr(nick, ':') || strchr(nick, '*'))
+ && (p = router_parse_addr_policy_item_from_string(
- nick, ADDR_POLICY_REJECT))) {
+ nick, ADDR_POLICY_REJECT,
+ &malformed_list))) {
+ /* IPv4 addresses contain '.', IPv6 addresses contain ':',
+ * and wildcard addresses contain '*'. */
log_debug(LD_CONFIG, "Adding address %s to %s", nick, description);
smartlist_add(target->policies, p);
- } else {
- log_warn(LD_CONFIG, "Entry '%s' in %s is malformed.", nick,
- description);
+ } else if (malformed_list) {
+ log_warn(LD_CONFIG, "Entry '%s' in %s is malformed. Discarding entire"
+ " list.", nick, description);
r = -1;
tor_free(nick);
SMARTLIST_DEL_CURRENT(list, nick);
return NS(mock_addr_policy);
}
- (const char *s, int assume_action));
+ #undef NS_SUBMODULE
+ #define NS_SUBMODULE ASPECT(routerset_parse, policy_ipv4)
+
+ /*
+ * Structural test for routerset_parse, when given a valid IPv4 address
+ * literal policy.
+ */
+
+ NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string,
-NS(router_parse_addr_policy_item_from_string)(const char *s, int assume_action)
++ (const char *s, int assume_action, int *bogus));
+
+ addr_policy_t *NS(mock_addr_policy);
+
+ static void
+ NS(test_main)(void *arg)
+ {
+ routerset_t *set;
+ const char *s;
+ int r;
+ (void)arg;
+
+ NS_MOCK(router_parse_addr_policy_item_from_string);
+ NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t));
+
+ set = routerset_new();
+ s = "127.0.0.1";
+ r = routerset_parse(set, s, "");
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(set->policies), OP_NE, 0);
+ tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1);
+
+ done:
+ routerset_free(set);
+ }
+
+ addr_policy_t *
- (const char *s, int assume_action));
++NS(router_parse_addr_policy_item_from_string)(const char *s, int assume_action,
++ int *bogus)
+ {
+ (void)s;
+ (void)assume_action;
+ CALLED(router_parse_addr_policy_item_from_string)++;
++ *bogus = 0;
+
+ return NS(mock_addr_policy);
+ }
+
+ #undef NS_SUBMODULE
+ #define NS_SUBMODULE ASPECT(routerset_parse, policy_ipv6)
+
+ /*
+ * Structural test for routerset_parse, when given a valid IPv6 address
+ * literal policy.
+ */
+
+ NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string,
-NS(router_parse_addr_policy_item_from_string)(const char *s, int assume_action)
++ (const char *s, int assume_action, int *bad));
+
+ addr_policy_t *NS(mock_addr_policy);
+
+ static void
+ NS(test_main)(void *arg)
+ {
+ routerset_t *set;
+ const char *s;
+ int r;
+ (void)arg;
+
+ NS_MOCK(router_parse_addr_policy_item_from_string);
+ NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t));
+
+ set = routerset_new();
+ s = "::1";
+ r = routerset_parse(set, s, "");
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(set->policies), OP_NE, 0);
+ tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1);
+
+ done:
+ routerset_free(set);
+ }
+
+ addr_policy_t *
++NS(router_parse_addr_policy_item_from_string)(const char *s,
++ int assume_action, int *bad)
+ {
+ (void)s;
+ (void)assume_action;
+ CALLED(router_parse_addr_policy_item_from_string)++;
++ *bad = 0;
+
+ return NS(mock_addr_policy);
+ }
+
#undef NS_SUBMODULE
#define NS_SUBMODULE ASPECT(routerset_union, source_bad)