X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Freadwrite.c;h=0e8684e260b59ea242bd708cf4f8a0105f814702;hp=7b8460962eda5ee7e917be20cce7c47be0a56ea4;hb=e5212a1dde8128fb55fac4308d54cae575b8305e;hpb=043af8b55bfcc8276b7ae301efa2c72b1f3378e3 diff --git a/src/common/readwrite.c b/src/common/readwrite.c index 7b8460962..0e8684e26 100644 --- a/src/common/readwrite.c +++ b/src/common/readwrite.c @@ -15,8 +15,10 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define _LGPL_SOURCE #include #include +#include #include #include "readwrite.h" @@ -26,9 +28,10 @@ * Upon success, they return the "count" received as parameter. * They can return a negative value if an error occurs. * If a value lower than the requested "count" is returned, it means an - * error occured. + * error occurred. * 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; @@ -36,6 +39,14 @@ ssize_t lttng_read(int fd, void *buf, size_t count) 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); if (ret < 0) { @@ -58,6 +69,7 @@ error: } } +LTTNG_HIDDEN ssize_t lttng_write(int fd, const void *buf, size_t count) { size_t i = 0; @@ -65,6 +77,14 @@ ssize_t lttng_write(int fd, const void *buf, size_t count) 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); if (ret < 0) {