From: Miek Gieben Date: Thu, 25 Aug 2005 09:45:18 +0000 (+0000) Subject: Fixed the network error. Didn't set the from_len in lua and then called X-Git-Tag: release-1.0.0~243 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=763a6e3370cefbaebc84f9880a4e12bcff8cda66;p=thirdparty%2Fldns.git Fixed the network error. Didn't set the from_len in lua and then called recvfrom with undef &fromlen. also some lenght issues were fixed in ldns itself, which could also lead to overflows --- diff --git a/lua/lua-rns.c b/lua/lua-rns.c index c47e9965..e20df454 100644 --- a/lua/lua-rns.c +++ b/lua/lua-rns.c @@ -282,7 +282,7 @@ static int l_write_wire_udp(lua_State *L) { int sockfd = (int)lua_tonumber(L, 1); - ldns_buffer *pktbuf = (ldns_buffer*) lua_touserdata(L, 2); + ldns_buffer *pktbuf = (ldns_buffer*)lua_touserdata(L, 2); ldns_rdf *rdf_to = (ldns_rdf*)lua_touserdata(L, 3); uint16_t port = (uint16_t)lua_tonumber(L, 4); /* port number */ @@ -312,22 +312,22 @@ l_read_wire_udp(lua_State *L) size_t size; uint8_t *pktbuf_raw; ldns_buffer *pktbuf; - /* returned frm wire */ - socklen_t from_size; struct sockaddr_storage *from; + socklen_t from_len; from = LDNS_MALLOC(struct sockaddr_storage); if (!from) { return 0; } (void)memset(from, 0, sizeof(struct sockaddr_storage)); + from_len = sizeof(struct sockaddr_storage); /* set to predefined state */ pktbuf = ldns_buffer_new(LDNS_MIN_BUFLEN); /* this /should/ happen in buf_new_frm_data */ if (!pktbuf) { return 0; } - pktbuf_raw = ldns_udp_read_wire(sockfd, &size, from, &from_size); + pktbuf_raw = ldns_udp_read_wire(sockfd, &size, from, &from_len); if (!pktbuf_raw) { return 0; @@ -335,11 +335,11 @@ l_read_wire_udp(lua_State *L) ldns_buffer_new_frm_data(pktbuf, pktbuf_raw, size); /* push our buffer onto the stack */ - /* stack func lua cal in same order buf, from, size = */ + /* stack func lua cal in same order buf, from */ lua_pushlightuserdata(L, pktbuf); lua_pushlightuserdata(L, from); - lua_pushnumber(L, (lua_Number)from_size); - return 3; + /* lua_pushnumber(L, (lua_Number)from_size); */ + return 2; } /* header bits */ diff --git a/lua/lua-todo b/lua/lua-todo deleted file mode 100644 index f86b2ff9..00000000 --- a/lua/lua-todo +++ /dev/null @@ -1,6 +0,0 @@ -There is a strange networking problem, calling udp_read more than once -gives an error -upd.read (with a dot) doesn't work at all. - -I suspect these 2 errors are related. It may be the case this is a bug -in the core ldns diff --git a/lua/rns.lua b/lua/rns.lua index 011d5848..a0e86e39 100644 --- a/lua/rns.lua +++ b/lua/rns.lua @@ -22,8 +22,8 @@ socket = udp.open(rdf_ip, 5353) while true do -- read from the socket, this blocks... -wirebuf, sockaddr_from, fromlen = udp_read(socket) -- this works ---wirebuf, sockaddr_from, fromlen = udp.read(socket) -- this doesn't +wirebuf, sockaddr_from = udp_read(socket) -- this works +--wirebuf, sockaddr_from = udp.read(socket) -- this doesn't -- wrap this in new functions if wirebuf == nil then diff --git a/rdata.c b/rdata.c index b2dad32a..0c9892e4 100644 --- a/rdata.c +++ b/rdata.c @@ -135,12 +135,6 @@ ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port, size_t *size) struct sockaddr_in *data_in; struct sockaddr_in6 *data_in6; -/* - * DEAD CODE??? - struct in_addr *b; - b = (struct in_addr*)rd->_data; -*/ - data = LDNS_MALLOC(struct sockaddr_storage); if (!data) { return NULL; @@ -174,7 +168,6 @@ ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port, size_t *size) ldns_rdf * ldns_sockaddr_storage2rdf(struct sockaddr_storage *sock, uint16_t *port) { - ldns_rdf *addr; struct sockaddr_in *data_in; struct sockaddr_in6 *data_in6; @@ -183,19 +176,19 @@ ldns_sockaddr_storage2rdf(struct sockaddr_storage *sock, uint16_t *port) case AF_INET: data_in = (struct sockaddr_in*)sock; if (port) { - *port = ntohs(data_in->sin_port); + *port = ntohs((uint16_t)data_in->sin_port); } addr = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_A, - sizeof(struct sockaddr_in), + LDNS_IP4ADDRLEN, &data_in->sin_addr); break; case AF_INET6: data_in6 = (struct sockaddr_in6*)sock; if (port) { - *port = ntohs(data_in6->sin6_port); + *port = ntohs((uint16_t)data_in6->sin6_port); } addr = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_AAAA, - sizeof(struct sockaddr_in6), + LDNS_IP6ADDRLEN, &data_in6->sin6_addr); break; default: diff --git a/tests/Makefile.in b/tests/Makefile.in index 005bf8e4..3b563f33 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -20,7 +20,7 @@ LINK = $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) HEADER = config.h TESTS = run-test0 run-test7 run-test18 run-test19 run-test20 \ dname-label-test notify run-test-read-zone \ - rrsig-test serial + rrsig-test serial server .PHONY: all clean realclean @@ -59,6 +59,9 @@ notify: notify.o serial: serial.o $(LINK) -o $@ $+ +server: server.o + $(LINK) -o $@ $+ + ## implicit rule %.o: %.c $(HEADER) $(COMPILE) -c $<