diff --git a/lib/roken/roken_gethostby.c b/lib/roken/roken_gethostby.c index a2dda7e05..f7b5086c4 100644 --- a/lib/roken/roken_gethostby.c +++ b/lib/roken/roken_gethostby.c @@ -84,11 +84,13 @@ setup_int(const char *proxy_host, short proxy_port, return 0; } -static void +static int split_spec(const char *spec, char **host, int *port, char **path, int def_port) { char *p; *host = strdup(spec); + if (*host == NULL) + return -1; p = strchr(*host, ':'); if(p) { *p++ = '\0'; @@ -98,12 +100,16 @@ split_spec(const char *spec, char **host, int *port, char **path, int def_port) *port = def_port; p = strchr(p ? p : *host, '/'); if(p) { - if(path) + if(path) { *path = strdup(p); + if (*path == NULL) + return -1; + } *p = '\0'; }else if(path) *path = NULL; + return 0; } @@ -112,17 +118,22 @@ roken_gethostby_setup(const char *proxy_spec, const char *dns_spec) { char *proxy_host = NULL; int proxy_port = 0; - char *dns_host, *dns_path; + char *dns_host = NULL, *dns_path = NULL; int dns_port; + int ret; - int ret = -1; - - split_spec(dns_spec, &dns_host, &dns_port, &dns_path, 80); - if(dns_path == NULL) + ret = split_spec(dns_spec, &dns_host, &dns_port, &dns_path, 80); + if(ret) goto out; - if(proxy_spec) - split_spec(proxy_spec, &proxy_host, &proxy_port, NULL, 80); + if(proxy_spec) { + ret = split_spec(proxy_spec, &proxy_host, &proxy_port, NULL, 80); + if (ret) + goto out; + } ret = setup_int(proxy_host, proxy_port, dns_host, dns_port, dns_path); + if (ret) + goto out; + out: free(proxy_host); free(dns_host);