Skip to content

Commit

Permalink
Detect when libevent cannot parse resolv.conf
Browse files Browse the repository at this point in the history
Issue:		#17
Reported by:	Florian Schaefer
  • Loading branch information
droe committed Jan 15, 2014
1 parent a80cbf7 commit 9338200
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 0 deletions.
2 changes: 2 additions & 0 deletions main.t.c
Expand Up @@ -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[])
Expand All @@ -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);
Expand Down
24 changes: 24 additions & 0 deletions proxy.c
Expand Up @@ -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();
Expand All @@ -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);
}
Expand Down
111 changes: 111 additions & 0 deletions pxythrmgr.t.c
@@ -0,0 +1,111 @@
/*
* SSLsplit - transparent and scalable SSL/TLS interception
* Copyright (c) 2009-2014, Daniel Roethlisberger <daniel@roe.ch>
* 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 <string.h>

#include <check.h>

// 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: */

0 comments on commit 9338200

Please sign in to comment.