|
|
ff8013 |
diff --git a/config.h.in b/config.h.in
|
|
|
ff8013 |
index 04356f3..3b06bfa 100644
|
|
|
ff8013 |
--- a/config.h.in
|
|
|
ff8013 |
+++ b/config.h.in
|
|
|
ff8013 |
@@ -666,6 +666,9 @@
|
|
|
ff8013 |
/* Shared data */
|
|
|
ff8013 |
#undef SHARE_DIR
|
|
|
ff8013 |
|
|
|
ff8013 |
+/* The size of `size_t', as computed by sizeof. */
|
|
|
ff8013 |
+#undef SIZEOF_SIZE_T
|
|
|
ff8013 |
+
|
|
|
ff8013 |
/* The size of `time_t', as computed by sizeof. */
|
|
|
ff8013 |
#undef SIZEOF_TIME_T
|
|
|
ff8013 |
|
|
|
ff8013 |
diff --git a/configure.ac b/configure.ac
|
|
|
ff8013 |
index c5e0c7b..1bff4ed 100644
|
|
|
ff8013 |
--- a/configure.ac
|
|
|
ff8013 |
+++ b/configure.ac
|
|
|
ff8013 |
@@ -371,6 +371,7 @@ AC_INCLUDES_DEFAULT
|
|
|
ff8013 |
# endif
|
|
|
ff8013 |
#endif
|
|
|
ff8013 |
])
|
|
|
ff8013 |
+AC_CHECK_SIZEOF(size_t)
|
|
|
ff8013 |
|
|
|
ff8013 |
# add option to disable the evil rpath
|
|
|
ff8013 |
ACX_ARG_RPATH
|
|
|
ff8013 |
diff --git a/contrib/create_unbound_ad_servers.sh b/contrib/create_unbound_ad_servers.sh
|
|
|
ff8013 |
index d31f078..49fdbff 100644
|
|
|
ff8013 |
--- a/contrib/create_unbound_ad_servers.sh
|
|
|
ff8013 |
+++ b/contrib/create_unbound_ad_servers.sh
|
|
|
ff8013 |
@@ -9,12 +9,13 @@
|
|
|
ff8013 |
# Variables
|
|
|
ff8013 |
dst_dir="/etc/opt/csw/unbound"
|
|
|
ff8013 |
work_dir="/tmp"
|
|
|
ff8013 |
-list_addr="http://pgl.yoyo.org/adservers/serverlist.php?hostformat=nohtml&showintro=1&startdate%5Bday%5D=&startdate%5Bmonth%5D=&startdate%5Byear%5D="
|
|
|
ff8013 |
+list_addr="https://pgl.yoyo.org/adservers/serverlist.php?hostformat=nohtml&showintro=1&startdate%5Bday%5D=&startdate%5Bmonth%5D=&startdate%5Byear%5D="
|
|
|
ff8013 |
|
|
|
ff8013 |
# OS commands
|
|
|
ff8013 |
CAT=`which cat`
|
|
|
ff8013 |
ECHO=`which echo`
|
|
|
ff8013 |
WGET=`which wget`
|
|
|
ff8013 |
+TR=`which tr`
|
|
|
ff8013 |
|
|
|
ff8013 |
# Check Wget installed
|
|
|
ff8013 |
if [ ! -f $WGET ]; then
|
|
|
ff8013 |
@@ -22,8 +23,10 @@ if [ ! -f $WGET ]; then
|
|
|
ff8013 |
exit 1
|
|
|
ff8013 |
fi
|
|
|
ff8013 |
|
|
|
ff8013 |
+# remove special characters with tr to protect unbound.conf
|
|
|
ff8013 |
$WGET -O $work_dir/yoyo_ad_servers "$list_addr" && \
|
|
|
ff8013 |
$CAT $work_dir/yoyo_ad_servers | \
|
|
|
ff8013 |
+$TR -d '";$\\' | \
|
|
|
ff8013 |
while read line ; \
|
|
|
ff8013 |
do \
|
|
|
ff8013 |
$ECHO "local-zone: \"$line\" redirect" ;\
|
|
|
ff8013 |
@@ -36,4 +39,4 @@ echo "Done."
|
|
|
ff8013 |
# the unbound_ad_servers file:
|
|
|
ff8013 |
#
|
|
|
ff8013 |
# include: $dst_dir/unbound_ad_servers
|
|
|
ff8013 |
-#
|
|
|
ff8013 |
\ No newline at end of file
|
|
|
ff8013 |
+#
|
|
|
ff8013 |
diff --git a/daemon/daemon.c b/daemon/daemon.c
|
|
|
ff8013 |
index 6820e11..1b4f329 100644
|
|
|
ff8013 |
--- a/daemon/daemon.c
|
|
|
ff8013 |
+++ b/daemon/daemon.c
|
|
|
ff8013 |
@@ -426,9 +426,7 @@ daemon_create_workers(struct daemon* daemon)
|
|
|
ff8013 |
int* shufport;
|
|
|
ff8013 |
log_assert(daemon && daemon->cfg);
|
|
|
ff8013 |
if(!daemon->rand) {
|
|
|
ff8013 |
- unsigned int seed = (unsigned int)time(NULL) ^
|
|
|
ff8013 |
- (unsigned int)getpid() ^ 0x438;
|
|
|
ff8013 |
- daemon->rand = ub_initstate(seed, NULL);
|
|
|
ff8013 |
+ daemon->rand = ub_initstate(NULL);
|
|
|
ff8013 |
if(!daemon->rand)
|
|
|
ff8013 |
fatal_exit("could not init random generator");
|
|
|
ff8013 |
hash_set_raninit((uint32_t)ub_random(daemon->rand));
|
|
|
ff8013 |
diff --git a/daemon/worker.c b/daemon/worker.c
|
|
|
ff8013 |
index 3acecc1..8354010 100644
|
|
|
ff8013 |
--- a/daemon/worker.c
|
|
|
ff8013 |
+++ b/daemon/worker.c
|
|
|
ff8013 |
@@ -1629,18 +1629,14 @@ worker_create(struct daemon* daemon, int id, int* ports, int n)
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
/* create random state here to avoid locking trouble in RAND_bytes */
|
|
|
ff8013 |
- seed = (unsigned int)time(NULL) ^ (unsigned int)getpid() ^
|
|
|
ff8013 |
- (((unsigned int)worker->thread_num)<<17);
|
|
|
ff8013 |
- /* shift thread_num so it does not match out pid bits */
|
|
|
ff8013 |
- if(!(worker->rndstate = ub_initstate(seed, daemon->rand))) {
|
|
|
ff8013 |
- seed = 0;
|
|
|
ff8013 |
+ if(!(worker->rndstate = ub_initstate(daemon->rand))) {
|
|
|
ff8013 |
log_err("could not init random numbers.");
|
|
|
ff8013 |
tube_delete(worker->cmd);
|
|
|
ff8013 |
free(worker->ports);
|
|
|
ff8013 |
free(worker);
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- seed = 0;
|
|
|
ff8013 |
+ explicit_bzero(&seed, sizeof(seed));
|
|
|
ff8013 |
#ifdef USE_DNSTAP
|
|
|
ff8013 |
if(daemon->cfg->dnstap) {
|
|
|
ff8013 |
log_assert(daemon->dtenv != NULL);
|
|
|
ff8013 |
diff --git a/dns64/dns64.c b/dns64/dns64.c
|
|
|
ff8013 |
index 7889d72..300202c 100644
|
|
|
ff8013 |
--- a/dns64/dns64.c
|
|
|
ff8013 |
+++ b/dns64/dns64.c
|
|
|
ff8013 |
@@ -782,6 +782,16 @@ dns64_inform_super(struct module_qstate* qstate, int id,
|
|
|
ff8013 |
* Signal that the sub-query is finished, no matter whether we are
|
|
|
ff8013 |
* successful or not. This lets the state machine terminate.
|
|
|
ff8013 |
*/
|
|
|
ff8013 |
+ if(!super->minfo[id]) {
|
|
|
ff8013 |
+ super->minfo[id] = (enum dns64_qstate *)regional_alloc(super->region,
|
|
|
ff8013 |
+ sizeof(*(super->minfo[id])));
|
|
|
ff8013 |
+ if(!super->minfo[id]) {
|
|
|
ff8013 |
+ log_err("out of memory");
|
|
|
ff8013 |
+ super->return_rcode = LDNS_RCODE_SERVFAIL;
|
|
|
ff8013 |
+ super->return_msg = NULL;
|
|
|
ff8013 |
+ return;
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
super->minfo[id] = (void*)DNS64_SUBQUERY_FINISHED;
|
|
|
ff8013 |
|
|
|
ff8013 |
/* If there is no successful answer, we're done. */
|
|
|
ff8013 |
diff --git a/dnscrypt/dnscrypt.c b/dnscrypt/dnscrypt.c
|
|
|
ff8013 |
index 3545d3d..7dd2ce5 100644
|
|
|
ff8013 |
--- a/dnscrypt/dnscrypt.c
|
|
|
ff8013 |
+++ b/dnscrypt/dnscrypt.c
|
|
|
ff8013 |
@@ -732,6 +732,11 @@ dnsc_load_local_data(struct dnsc_env* dnscenv, struct config_file *cfg)
|
|
|
ff8013 |
);
|
|
|
ff8013 |
continue;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
+ if((unsigned)strlen(dnscenv->provider_name) >= (unsigned)0xffff0000) {
|
|
|
ff8013 |
+ /* guard against integer overflow in rrlen calculation */
|
|
|
ff8013 |
+ verbose(VERB_OPS, "cert #%" PRIu32 " is too long", serial);
|
|
|
ff8013 |
+ continue;
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
rrlen = strlen(dnscenv->provider_name) +
|
|
|
ff8013 |
strlen(ttl_class_type) +
|
|
|
ff8013 |
4 * sizeof(struct SignedCert) + // worst case scenario
|
|
|
ff8013 |
diff --git a/doc/Changelog b/doc/Changelog
|
|
|
ff8013 |
index bb74461..4cb080e 100644
|
|
|
ff8013 |
--- a/doc/Changelog
|
|
|
ff8013 |
+++ b/doc/Changelog
|
|
|
ff8013 |
@@ -1,3 +1,55 @@
|
|
|
ff8013 |
+3 December 2019: Wouter
|
|
|
ff8013 |
+ - Fix Assert Causing DoS in synth_cname(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Assert Causing DoS in dname_pkt_copy(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix OOB Read in sldns_wire2str_dname_scan(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out of Bounds Write in sldns_str2wire_str_buf(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out of Bounds Write in sldns_b64_pton(),
|
|
|
ff8013 |
+ fixed by check in sldns_str2wire_int16_data_buf(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Insufficient Handling of Compressed Names in dname_pkt_copy(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out of Bound Write Compressed Names in rdata_copy(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Hang in sldns_wire2str_pkt_scan(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+
|
|
|
ff8013 |
+20 November 2019: Wouter
|
|
|
ff8013 |
+ - Fix Out of Bounds Read in rrinternal_get_owner(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Race Condition in autr_tp_create(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Shared Memory World Writeable,
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Adjust unbound-control to make stats_shm a read only operation.
|
|
|
ff8013 |
+ - Fix Weak Entropy Used For Nettle,
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Randomness Error not Handled Properly,
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out-of-Bounds Read in dname_valid(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Config Injection in create_unbound_ad_servers.sh,
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+
|
|
|
ff8013 |
+19 November 2019: Wouter
|
|
|
ff8013 |
+ - Fix Integer Overflow in Regional Allocator,
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Unchecked NULL Pointer in dns64_inform_super()
|
|
|
ff8013 |
+ and ipsecmod_new(), reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out-of-bounds Read in rr_comment_dnskey(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Integer Overflows in Size Calculations,
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Integer Overflow to Buffer Overflow in
|
|
|
ff8013 |
+ sldns_str2wire_dname_buf_origin(), reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out of Bounds Read in sldns_str2wire_dname(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+ - Fix Out of Bounds Write in sldns_bget_token_par(),
|
|
|
ff8013 |
+ reported by X41 D-Sec.
|
|
|
ff8013 |
+
|
|
|
ff8013 |
30 November 2018: Wouter
|
|
|
ff8013 |
- log-tag-queryreply: yes in unbound.conf tags the log-queries and
|
|
|
ff8013 |
log-replies in the log file for easier log filter maintenance.
|
|
|
ff8013 |
diff --git a/ipsecmod/ipsecmod.c b/ipsecmod/ipsecmod.c
|
|
|
ff8013 |
index 3572f12..1422a62 100644
|
|
|
ff8013 |
--- a/ipsecmod/ipsecmod.c
|
|
|
ff8013 |
+++ b/ipsecmod/ipsecmod.c
|
|
|
ff8013 |
@@ -103,11 +103,11 @@ ipsecmod_new(struct module_qstate* qstate, int id)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
struct ipsecmod_qstate* iq = (struct ipsecmod_qstate*)regional_alloc(
|
|
|
ff8013 |
qstate->region, sizeof(struct ipsecmod_qstate));
|
|
|
ff8013 |
- memset(iq, 0, sizeof(*iq));
|
|
|
ff8013 |
qstate->minfo[id] = iq;
|
|
|
ff8013 |
if(!iq)
|
|
|
ff8013 |
return 0;
|
|
|
ff8013 |
/* Initialise it. */
|
|
|
ff8013 |
+ memset(iq, 0, sizeof(*iq));
|
|
|
ff8013 |
iq->enabled = qstate->env->cfg->ipsecmod_enabled;
|
|
|
ff8013 |
iq->is_whitelisted = ipsecmod_domain_is_whitelisted(
|
|
|
ff8013 |
(struct ipsecmod_env*)qstate->env->modinfo[id], qstate->qinfo.qname,
|
|
|
ff8013 |
diff --git a/iterator/iter_scrub.c b/iterator/iter_scrub.c
|
|
|
ff8013 |
index 8230d17..942c3d5 100644
|
|
|
ff8013 |
--- a/iterator/iter_scrub.c
|
|
|
ff8013 |
+++ b/iterator/iter_scrub.c
|
|
|
ff8013 |
@@ -231,6 +231,10 @@ synth_cname(uint8_t* qname, size_t qnamelen, struct rrset_parse* dname_rrset,
|
|
|
ff8013 |
size_t dtarglen;
|
|
|
ff8013 |
if(!parse_get_cname_target(dname_rrset, &dtarg, &dtarglen, pkt))
|
|
|
ff8013 |
return 0;
|
|
|
ff8013 |
+ if(qnamelen <= dname_rrset->dname_len)
|
|
|
ff8013 |
+ return 0;
|
|
|
ff8013 |
+ if(qnamelen == 0)
|
|
|
ff8013 |
+ return 0;
|
|
|
ff8013 |
log_assert(qnamelen > dname_rrset->dname_len);
|
|
|
ff8013 |
/* DNAME from com. to net. with qname example.com. -> example.net. */
|
|
|
ff8013 |
/* so: \3com\0 to \3net\0 and qname \7example\3com\0 */
|
|
|
ff8013 |
diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c
|
|
|
ff8013 |
index 275e8d2..a8979c2 100644
|
|
|
ff8013 |
--- a/libunbound/libunbound.c
|
|
|
ff8013 |
+++ b/libunbound/libunbound.c
|
|
|
ff8013 |
@@ -83,7 +83,6 @@
|
|
|
ff8013 |
static struct ub_ctx* ub_ctx_create_nopipe(void)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
struct ub_ctx* ctx;
|
|
|
ff8013 |
- unsigned int seed;
|
|
|
ff8013 |
#ifdef USE_WINSOCK
|
|
|
ff8013 |
int r;
|
|
|
ff8013 |
WSADATA wsa_data;
|
|
|
ff8013 |
@@ -107,15 +106,12 @@ static struct ub_ctx* ub_ctx_create_nopipe(void)
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
alloc_init(&ctx->superalloc, NULL, 0);
|
|
|
ff8013 |
- seed = (unsigned int)time(NULL) ^ (unsigned int)getpid();
|
|
|
ff8013 |
- if(!(ctx->seed_rnd = ub_initstate(seed, NULL))) {
|
|
|
ff8013 |
- seed = 0;
|
|
|
ff8013 |
+ if(!(ctx->seed_rnd = ub_initstate(NULL))) {
|
|
|
ff8013 |
ub_randfree(ctx->seed_rnd);
|
|
|
ff8013 |
free(ctx);
|
|
|
ff8013 |
errno = ENOMEM;
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- seed = 0;
|
|
|
ff8013 |
lock_basic_init(&ctx->qqpipe_lock);
|
|
|
ff8013 |
lock_basic_init(&ctx->rrpipe_lock);
|
|
|
ff8013 |
lock_basic_init(&ctx->cfglock);
|
|
|
ff8013 |
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
|
|
|
ff8013 |
index 3dcaa78..07a08c6 100644
|
|
|
ff8013 |
--- a/libunbound/libworker.c
|
|
|
ff8013 |
+++ b/libunbound/libworker.c
|
|
|
ff8013 |
@@ -122,7 +122,6 @@ libworker_delete_event(struct libworker* w)
|
|
|
ff8013 |
static struct libworker*
|
|
|
ff8013 |
libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
- unsigned int seed;
|
|
|
ff8013 |
struct libworker* w = (struct libworker*)calloc(1, sizeof(*w));
|
|
|
ff8013 |
struct config_file* cfg = ctx->env->cfg;
|
|
|
ff8013 |
int* ports;
|
|
|
ff8013 |
@@ -177,17 +176,13 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
|
|
|
ff8013 |
}
|
|
|
ff8013 |
w->env->worker = (struct worker*)w;
|
|
|
ff8013 |
w->env->probe_timer = NULL;
|
|
|
ff8013 |
- seed = (unsigned int)time(NULL) ^ (unsigned int)getpid() ^
|
|
|
ff8013 |
- (((unsigned int)w->thread_num)<<17);
|
|
|
ff8013 |
- seed ^= (unsigned int)w->env->alloc->next_id;
|
|
|
ff8013 |
if(!w->is_bg || w->is_bg_thread) {
|
|
|
ff8013 |
lock_basic_lock(&ctx->cfglock);
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- if(!(w->env->rnd = ub_initstate(seed, ctx->seed_rnd))) {
|
|
|
ff8013 |
+ if(!(w->env->rnd = ub_initstate(ctx->seed_rnd))) {
|
|
|
ff8013 |
if(!w->is_bg || w->is_bg_thread) {
|
|
|
ff8013 |
lock_basic_unlock(&ctx->cfglock);
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- seed = 0;
|
|
|
ff8013 |
libworker_delete(w);
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
@@ -207,7 +202,6 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
|
|
|
ff8013 |
hash_set_raninit((uint32_t)ub_random(w->env->rnd));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- seed = 0;
|
|
|
ff8013 |
|
|
|
ff8013 |
if(eb)
|
|
|
ff8013 |
w->base = comm_base_create_event(eb);
|
|
|
ff8013 |
diff --git a/respip/respip.c b/respip/respip.c
|
|
|
ff8013 |
index 2e9313f..7d2a588 100644
|
|
|
ff8013 |
--- a/respip/respip.c
|
|
|
ff8013 |
+++ b/respip/respip.c
|
|
|
ff8013 |
@@ -475,10 +475,16 @@ copy_rrset(const struct ub_packed_rrset_key* key, struct regional* region)
|
|
|
ff8013 |
if(!ck->rk.dname)
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
|
|
|
ff8013 |
+ if((unsigned)data->count >= 0xffff00U)
|
|
|
ff8013 |
+ return NULL; /* guard against integer overflow in dsize */
|
|
|
ff8013 |
dsize = sizeof(struct packed_rrset_data) + data->count *
|
|
|
ff8013 |
(sizeof(size_t)+sizeof(uint8_t*)+sizeof(time_t));
|
|
|
ff8013 |
- for(i=0; i<data->count; i++)
|
|
|
ff8013 |
+ for(i=0; i<data->count; i++) {
|
|
|
ff8013 |
+ if((unsigned)dsize >= 0x0fffffffU ||
|
|
|
ff8013 |
+ (unsigned)data->rr_len[i] >= 0x0fffffffU)
|
|
|
ff8013 |
+ return NULL; /* guard against integer overflow */
|
|
|
ff8013 |
dsize += data->rr_len[i];
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
d = regional_alloc(region, dsize);
|
|
|
ff8013 |
if(!d)
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
diff --git a/sldns/parse.c b/sldns/parse.c
|
|
|
ff8013 |
index b62c405..b30264e 100644
|
|
|
ff8013 |
--- a/sldns/parse.c
|
|
|
ff8013 |
+++ b/sldns/parse.c
|
|
|
ff8013 |
@@ -325,8 +325,14 @@ sldns_bget_token_par(sldns_buffer *b, char *token, const char *delim,
|
|
|
ff8013 |
if (c == '\n' && p != 0) {
|
|
|
ff8013 |
/* in parentheses */
|
|
|
ff8013 |
/* do not write ' ' if we want to skip spaces */
|
|
|
ff8013 |
- if(!(skipw && (strchr(skipw, c)||strchr(skipw, ' '))))
|
|
|
ff8013 |
+ if(!(skipw && (strchr(skipw, c)||strchr(skipw, ' ')))) {
|
|
|
ff8013 |
+ /* check for space for the space character */
|
|
|
ff8013 |
+ if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) {
|
|
|
ff8013 |
+ *t = '\0';
|
|
|
ff8013 |
+ return -1;
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
*t++ = ' ';
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
lc = c;
|
|
|
ff8013 |
continue;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
diff --git a/sldns/str2wire.c b/sldns/str2wire.c
|
|
|
ff8013 |
index 1a51bb6..414b7b8 100644
|
|
|
ff8013 |
--- a/sldns/str2wire.c
|
|
|
ff8013 |
+++ b/sldns/str2wire.c
|
|
|
ff8013 |
@@ -150,6 +150,10 @@ int sldns_str2wire_dname_buf_origin(const char* str, uint8_t* buf, size_t* len,
|
|
|
ff8013 |
if(s) return s;
|
|
|
ff8013 |
|
|
|
ff8013 |
if(rel && origin && dlen > 0) {
|
|
|
ff8013 |
+ if((unsigned)dlen >= 0x00ffffffU ||
|
|
|
ff8013 |
+ (unsigned)origin_len >= 0x00ffffffU)
|
|
|
ff8013 |
+ /* guard against integer overflow in addition */
|
|
|
ff8013 |
+ return RET_ERR(LDNS_WIREPARSE_ERR_GENERAL, *len);
|
|
|
ff8013 |
if(dlen + origin_len - 1 > LDNS_MAX_DOMAINLEN)
|
|
|
ff8013 |
return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW,
|
|
|
ff8013 |
LDNS_MAX_DOMAINLEN);
|
|
|
ff8013 |
@@ -168,7 +172,9 @@ uint8_t* sldns_str2wire_dname(const char* str, size_t* len)
|
|
|
ff8013 |
uint8_t dname[LDNS_MAX_DOMAINLEN+1];
|
|
|
ff8013 |
*len = sizeof(dname);
|
|
|
ff8013 |
if(sldns_str2wire_dname_buf(str, dname, len) == 0) {
|
|
|
ff8013 |
- uint8_t* r = (uint8_t*)malloc(*len);
|
|
|
ff8013 |
+ uint8_t* r;
|
|
|
ff8013 |
+ if(*len > sizeof(dname)) return NULL;
|
|
|
ff8013 |
+ r = (uint8_t*)malloc(*len);
|
|
|
ff8013 |
if(r) return memcpy(r, dname, *len);
|
|
|
ff8013 |
}
|
|
|
ff8013 |
*len = 0;
|
|
|
ff8013 |
@@ -187,6 +193,9 @@ rrinternal_get_owner(sldns_buffer* strbuf, uint8_t* rr, size_t* len,
|
|
|
ff8013 |
sldns_buffer_position(strbuf));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|
|
|
ff8013 |
+ if(token_len < 2) /* make sure there is space to read "@" or "" */
|
|
|
ff8013 |
+ return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL,
|
|
|
ff8013 |
+ sldns_buffer_position(strbuf));
|
|
|
ff8013 |
if(strcmp(token, "@") == 0) {
|
|
|
ff8013 |
uint8_t* tocopy;
|
|
|
ff8013 |
if (origin) {
|
|
|
ff8013 |
@@ -1094,7 +1103,7 @@ int sldns_str2wire_str_buf(const char* str, uint8_t* rd, size_t* len)
|
|
|
ff8013 |
while(sldns_parse_char(&ch, &s)) {
|
|
|
ff8013 |
if(sl >= 255)
|
|
|
ff8013 |
return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, s-str);
|
|
|
ff8013 |
- if(*len < sl+1)
|
|
|
ff8013 |
+ if(*len < sl+2)
|
|
|
ff8013 |
return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL,
|
|
|
ff8013 |
s-str);
|
|
|
ff8013 |
rd[++sl] = ch;
|
|
|
ff8013 |
@@ -2095,6 +2104,8 @@ int sldns_str2wire_int16_data_buf(const char* str, uint8_t* rd, size_t* len)
|
|
|
ff8013 |
char* s;
|
|
|
ff8013 |
int n;
|
|
|
ff8013 |
n = strtol(str, &s, 10);
|
|
|
ff8013 |
+ if(n < 0) /* negative number not allowed */
|
|
|
ff8013 |
+ return LDNS_WIREPARSE_ERR_SYNTAX;
|
|
|
ff8013 |
if(*len < ((size_t)n)+2)
|
|
|
ff8013 |
return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
|
|
|
ff8013 |
if(n > 65535)
|
|
|
ff8013 |
diff --git a/sldns/wire2str.c b/sldns/wire2str.c
|
|
|
ff8013 |
index 832239f..a95c9b3 100644
|
|
|
ff8013 |
--- a/sldns/wire2str.c
|
|
|
ff8013 |
+++ b/sldns/wire2str.c
|
|
|
ff8013 |
@@ -585,6 +585,7 @@ static int rr_comment_dnskey(char** s, size_t* slen, uint8_t* rr,
|
|
|
ff8013 |
if(rrlen < dname_off + 10) return 0;
|
|
|
ff8013 |
rdlen = sldns_read_uint16(rr+dname_off+8);
|
|
|
ff8013 |
if(rrlen < dname_off + 10 + rdlen) return 0;
|
|
|
ff8013 |
+ if(rdlen < 2) return 0;
|
|
|
ff8013 |
rdata = rr + dname_off + 10;
|
|
|
ff8013 |
flags = (int)sldns_read_uint16(rdata);
|
|
|
ff8013 |
w += sldns_str_print(s, slen, " ;{");
|
|
|
ff8013 |
@@ -781,7 +782,7 @@ int sldns_wire2str_dname_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen,
|
|
|
ff8013 |
/* spool labels onto the string, use compression if its there */
|
|
|
ff8013 |
uint8_t* pos = *d;
|
|
|
ff8013 |
unsigned i, counter=0;
|
|
|
ff8013 |
- const unsigned maxcompr = 1000; /* loop detection, max compr ptrs */
|
|
|
ff8013 |
+ const unsigned maxcompr = 256; /* loop detection, max compr ptrs */
|
|
|
ff8013 |
int in_buf = 1;
|
|
|
ff8013 |
if(*dlen == 0) return sldns_str_print(s, slen, "ErrorMissingDname");
|
|
|
ff8013 |
if(*pos == 0) {
|
|
|
ff8013 |
@@ -789,7 +790,7 @@ int sldns_wire2str_dname_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen,
|
|
|
ff8013 |
(*dlen)--;
|
|
|
ff8013 |
return sldns_str_print(s, slen, ".");
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- while(*pos) {
|
|
|
ff8013 |
+ while((!pkt || pos < pkt+pktlen) && *pos) {
|
|
|
ff8013 |
/* read label length */
|
|
|
ff8013 |
uint8_t labellen = *pos++;
|
|
|
ff8013 |
if(in_buf) { (*d)++; (*dlen)--; }
|
|
|
ff8013 |
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
|
|
|
ff8013 |
index d165417..2884309 100644
|
|
|
ff8013 |
--- a/smallapp/unbound-control.c
|
|
|
ff8013 |
+++ b/smallapp/unbound-control.c
|
|
|
ff8013 |
@@ -407,19 +407,19 @@ static void print_stats_shm(const char* cfgfile)
|
|
|
ff8013 |
if(!config_read(cfg, cfgfile, NULL))
|
|
|
ff8013 |
fatal_exit("could not read config file");
|
|
|
ff8013 |
/* get shm segments */
|
|
|
ff8013 |
- id_ctl = shmget(cfg->shm_key, sizeof(int), SHM_R|SHM_W);
|
|
|
ff8013 |
+ id_ctl = shmget(cfg->shm_key, sizeof(int), SHM_R);
|
|
|
ff8013 |
if(id_ctl == -1) {
|
|
|
ff8013 |
fatal_exit("shmget(%d): %s", cfg->shm_key, strerror(errno));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- id_arr = shmget(cfg->shm_key+1, sizeof(int), SHM_R|SHM_W);
|
|
|
ff8013 |
+ id_arr = shmget(cfg->shm_key+1, sizeof(int), SHM_R);
|
|
|
ff8013 |
if(id_arr == -1) {
|
|
|
ff8013 |
fatal_exit("shmget(%d): %s", cfg->shm_key+1, strerror(errno));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- shm_stat = (struct ub_shm_stat_info*)shmat(id_ctl, NULL, 0);
|
|
|
ff8013 |
+ shm_stat = (struct ub_shm_stat_info*)shmat(id_ctl, NULL, SHM_RDONLY);
|
|
|
ff8013 |
if(shm_stat == (void*)-1) {
|
|
|
ff8013 |
fatal_exit("shmat(%d): %s", id_ctl, strerror(errno));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- stats = (struct ub_stats_info*)shmat(id_arr, NULL, 0);
|
|
|
ff8013 |
+ stats = (struct ub_stats_info*)shmat(id_arr, NULL, SHM_RDONLY);
|
|
|
ff8013 |
if(stats == (void*)-1) {
|
|
|
ff8013 |
fatal_exit("shmat(%d): %s", id_arr, strerror(errno));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
diff --git a/testcode/unitmain.c b/testcode/unitmain.c
|
|
|
ff8013 |
index fecde80..96a6654 100644
|
|
|
ff8013 |
--- a/testcode/unitmain.c
|
|
|
ff8013 |
+++ b/testcode/unitmain.c
|
|
|
ff8013 |
@@ -537,10 +537,8 @@ rnd_test(void)
|
|
|
ff8013 |
struct ub_randstate* r;
|
|
|
ff8013 |
int num = 1000, i;
|
|
|
ff8013 |
long int a[1000];
|
|
|
ff8013 |
- unsigned int seed = (unsigned)time(NULL);
|
|
|
ff8013 |
unit_show_feature("ub_random");
|
|
|
ff8013 |
- printf("ub_random seed is %u\n", seed);
|
|
|
ff8013 |
- unit_assert( (r = ub_initstate(seed, NULL)) );
|
|
|
ff8013 |
+ unit_assert( (r = ub_initstate(NULL)) );
|
|
|
ff8013 |
for(i=0; i
|
|
|
ff8013 |
a[i] = ub_random(r);
|
|
|
ff8013 |
unit_assert(a[i] >= 0);
|
|
|
ff8013 |
diff --git a/util/data/dname.c b/util/data/dname.c
|
|
|
ff8013 |
index b744f06..923be02 100644
|
|
|
ff8013 |
--- a/util/data/dname.c
|
|
|
ff8013 |
+++ b/util/data/dname.c
|
|
|
ff8013 |
@@ -75,6 +75,8 @@ dname_valid(uint8_t* dname, size_t maxlen)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
size_t len = 0;
|
|
|
ff8013 |
size_t labellen;
|
|
|
ff8013 |
+ if(maxlen == 0)
|
|
|
ff8013 |
+ return 0; /* too short, shortest is '0' root label */
|
|
|
ff8013 |
labellen = *dname++;
|
|
|
ff8013 |
while(labellen) {
|
|
|
ff8013 |
if(labellen&0xc0)
|
|
|
ff8013 |
@@ -345,11 +347,17 @@ dname_pkt_hash(sldns_buffer* pkt, uint8_t* dname, hashvalue_type h)
|
|
|
ff8013 |
void dname_pkt_copy(sldns_buffer* pkt, uint8_t* to, uint8_t* dname)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
/* copy over the dname and decompress it at the same time */
|
|
|
ff8013 |
+ size_t comprcount = 0;
|
|
|
ff8013 |
size_t len = 0;
|
|
|
ff8013 |
uint8_t lablen;
|
|
|
ff8013 |
lablen = *dname++;
|
|
|
ff8013 |
while(lablen) {
|
|
|
ff8013 |
if(LABEL_IS_PTR(lablen)) {
|
|
|
ff8013 |
+ if(comprcount++ > MAX_COMPRESS_PTRS) {
|
|
|
ff8013 |
+ /* too many compression pointers */
|
|
|
ff8013 |
+ *to = 0; /* end the result prematurely */
|
|
|
ff8013 |
+ return;
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
/* follow pointer */
|
|
|
ff8013 |
if((size_t)PTR_OFFSET(lablen, *dname)
|
|
|
ff8013 |
>= sldns_buffer_limit(pkt))
|
|
|
ff8013 |
@@ -358,6 +366,10 @@ void dname_pkt_copy(sldns_buffer* pkt, uint8_t* to, uint8_t* dname)
|
|
|
ff8013 |
lablen = *dname++;
|
|
|
ff8013 |
continue;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
+ if(lablen > LDNS_MAX_LABELLEN) {
|
|
|
ff8013 |
+ *to = 0; /* end the result prematurely */
|
|
|
ff8013 |
+ return;
|
|
|
ff8013 |
+ }
|
|
|
ff8013 |
log_assert(lablen <= LDNS_MAX_LABELLEN);
|
|
|
ff8013 |
len += (size_t)lablen+1;
|
|
|
ff8013 |
if(len >= LDNS_MAX_DOMAINLEN) {
|
|
|
ff8013 |
diff --git a/util/data/msgreply.c b/util/data/msgreply.c
|
|
|
ff8013 |
index df2131c..dbae34d 100644
|
|
|
ff8013 |
--- a/util/data/msgreply.c
|
|
|
ff8013 |
+++ b/util/data/msgreply.c
|
|
|
ff8013 |
@@ -238,10 +238,10 @@ rdata_copy(sldns_buffer* pkt, struct packed_rrset_data* data, uint8_t* to,
|
|
|
ff8013 |
break;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
if(len) {
|
|
|
ff8013 |
+ log_assert(len <= pkt_len);
|
|
|
ff8013 |
memmove(to, sldns_buffer_current(pkt), len);
|
|
|
ff8013 |
to += len;
|
|
|
ff8013 |
sldns_buffer_skip(pkt, (ssize_t)len);
|
|
|
ff8013 |
- log_assert(len <= pkt_len);
|
|
|
ff8013 |
pkt_len -= len;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
rdf++;
|
|
|
ff8013 |
diff --git a/util/random.c b/util/random.c
|
|
|
ff8013 |
index 8332960..9380502 100644
|
|
|
ff8013 |
--- a/util/random.c
|
|
|
ff8013 |
+++ b/util/random.c
|
|
|
ff8013 |
@@ -86,8 +86,7 @@ ub_systemseed(unsigned int ATTR_UNUSED(seed))
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|
|
|
ff8013 |
struct ub_randstate*
|
|
|
ff8013 |
-ub_initstate(unsigned int ATTR_UNUSED(seed),
|
|
|
ff8013 |
- struct ub_randstate* ATTR_UNUSED(from))
|
|
|
ff8013 |
+ub_initstate(struct ub_randstate* ATTR_UNUSED(from))
|
|
|
ff8013 |
{
|
|
|
ff8013 |
struct ub_randstate* s = (struct ub_randstate*)malloc(1);
|
|
|
ff8013 |
if(!s) {
|
|
|
ff8013 |
@@ -123,8 +122,8 @@ void ub_systemseed(unsigned int ATTR_UNUSED(seed))
|
|
|
ff8013 |
{
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|
|
|
ff8013 |
-struct ub_randstate* ub_initstate(unsigned int ATTR_UNUSED(seed),
|
|
|
ff8013 |
- struct ub_randstate* ATTR_UNUSED(from))
|
|
|
ff8013 |
+struct ub_randstate*
|
|
|
ff8013 |
+ub_initstate(struct ub_randstate* ATTR_UNUSED(from))
|
|
|
ff8013 |
{
|
|
|
ff8013 |
struct ub_randstate* s = (struct ub_randstate*)calloc(1, sizeof(*s));
|
|
|
ff8013 |
if(!s) {
|
|
|
ff8013 |
@@ -140,7 +139,9 @@ long int ub_random(struct ub_randstate* ATTR_UNUSED(state))
|
|
|
ff8013 |
/* random 31 bit value. */
|
|
|
ff8013 |
SECStatus s = PK11_GenerateRandom((unsigned char*)&x, (int)sizeof(x));
|
|
|
ff8013 |
if(s != SECSuccess) {
|
|
|
ff8013 |
- log_err("PK11_GenerateRandom error: %s",
|
|
|
ff8013 |
+ /* unbound needs secure randomness for randomized
|
|
|
ff8013 |
+ * ID bits and port numbers in packets to upstream servers */
|
|
|
ff8013 |
+ fatal_exit("PK11_GenerateRandom error: %s",
|
|
|
ff8013 |
PORT_ErrorToString(PORT_GetError()));
|
|
|
ff8013 |
}
|
|
|
ff8013 |
return x & MAX_VALUE;
|
|
|
ff8013 |
@@ -166,8 +167,7 @@ void ub_systemseed(unsigned int ATTR_UNUSED(seed))
|
|
|
ff8013 |
log_err("Re-seeding not supported, generator untouched");
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|
|
|
ff8013 |
-struct ub_randstate* ub_initstate(unsigned int seed,
|
|
|
ff8013 |
- struct ub_randstate* ATTR_UNUSED(from))
|
|
|
ff8013 |
+struct ub_randstate* ub_initstate(struct ub_randstate* ATTR_UNUSED(from))
|
|
|
ff8013 |
{
|
|
|
ff8013 |
struct ub_randstate* s = (struct ub_randstate*)calloc(1, sizeof(*s));
|
|
|
ff8013 |
uint8_t buf[YARROW256_SEED_FILE_SIZE];
|
|
|
ff8013 |
@@ -183,15 +183,10 @@ struct ub_randstate* ub_initstate(unsigned int seed,
|
|
|
ff8013 |
yarrow256_seed(&s->ctx, YARROW256_SEED_FILE_SIZE, buf);
|
|
|
ff8013 |
s->seeded = yarrow256_is_seeded(&s->ctx);
|
|
|
ff8013 |
} else {
|
|
|
ff8013 |
- /* Stretch the uint32 input seed and feed it to Yarrow */
|
|
|
ff8013 |
- uint32_t v = seed;
|
|
|
ff8013 |
- size_t i;
|
|
|
ff8013 |
- for(i=0; i < (YARROW256_SEED_FILE_SIZE/sizeof(seed)); i++) {
|
|
|
ff8013 |
- memmove(buf+i*sizeof(seed), &v, sizeof(seed));
|
|
|
ff8013 |
- v = v*seed + (uint32_t)i;
|
|
|
ff8013 |
- }
|
|
|
ff8013 |
- yarrow256_seed(&s->ctx, YARROW256_SEED_FILE_SIZE, buf);
|
|
|
ff8013 |
- s->seeded = yarrow256_is_seeded(&s->ctx);
|
|
|
ff8013 |
+ log_err("nettle random(yarrow) cannot initialize, "
|
|
|
ff8013 |
+ "getentropy failed: %s", strerror(errno));
|
|
|
ff8013 |
+ free(s);
|
|
|
ff8013 |
+ return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|
|
|
ff8013 |
return s;
|
|
|
ff8013 |
diff --git a/util/random.h b/util/random.h
|
|
|
ff8013 |
index a05a994..e75157d 100644
|
|
|
ff8013 |
--- a/util/random.h
|
|
|
ff8013 |
+++ b/util/random.h
|
|
|
ff8013 |
@@ -57,15 +57,12 @@ void ub_systemseed(unsigned int seed);
|
|
|
ff8013 |
|
|
|
ff8013 |
/**
|
|
|
ff8013 |
* Initialize a random generator state for use
|
|
|
ff8013 |
- * @param seed: seed value to create state contents.
|
|
|
ff8013 |
- * (ignored for arc4random).
|
|
|
ff8013 |
* @param from: if not NULL, the seed is taken from this random structure.
|
|
|
ff8013 |
* can be used to seed random states via a parent-random-state that
|
|
|
ff8013 |
* is itself seeded with entropy.
|
|
|
ff8013 |
* @return new state or NULL alloc failure.
|
|
|
ff8013 |
*/
|
|
|
ff8013 |
-struct ub_randstate* ub_initstate(unsigned int seed,
|
|
|
ff8013 |
- struct ub_randstate* from);
|
|
|
ff8013 |
+struct ub_randstate* ub_initstate(struct ub_randstate* from);
|
|
|
ff8013 |
|
|
|
ff8013 |
/**
|
|
|
ff8013 |
* Generate next random number from the state passed along.
|
|
|
ff8013 |
diff --git a/util/regional.c b/util/regional.c
|
|
|
ff8013 |
index 899a54e..5be09eb 100644
|
|
|
ff8013 |
--- a/util/regional.c
|
|
|
ff8013 |
+++ b/util/regional.c
|
|
|
ff8013 |
@@ -120,8 +120,18 @@ regional_destroy(struct regional *r)
|
|
|
ff8013 |
void *
|
|
|
ff8013 |
regional_alloc(struct regional *r, size_t size)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
- size_t a = ALIGN_UP(size, ALIGNMENT);
|
|
|
ff8013 |
+ size_t a;
|
|
|
ff8013 |
void *s;
|
|
|
ff8013 |
+ if(
|
|
|
ff8013 |
+#if SIZEOF_SIZE_T == 8
|
|
|
ff8013 |
+ (unsigned long long)size >= 0xffffffffffffff00ULL
|
|
|
ff8013 |
+#else
|
|
|
ff8013 |
+ (unsigned)size >= (unsigned)0xffffff00UL
|
|
|
ff8013 |
+#endif
|
|
|
ff8013 |
+ )
|
|
|
ff8013 |
+ return NULL; /* protect against integer overflow in
|
|
|
ff8013 |
+ malloc and ALIGN_UP */
|
|
|
ff8013 |
+ a = ALIGN_UP(size, ALIGNMENT);
|
|
|
ff8013 |
/* large objects */
|
|
|
ff8013 |
if(a > REGIONAL_LARGE_OBJECT_SIZE) {
|
|
|
ff8013 |
s = malloc(ALIGNMENT + size);
|
|
|
ff8013 |
diff --git a/util/shm_side/shm_main.c b/util/shm_side/shm_main.c
|
|
|
ff8013 |
index a783c09..69bee4d 100644
|
|
|
ff8013 |
--- a/util/shm_side/shm_main.c
|
|
|
ff8013 |
+++ b/util/shm_side/shm_main.c
|
|
|
ff8013 |
@@ -121,7 +121,7 @@ int shm_main_init(struct daemon* daemon)
|
|
|
ff8013 |
shmctl(daemon->shm_info->id_arr, IPC_RMID, NULL);
|
|
|
ff8013 |
|
|
|
ff8013 |
/* SHM: Create the segment */
|
|
|
ff8013 |
- daemon->shm_info->id_ctl = shmget(daemon->shm_info->key, sizeof(struct ub_shm_stat_info), IPC_CREAT | 0666);
|
|
|
ff8013 |
+ daemon->shm_info->id_ctl = shmget(daemon->shm_info->key, sizeof(struct ub_shm_stat_info), IPC_CREAT | 0644);
|
|
|
ff8013 |
|
|
|
ff8013 |
if (daemon->shm_info->id_ctl < 0)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
@@ -134,7 +134,7 @@ int shm_main_init(struct daemon* daemon)
|
|
|
ff8013 |
return 0;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|
|
|
ff8013 |
- daemon->shm_info->id_arr = shmget(daemon->shm_info->key + 1, shm_size, IPC_CREAT | 0666);
|
|
|
ff8013 |
+ daemon->shm_info->id_arr = shmget(daemon->shm_info->key + 1, shm_size, IPC_CREAT | 0644);
|
|
|
ff8013 |
|
|
|
ff8013 |
if (daemon->shm_info->id_arr < 0)
|
|
|
ff8013 |
{
|
|
|
ff8013 |
diff --git a/validator/autotrust.c b/validator/autotrust.c
|
|
|
ff8013 |
index 7bc5577..e19bd7b 100644
|
|
|
ff8013 |
--- a/validator/autotrust.c
|
|
|
ff8013 |
+++ b/validator/autotrust.c
|
|
|
ff8013 |
@@ -370,10 +370,10 @@ autr_tp_create(struct val_anchors* anchors, uint8_t* own, size_t own_len,
|
|
|
ff8013 |
free(tp);
|
|
|
ff8013 |
return NULL;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
- lock_basic_unlock(&anchors->lock);
|
|
|
ff8013 |
lock_basic_init(&tp->lock);
|
|
|
ff8013 |
lock_protect(&tp->lock, tp, sizeof(*tp));
|
|
|
ff8013 |
lock_protect(&tp->lock, tp->autr, sizeof(*tp->autr));
|
|
|
ff8013 |
+ lock_basic_unlock(&anchors->lock);
|
|
|
ff8013 |
return tp;
|
|
|
ff8013 |
}
|
|
|
ff8013 |
|