Compare commits

...
4 Commits
3 changed files with 89 additions and 38 deletions

No files matched your search

+56 -18
View File
@@ -379,21 +379,6 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
strcpy(str_addr, str); strcpy(str_addr, str);
} }
/* parse the IP address */
if ((addr_err = parse_server(str_addr, &sdetails)) ||
(addr_err = parse_server_addr(&sdetails)))
{
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
"Invalid IP address '%s': %s",
str, addr_err);
break;
}
/* 0.0.0.0 for server address == NULL, for Dbus */
if (addr.in.sin_family == AF_INET &&
addr.in.sin_addr.s_addr == 0)
flags |= SERV_LITERAL_ADDRESS;
if (strings) if (strings)
{ {
char *p; char *p;
@@ -407,7 +392,31 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
else else
p = NULL; p = NULL;
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str_domain, NULL); if (strings && strlen(str_addr) == 0)
add_update_server(SERV_LITERAL_ADDRESS | SERV_FROM_DBUS, &addr, &source_addr, interface, str_domain, NULL);
else
{
if ((addr_err = parse_server(str_addr, &sdetails)))
{
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
"Invalid IP address '%s': %s",
str, addr_err);
break;
}
while (parse_server_next(&sdetails))
{
if ((addr_err = parse_server_addr(&sdetails)))
{
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
"Invalid IP address '%s': %s",
str, addr_err);
break;
}
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str_domain, NULL);
}
}
} while ((str_domain = p)); } while ((str_domain = p));
} }
else else
@@ -421,11 +430,40 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
if (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING) if (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING)
dbus_message_iter_get_basic(&string_iter, &str); dbus_message_iter_get_basic(&string_iter, &str);
dbus_message_iter_next (&string_iter); dbus_message_iter_next (&string_iter);
if ((addr_err = parse_server(str_addr, &sdetails)))
{
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
"Invalid IP address '%s': %s",
str, addr_err);
break;
}
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str, NULL); while (parse_server_next(&sdetails))
{
if ((addr_err = parse_server_addr(&sdetails)))
{
error = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS,
"Invalid IP address '%s': %s",
str, addr_err);
break;
}
/* 0.0.0.0 for server address == NULL, for Dbus */
if (addr.in.sin_family == AF_INET &&
addr.in.sin_addr.s_addr == 0)
flags |= SERV_LITERAL_ADDRESS;
else
flags &= ~SERV_LITERAL_ADDRESS;
add_update_server(flags | SERV_FROM_DBUS, &addr, &source_addr, interface, str, NULL);
}
} while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING); } while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING);
} }
if (sdetails.resolved)
freeaddrinfo(sdetails.hostinfo);
/* jump to next element in outer array */ /* jump to next element in outer array */
dbus_message_iter_next(&array_iter); dbus_message_iter_next(&array_iter);
} }
+1
View File
@@ -1478,6 +1478,7 @@ void reset_option_bool(unsigned int opt);
struct hostsfile *expand_filelist(struct hostsfile *list); struct hostsfile *expand_filelist(struct hostsfile *list);
char *parse_server(char *arg, struct server_details *sdetails); char *parse_server(char *arg, struct server_details *sdetails);
char *parse_server_addr(struct server_details *sdetails); char *parse_server_addr(struct server_details *sdetails);
int parse_server_next(struct server_details *sdetails);
int option_read_dynfile(char *file, int flags); int option_read_dynfile(char *file, int flags);
/* forward.c */ /* forward.c */
+32 -20
View File
@@ -863,11 +863,13 @@ char *parse_server(char *arg, struct server_details *sdetails)
struct addrinfo hints = { 0 }; struct addrinfo hints = { 0 };
*sdetails->interface = 0; *sdetails->interface = 0;
sdetails->addr_type = AF_UNSPEC;
if (strcmp(arg, "#") == 0) if (strcmp(arg, "#") == 0)
{ {
if (sdetails->flags) if (sdetails->flags)
*sdetails->flags |= SERV_USE_RESOLV; *sdetails->flags |= SERV_USE_RESOLV;
sdetails->addr_type = AF_LOCAL;
sdetails->valid = 1; sdetails->valid = 1;
return NULL; return NULL;
} }
@@ -1047,12 +1049,13 @@ char *parse_server_addr(struct server_details *sdetails)
} }
} }
} }
else else if (sdetails->addr_type != AF_LOCAL)
return _("bad address"); return _("bad address");
return NULL; return NULL;
} }
static int parse_server_next(struct server_details *sdetails) int parse_server_next(struct server_details *sdetails)
{ {
/* Looping over resolved addresses? */ /* Looping over resolved addresses? */
if (sdetails->hostinfo) if (sdetails->hostinfo)
@@ -1157,6 +1160,9 @@ static char *domain_rev4(int from_file, char *server, struct in_addr *addr4, int
if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL)) if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL))
return _("error"); return _("error");
} }
if (sdetails.resolved)
freeaddrinfo(sdetails.hostinfo);
} }
} }
@@ -1237,6 +1243,9 @@ static char *domain_rev6(int from_file, char *server, struct in6_addr *addr6, in
if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL)) if (!add_update_server(flags, &serv_addr, &source_addr, interface, domain, NULL))
return _("error"); return _("error");
} }
if (sdetails.resolved)
freeaddrinfo(sdetails.hostinfo);
} }
} }
@@ -2950,7 +2959,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
case LOPT_LOCAL: /* --local */ case LOPT_LOCAL: /* --local */
case 'A': /* --address */ case 'A': /* --address */
{ {
char *lastdomain = NULL, *domain = ""; char *lastdomain = NULL, *domain = "", *cur_domain;
u16 flags = 0; u16 flags = 0;
char *err; char *err;
union all_addr addr; union all_addr addr;
@@ -3001,9 +3010,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
if (servers_only && option == 'S') if (servers_only && option == 'S')
flags |= SERV_FROM_FILE; flags |= SERV_FROM_FILE;
cur_domain = domain;
while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails)) while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails))
{ {
cur_domain = domain;
if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails))) if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails)))
ret_err(err); ret_err(err);
@@ -3015,24 +3027,24 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
{ {
/* server=//1.2.3.4 is special. */ /* server=//1.2.3.4 is special. */
if (lastdomain) if (lastdomain)
{ {
if (strlen(domain) == 0) if (strlen(cur_domain) == 0)
flags |= SERV_FOR_NODOTS; flags |= SERV_FOR_NODOTS;
else else
flags &= ~SERV_FOR_NODOTS; flags &= ~SERV_FOR_NODOTS;
/* address=/#/ matches the same as without domain */ /* address=/#/ matches the same as without domain */
if (option == 'A' && domain[0] == '#' && domain[1] == 0) if (option == 'A' && cur_domain[0] == '#' && cur_domain[1] == 0)
domain[0] = 0; cur_domain[0] = 0;
} }
if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, domain, &addr)) if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, cur_domain, &addr))
ret_err(gen_err); ret_err(gen_err);
if (!lastdomain || domain == lastdomain) if (!lastdomain || cur_domain == lastdomain)
break; break;
domain += strlen(domain) + 1; cur_domain += strlen(cur_domain) + 1;
} }
if (flags & SERV_LITERAL_ADDRESS) if (flags & SERV_LITERAL_ADDRESS)