From 27d8ffb0f30675faa45c1cb1cedcb8cce7c8f1f2 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Thu, 4 Mar 2010 10:07:54 +0000 Subject: [PATCH] Fix crash in control channel code. git-svn-id: file:///svn/unbound/trunk@2007 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 3 +++ util/tube.c | 52 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index e7ef74843..99dd96818 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,6 @@ +4 March 2010: Wouter + - Fix crash in control channel code. + 3 March 2010: Wouter - better casts in pipe code, brackets placed wrongly. - iana portlist updated. diff --git a/util/tube.c b/util/tube.c index 85822f9c9..30a70ed01 100644 --- a/util/tube.c +++ b/util/tube.c @@ -281,7 +281,7 @@ tube_handle_write(struct comm_point* c, void* arg, int error, int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len, int nonblock) { - ssize_t r; + ssize_t r, d; int fd = tube->sw; /* test */ @@ -297,17 +297,23 @@ int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len, if(!fd_set_block(fd)) return 0; /* write remainder */ - if(r != (ssize_t)sizeof(len)) { - if(write(fd, ((char*)&len)+r, sizeof(len)-r) == -1) { + d = r; + while(d != (ssize_t)sizeof(len)) { + if((r=write(fd, ((char*)&len)+d, sizeof(len)-d)) == -1) { log_err("tube msg write failed: %s", strerror(errno)); (void)fd_set_nonblock(fd); return 0; } + d += r; } - if(write(fd, buf, len) == -1) { - log_err("tube msg write failed: %s", strerror(errno)); - (void)fd_set_nonblock(fd); - return 0; + d = 0; + while(d != (ssize_t)len) { + if((r=write(fd, buf+d, len-d)) == -1) { + log_err("tube msg write failed: %s", strerror(errno)); + (void)fd_set_nonblock(fd); + return 0; + } + d += r; } if(!fd_set_nonblock(fd)) return 0; @@ -317,7 +323,7 @@ int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len, int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len, int nonblock) { - ssize_t r; + ssize_t r, d; int fd = tube->sr; /* test */ @@ -336,8 +342,9 @@ int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len, if(!fd_set_block(fd)) return 0; /* read remainder */ - if(r != (ssize_t)sizeof(*len)) { - if((r=read(fd, ((char*)len)+r, sizeof(*len)-r)) == -1) { + d = r; + while(d != (ssize_t)sizeof(*len)) { + if((r=read(fd, ((char*)len)+d, sizeof(*len)-d)) == -1) { log_err("tube msg read failed: %s", strerror(errno)); (void)fd_set_nonblock(fd); return 0; @@ -346,6 +353,7 @@ int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len, (void)fd_set_nonblock(fd); return 0; } + d += r; } *buf = (uint8_t*)malloc(*len); if(!*buf) { @@ -353,16 +361,20 @@ int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len, (void)fd_set_nonblock(fd); return 0; } - if((r=read(fd, *buf, *len)) == -1) { - log_err("tube msg read failed: %s", strerror(errno)); - (void)fd_set_nonblock(fd); - free(*buf); - return 0; - } - if(r == 0) { /* EOF */ - (void)fd_set_nonblock(fd); - free(*buf); - return 0; + d = 0; + while(d != (ssize_t)*len) { + if((r=read(fd, (*buf)+d, ((ssize_t)*len)-d)) == -1) { + log_err("tube msg read failed: %s", strerror(errno)); + (void)fd_set_nonblock(fd); + free(*buf); + return 0; + } + if(r == 0) { /* EOF */ + (void)fd_set_nonblock(fd); + free(*buf); + return 0; + } + d += r; } if(!fd_set_nonblock(fd)) { free(*buf); -- 2.47.2