Fix crash in control channel code.

git-svn-id: file:///svn/unbound/trunk@2007 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2010-03-04 10:07:54 +00:00
parent c73dc79252
commit 27d8ffb0f3
2 changed files with 35 additions and 20 deletions

View file

@ -1,3 +1,6 @@
4 March 2010: Wouter
- Fix crash in control channel code.
3 March 2010: Wouter 3 March 2010: Wouter
- better casts in pipe code, brackets placed wrongly. - better casts in pipe code, brackets placed wrongly.
- iana portlist updated. - iana portlist updated.

View file

@ -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 tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
int nonblock) int nonblock)
{ {
ssize_t r; ssize_t r, d;
int fd = tube->sw; int fd = tube->sw;
/* test */ /* test */
@ -297,17 +297,23 @@ int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
if(!fd_set_block(fd)) if(!fd_set_block(fd))
return 0; return 0;
/* write remainder */ /* write remainder */
if(r != (ssize_t)sizeof(len)) { d = r;
if(write(fd, ((char*)&len)+r, sizeof(len)-r) == -1) { 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)); log_err("tube msg write failed: %s", strerror(errno));
(void)fd_set_nonblock(fd); (void)fd_set_nonblock(fd);
return 0; return 0;
} }
d += r;
} }
if(write(fd, buf, len) == -1) { d = 0;
log_err("tube msg write failed: %s", strerror(errno)); while(d != (ssize_t)len) {
(void)fd_set_nonblock(fd); if((r=write(fd, buf+d, len-d)) == -1) {
return 0; log_err("tube msg write failed: %s", strerror(errno));
(void)fd_set_nonblock(fd);
return 0;
}
d += r;
} }
if(!fd_set_nonblock(fd)) if(!fd_set_nonblock(fd))
return 0; 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 tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
int nonblock) int nonblock)
{ {
ssize_t r; ssize_t r, d;
int fd = tube->sr; int fd = tube->sr;
/* test */ /* test */
@ -336,8 +342,9 @@ int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
if(!fd_set_block(fd)) if(!fd_set_block(fd))
return 0; return 0;
/* read remainder */ /* read remainder */
if(r != (ssize_t)sizeof(*len)) { d = r;
if((r=read(fd, ((char*)len)+r, sizeof(*len)-r)) == -1) { 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)); log_err("tube msg read failed: %s", strerror(errno));
(void)fd_set_nonblock(fd); (void)fd_set_nonblock(fd);
return 0; return 0;
@ -346,6 +353,7 @@ int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
(void)fd_set_nonblock(fd); (void)fd_set_nonblock(fd);
return 0; return 0;
} }
d += r;
} }
*buf = (uint8_t*)malloc(*len); *buf = (uint8_t*)malloc(*len);
if(!*buf) { if(!*buf) {
@ -353,16 +361,20 @@ int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
(void)fd_set_nonblock(fd); (void)fd_set_nonblock(fd);
return 0; return 0;
} }
if((r=read(fd, *buf, *len)) == -1) { d = 0;
log_err("tube msg read failed: %s", strerror(errno)); while(d != (ssize_t)*len) {
(void)fd_set_nonblock(fd); if((r=read(fd, (*buf)+d, ((ssize_t)*len)-d)) == -1) {
free(*buf); log_err("tube msg read failed: %s", strerror(errno));
return 0; (void)fd_set_nonblock(fd);
} free(*buf);
if(r == 0) { /* EOF */ return 0;
(void)fd_set_nonblock(fd); }
free(*buf); if(r == 0) { /* EOF */
return 0; (void)fd_set_nonblock(fd);
free(*buf);
return 0;
}
d += r;
} }
if(!fd_set_nonblock(fd)) { if(!fd_set_nonblock(fd)) {
free(*buf); free(*buf);