diff --git a/main.t.c b/main.t.c index 2e77903d..c4b87405 100644 --- a/main.t.c +++ b/main.t.c @@ -78,6 +78,7 @@ Suite * sys_suite(void); Suite * base64_suite(void); Suite * url_suite(void); Suite * util_suite(void); +Suite * pxythrmgr_suite(void); int main(UNUSED int argc, UNUSED char *argv[]) @@ -100,6 +101,7 @@ main(UNUSED int argc, UNUSED char *argv[]) srunner_add_suite(sr, base64_suite()); srunner_add_suite(sr, url_suite()); srunner_add_suite(sr, util_suite()); + srunner_add_suite(sr, pxythrmgr_suite()); srunner_run_all(sr, CK_NORMAL); nfail = srunner_ntests_failed(sr); srunner_free(sr); diff --git a/proxy.c b/proxy.c index 339f7691..78a7c9bd 100644 --- a/proxy.c +++ b/proxy.c @@ -280,6 +280,8 @@ proxy_new(opts_t *opts) { proxy_listener_ctx_t *head; proxy_ctx_t *ctx; + struct evdns_base *dnsbase; + int rc; /* adds locking, only required if accessed from separate threads */ evthread_use_pthreads(); @@ -304,6 +306,28 @@ proxy_new(opts_t *opts) goto leave1; } + /* create a dnsbase here purely for being able to test parsing + * resolv.conf while we can still alert the user about it. */ + dnsbase = evdns_base_new(ctx->evbase, 0); + if (!dnsbase) { + log_err_printf("Error creating dns event base\n"); + goto leave1b; + } + rc = evdns_base_resolv_conf_parse(dnsbase, DNS_OPTIONS_ALL, + "/etc/resolv.conf"); + evdns_base_free(dnsbase, 0); + if (rc != 0) { + log_err_printf("evdns cannot parse resolv.conf: %s (%d)\n", + rc == 1 ? "failed to open file" : + rc == 2 ? "failed to stat file" : + rc == 3 ? "file too large" : + rc == 4 ? "out of memory" : + rc == 5 ? "short read from file" : + rc == 6 ? "no nameservers listed in file" : + "unknown error", rc); + goto leave1b; + } + if (OPTS_DEBUG(opts)) { proxy_debug_base(ctx->evbase); } diff --git a/pxythrmgr.t.c b/pxythrmgr.t.c new file mode 100644 index 00000000..4f9ce444 --- /dev/null +++ b/pxythrmgr.t.c @@ -0,0 +1,111 @@ +/* + * SSLsplit - transparent and scalable SSL/TLS interception + * Copyright (c) 2009-2014, Daniel Roethlisberger + * All rights reserved. + * http://www.roe.ch/SSLsplit + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pxythrmgr.h" + +#include + +#include + +// evdns_base_resolv_conf_parse(base, DNS_OPTIONS_ALL, "/etc/resolv.conf"); + +START_TEST(pxythrmgr_libevent_01) +{ + struct event_base *evbase; + + evbase = event_base_new(); + fail_unless(!!evbase, "no event base"); + event_base_free(evbase); +} +END_TEST + +START_TEST(pxythrmgr_libevent_02) +{ + struct event_base *evbase; + struct evdns_base *dnsbase; + + evbase = event_base_new(); + fail_unless(!!evbase, "no event base"); + dnsbase = evdns_base_new(evbase, 0); + fail_unless(!!dnsbase, "no evdns base"); + evdns_base_free(dnsbase, 0); + event_base_free(evbase); +} +END_TEST + +START_TEST(pxythrmgr_libevent_03) +{ + struct event_base *evbase; + struct evdns_base *dnsbase; + int rc; + + evbase = event_base_new(); + fail_unless(!!evbase, "no event base"); + dnsbase = evdns_base_new(evbase, 0); + fail_unless(!!dnsbase, "no evdns base"); + rc = evdns_base_resolv_conf_parse(dnsbase, DNS_OPTIONS_ALL, + "/etc/resolv.conf"); + fail_unless(rc == 0, "unable to parse resolv.conf"); + evdns_base_free(dnsbase, 0); + event_base_free(evbase); +} +END_TEST + +START_TEST(pxythrmgr_libevent_04) +{ + struct event_base *evbase; + struct evdns_base *dnsbase; + + evbase = event_base_new(); + fail_unless(!!evbase, "no event base"); + dnsbase = evdns_base_new(evbase, 1); + fail_unless(!!dnsbase, "no evdns base"); + evdns_base_free(dnsbase, 0); + event_base_free(evbase); +} +END_TEST + +Suite * +pxythrmgr_suite(void) +{ + Suite *s; + TCase *tc; + + s = suite_create("pxythrmgr"); + + tc = tcase_create("pxythrmgr_libevent"); + tcase_add_test(tc, pxythrmgr_libevent_01); + tcase_add_test(tc, pxythrmgr_libevent_02); + tcase_add_test(tc, pxythrmgr_libevent_03); + tcase_add_test(tc, pxythrmgr_libevent_04); + suite_add_tcase(s, tc); + + return s; +} + +/* vim: set noet ft=c: */