aboutsummaryrefslogtreecommitdiff
path: root/libunbound
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2019-12-28 05:27:06 +0000
committerCy Schubert <cy@FreeBSD.org>2019-12-28 05:27:06 +0000
commite2fe726866d062155f6b1aae749375475ef19191 (patch)
treefe6b00611d5c987d2c12c32063891ae19295ffeb /libunbound
parent366b94c4a9552acfb560d3234aea0955ebc1eb8e (diff)
Vendor import of Unbound 1.9.6.vendor/unbound/1.9.6
Diffstat (limited to 'libunbound')
-rw-r--r--libunbound/context.c11
-rw-r--r--libunbound/context.h6
-rw-r--r--libunbound/libunbound.c24
-rw-r--r--libunbound/libworker.c10
4 files changed, 33 insertions, 18 deletions
diff --git a/libunbound/context.c b/libunbound/context.c
index 20e3680ec3bc..b8fe87d2e580 100644
--- a/libunbound/context.c
+++ b/libunbound/context.c
@@ -57,9 +57,16 @@ context_finalize(struct ub_ctx* ctx)
{
struct config_file* cfg = ctx->env->cfg;
verbosity = cfg->verbosity;
- if(ctx->logfile_override)
+ if(ctx_logfile_overridden && !ctx->logfile_override) {
+ log_file(NULL); /* clear that override */
+ ctx_logfile_overridden = 0;
+ }
+ if(ctx->logfile_override) {
+ ctx_logfile_overridden = 1;
log_file(ctx->log_out);
- else log_init(cfg->logfile, cfg->use_syslog, NULL);
+ } else {
+ log_init(cfg->logfile, cfg->use_syslog, NULL);
+ }
config_apply(cfg);
if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env))
return UB_INITFAIL;
diff --git a/libunbound/context.h b/libunbound/context.h
index 11147226a8cc..78f8731e236e 100644
--- a/libunbound/context.h
+++ b/libunbound/context.h
@@ -52,6 +52,9 @@ struct tube;
struct sldns_buffer;
struct ub_event_base;
+/** store that the logfile has a debug override */
+extern int ctx_logfile_overridden;
+
/**
* The context structure
*
@@ -116,6 +119,9 @@ struct ub_ctx {
/** event base for event oriented interface */
struct ub_event_base* event_base;
+ /** true if the event_base is a pluggable base that is malloced
+ * with a user event base inside, if so, clean up the pluggable alloc*/
+ int event_base_malloced;
/** libworker for event based interface */
struct libworker* event_worker;
diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c
index 5f5a8a10265c..3b30419b315e 100644
--- a/libunbound/libunbound.c
+++ b/libunbound/libunbound.c
@@ -79,18 +79,21 @@
#include <iphlpapi.h>
#endif /* UB_ON_WINDOWS */
+/** store that the logfile has a debug override */
+int ctx_logfile_overridden = 0;
+
/** create context functionality, but no pipes */
static struct ub_ctx* ub_ctx_create_nopipe(void)
{
struct ub_ctx* ctx;
- unsigned int seed;
#ifdef USE_WINSOCK
int r;
WSADATA wsa_data;
#endif
checklock_start();
- log_init(NULL, 0, NULL); /* logs to stderr */
+ if(!ctx_logfile_overridden)
+ log_init(NULL, 0, NULL); /* logs to stderr */
log_ident_set("libunbound");
#ifdef USE_WINSOCK
if((r = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) {
@@ -99,7 +102,7 @@ static struct ub_ctx* ub_ctx_create_nopipe(void)
return NULL;
}
#endif
- verbosity = 0; /* errors only */
+ verbosity = NO_VERBOSE; /* errors only */
checklock_start();
ctx = (struct ub_ctx*)calloc(1, sizeof(*ctx));
if(!ctx) {
@@ -107,15 +110,12 @@ static struct ub_ctx* ub_ctx_create_nopipe(void)
return NULL;
}
alloc_init(&ctx->superalloc, NULL, 0);
- seed = (unsigned int)time(NULL) ^ (unsigned int)getpid();
- if(!(ctx->seed_rnd = ub_initstate(seed, NULL))) {
- explicit_bzero(&seed, sizeof(seed));
+ if(!(ctx->seed_rnd = ub_initstate(NULL))) {
ub_randfree(ctx->seed_rnd);
free(ctx);
errno = ENOMEM;
return NULL;
}
- explicit_bzero(&seed, sizeof(seed));
lock_basic_init(&ctx->qqpipe_lock);
lock_basic_init(&ctx->rrpipe_lock);
lock_basic_init(&ctx->cfglock);
@@ -222,6 +222,7 @@ ub_ctx_create_event(struct event_base* eb)
ub_ctx_delete(ctx);
return NULL;
}
+ ctx->event_base_malloced = 1;
return ctx;
}
@@ -328,6 +329,12 @@ ub_ctx_delete(struct ub_ctx* ctx)
ub_randfree(ctx->seed_rnd);
alloc_clear(&ctx->superalloc);
traverse_postorder(&ctx->queries, delq, NULL);
+ if(ctx_logfile_overridden) {
+ log_file(NULL);
+ ctx_logfile_overridden = 0;
+ }
+ if(ctx->event_base_malloced)
+ free(ctx->event_base);
free(ctx);
#ifdef USE_WINSOCK
WSACleanup();
@@ -469,6 +476,7 @@ int ub_ctx_debugout(struct ub_ctx* ctx, void* out)
{
lock_basic_lock(&ctx->cfglock);
log_file((FILE*)out);
+ ctx_logfile_overridden = 1;
ctx->logfile_override = 1;
ctx->log_out = out;
lock_basic_unlock(&ctx->cfglock);
@@ -1150,7 +1158,7 @@ int
ub_ctx_hosts(struct ub_ctx* ctx, const char* fname)
{
FILE* in;
- char buf[1024], ldata[1024];
+ char buf[1024], ldata[2048];
char* parse, *addr, *name, *ins;
lock_basic_lock(&ctx->cfglock);
if(ctx->finalized) {
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index 01621927eb5b..5c62017a0fc2 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -122,7 +122,6 @@ libworker_delete_event(struct libworker* w)
static struct libworker*
libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
{
- unsigned int seed;
struct libworker* w = (struct libworker*)calloc(1, sizeof(*w));
struct config_file* cfg = ctx->env->cfg;
int* ports;
@@ -177,17 +176,13 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
}
w->env->worker = (struct worker*)w;
w->env->probe_timer = NULL;
- seed = (unsigned int)time(NULL) ^ (unsigned int)getpid() ^
- (((unsigned int)w->thread_num)<<17);
- seed ^= (unsigned int)w->env->alloc->next_id;
if(!w->is_bg || w->is_bg_thread) {
lock_basic_lock(&ctx->cfglock);
}
- if(!(w->env->rnd = ub_initstate(seed, ctx->seed_rnd))) {
+ if(!(w->env->rnd = ub_initstate(ctx->seed_rnd))) {
if(!w->is_bg || w->is_bg_thread) {
lock_basic_unlock(&ctx->cfglock);
}
- explicit_bzero(&seed, sizeof(seed));
libworker_delete(w);
return NULL;
}
@@ -207,7 +202,6 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
hash_set_raninit((uint32_t)ub_random(w->env->rnd));
}
}
- explicit_bzero(&seed, sizeof(seed));
if(eb)
w->base = comm_base_create_event(eb);
@@ -532,7 +526,7 @@ libworker_fillup_fg(struct ctx_query* q, int rcode, sldns_buffer* buf,
}
q->res->rcode = LDNS_RCODE_SERVFAIL;
- q->msg_security = 0;
+ q->msg_security = sec_status_unchecked;
q->msg = memdup(sldns_buffer_begin(buf), sldns_buffer_limit(buf));
q->msg_len = sldns_buffer_limit(buf);
if(!q->msg) {