summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 008c0cb..75bd59b 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -217,7 +217,7 @@ ssize_t
read_buffer(int fd, struct buffer_s * buffptr)
{
ssize_t bytesin;
- unsigned char buffer[READ_BUFFER_SIZE];
+ unsigned char *buffer;
assert(fd >= 0);
assert(buffptr != NULL);
@@ -228,20 +228,23 @@ read_buffer(int fd, struct buffer_s * buffptr)
if (buffptr->size >= MAXBUFFSIZE)
return 0;
+ buffer = safemalloc(READ_BUFFER_SIZE);
+ if (!buffer) {
+ return -ENOMEM;
+ }
+
bytesin = read(fd, buffer, READ_BUFFER_SIZE);
if (bytesin > 0) {
if (add_to_buffer(buffptr, buffer, bytesin) < 0) {
log_message(LOG_ERR,
"readbuff: add_to_buffer() error.");
- return -1;
+ bytesin = -1;
}
-
- return bytesin;
} else {
if (bytesin == 0) {
/* connection was closed by client */
- return -1;
+ bytesin = -1;
} else {
switch (errno) {
#ifdef EWOULDBLOCK
@@ -252,15 +255,20 @@ read_buffer(int fd, struct buffer_s * buffptr)
# endif
#endif
case EINTR:
- return 0;
+ bytesin = 0;
+ break;
default:
log_message(LOG_ERR,
"readbuff: recv() error \"%s\" on file descriptor %d",
strerror(errno), fd);
- return -1;
+ bytesin = -1;
+ break;
}
}
}
+
+ safefree(buffer);
+ return bytesin;
}
/*