X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Freadwrite.c;h=42a048fdabd2d3abaf0e32d561f9cb901930baff;hp=43d4e39eeeaed22896337995b440ba2e5fe46952;hb=a3eae3c98f047a8e795a01471adf8f4f7563947b;hpb=33b141366b29aa086ecb8d06808d7ba91f83cb1e diff --git a/src/common/readwrite.c b/src/common/readwrite.c index 43d4e39ee..42a048fda 100644 --- a/src/common/readwrite.c +++ b/src/common/readwrite.c @@ -15,7 +15,12 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define _LGPL_SOURCE +#include +#include +#include #include + #include "readwrite.h" /* @@ -26,13 +31,24 @@ * error occured. * The error can be checked by querying errno. */ +LTTNG_HIDDEN ssize_t lttng_read(int fd, void *buf, size_t count) { size_t i = 0; ssize_t ret; + assert(buf); + + /* + * Deny a read count that can be bigger then the returned value max size. + * This makes the function to never return an overflow value. + */ + if (count > SSIZE_MAX) { + return -EINVAL; + } + do { - ret = read(fd, &buf[i], count - i); + ret = read(fd, buf + i, count - i); if (ret < 0) { if (errno == EINTR) { continue; /* retry operation */ @@ -53,13 +69,24 @@ error: } } +LTTNG_HIDDEN ssize_t lttng_write(int fd, const void *buf, size_t count) { size_t i = 0; ssize_t ret; + assert(buf); + + /* + * Deny a write count that can be bigger then the returned value max size. + * This makes the function to never return an overflow value. + */ + if (count > SSIZE_MAX) { + return -EINVAL; + } + do { - ret = write(fd, &buf[i], count - i); + ret = write(fd, buf + i, count - i); if (ret < 0) { if (errno == EINTR) { continue; /* retry operation */