mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
Fix crash in control channel code.
git-svn-id: file:///svn/unbound/trunk@2007 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
c73dc79252
commit
27d8ffb0f3
2 changed files with 35 additions and 20 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
52
util/tube.c
52
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 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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue