From b9c417481b6bf33e2c99aae7554fc6153bf3d1ee Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Mon, 19 Nov 2007 16:31:22 +0000 Subject: [PATCH] keep tcp address around for acl. git-svn-id: file:///svn/unbound/trunk@770 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 1 + services/outside_network.c | 2 ++ testcode/replay.c | 4 +++- util/netevent.c | 29 +++++++++++++---------------- util/netevent.h | 26 ++++++++++++++------------ 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index 5a3066726..94b644832 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -9,6 +9,7 @@ and unit test for addr_in_common(). - 0.8: access-control config file element. and unit test rpl replay file. + - 0.8: fixup address reporting from netevent. 16 November 2007: Wouter - privilege separation is not needed in unbound at this time. diff --git a/services/outside_network.c b/services/outside_network.c index 4ccce3cde..a46ba49d2 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -150,6 +150,8 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len) w->outnet->tcp_free = pend->next_free; pend->next_free = NULL; pend->query = w; + pend->c->repinfo.addrlen = w->addrlen; + memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen); ldns_buffer_clear(pend->c->buffer); ldns_buffer_write(pend->c->buffer, pkt, pkt_len); ldns_buffer_flip(pend->c->buffer); diff --git a/testcode/replay.c b/testcode/replay.c index 512c75795..4d5da932c 100644 --- a/testcode/replay.c +++ b/testcode/replay.c @@ -208,6 +208,8 @@ replay_moment_read(char* remain, FILE* in, const char* name, int* lineno, } else if(parse_keyword(&remain, "QUERY")) { mom->evt_type = repevt_front_query; readentry = 1; + if(!extstrtoaddr("127.0.0.1", &mom->addr, &mom->addrlen)) + fatal_exit("internal error"); } else if(parse_keyword(&remain, "CHECK_ANSWER")) { mom->evt_type = repevt_front_reply; readentry = 1; @@ -240,7 +242,7 @@ replay_moment_read(char* remain, FILE* in, const char* name, int* lineno, free(mom); return NULL; } - } + } if(readentry) { mom->match = read_entry(in, name, lineno, ttl, or, prev); diff --git a/util/netevent.c b/util/netevent.c index 64cc5ee73..6b41cd411 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -229,18 +229,23 @@ void comm_point_tcp_accept_callback(int fd, short event, void* arg) { struct comm_point* c = (struct comm_point*)arg, *c_hdl; - struct comm_reply rep; int new_fd; log_assert(c->type == comm_tcp_accept); if(!(event & EV_READ)) { log_info("ignoring tcp accept event %d", (int)event); return; } + /* find free tcp handler. */ + if(!c->tcp_free) { + log_warn("accepted too many tcp, connections full"); + return; + } /* accept incoming connection. */ - rep.c = NULL; - rep.addrlen = (socklen_t)sizeof(rep.addr); + c_hdl = c->tcp_free; + c_hdl->repinfo.addrlen = (socklen_t)sizeof(c_hdl->repinfo.addr); log_assert(fd != -1); - new_fd = accept(fd, (struct sockaddr*)&rep.addr, &rep.addrlen); + new_fd = accept(fd, (struct sockaddr*)&c_hdl->repinfo.addr, + &c_hdl->repinfo.addrlen); if(new_fd == -1) { /* EINTR is signal interrupt. others are closed connection. */ if( errno != EINTR @@ -254,14 +259,7 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg) log_err("accept failed: %s", strerror(errno)); return; } - /* find free tcp handler. */ - if(!c->tcp_free) { - log_err("accepted too many tcp, connections full"); - close(new_fd); - return; - } - /* grab it */ - c_hdl = c->tcp_free; + /* grab the tcp handler buffers */ c->tcp_free = c_hdl->tcp_free; if(!c->tcp_free) { /* stop accepting incoming queries for now. */ @@ -307,7 +305,6 @@ tcp_callback_writer(struct comm_point* c) static void tcp_callback_reader(struct comm_point* c) { - struct comm_reply rep; log_assert(c->type == comm_tcp || c->type == comm_local); ldns_buffer_flip(c->buffer); if(c->tcp_do_toggle_rw) @@ -315,10 +312,8 @@ tcp_callback_reader(struct comm_point* c) c->tcp_byte_count = 0; if(c->type == comm_tcp) comm_point_stop_listening(c); - rep.c = c; - rep.addrlen = 0; log_assert(fptr_whitelist_comm_point(c->callback)); - if( (*c->callback)(c, c->cb_arg, NETEVENT_NOERROR, &rep) ) { + if( (*c->callback)(c, c->cb_arg, NETEVENT_NOERROR, &c->repinfo) ) { comm_point_start_listening(c, -1, TCP_QUERY_TIMEOUT); } } @@ -608,6 +603,7 @@ comm_point_create_tcp_handler(struct comm_base *base, c->do_not_close = 0; c->tcp_do_toggle_rw = 1; c->tcp_check_nb_connect = 0; + c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; /* add to parent free list */ @@ -724,6 +720,7 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize, c->do_not_close = 0; c->tcp_do_toggle_rw = 1; c->tcp_check_nb_connect = 1; + c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; evbits = EV_PERSIST | EV_WRITE; diff --git a/util/netevent.h b/util/netevent.h index c63944e39..cae79e5a7 100644 --- a/util/netevent.h +++ b/util/netevent.h @@ -88,6 +88,18 @@ struct comm_base { struct internal_base* eb; }; +/** + * Reply information for a communication point. + */ +struct comm_reply { + /** the comm_point with fd to send reply on to. */ + struct comm_point* c; + /** the address (for UDP based communication) */ + struct sockaddr_storage addr; + /** length of address */ + socklen_t addrlen; +}; + /** * Communication point to the network * These behaviours can be accomplished by setting the flags @@ -117,6 +129,8 @@ struct comm_point { size_t tcp_byte_count; /** parent communication point (for TCP sockets) */ struct comm_point* tcp_parent; + /** sockaddr from peer, for TCP handlers */ + struct comm_reply repinfo; /* -------- TCP Accept -------- */ /** the number of TCP handlers for this tcp-accept socket */ @@ -187,18 +201,6 @@ struct comm_point { void *cb_arg; }; -/** - * Reply information for a communication point. - */ -struct comm_reply { - /** the comm_point with fd to send reply on to. */ - struct comm_point* c; - /** the address (for UDP based communication) */ - struct sockaddr_storage addr; - /** length of address */ - socklen_t addrlen; -}; - /** * Structure only for making timeout events. */ -- 2.47.2