X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Freadwrite.c;h=be42b5326aeaa553c24ff09b6c62e52dde0f02b6;hb=e8b6939aed74a39cd65e0d6e6609f6602ce3df44;hp=0098f759b2d57dc156088126d457a86226517e65;hpb=aeb162609d6ef1f16ec0e818d3750eb6dfff8b30;p=lttng-tools.git diff --git a/src/common/readwrite.c b/src/common/readwrite.c index 0098f759b..be42b5326 100644 --- a/src/common/readwrite.c +++ b/src/common/readwrite.c @@ -1,24 +1,16 @@ /* - * Copyright (C) 2013 - Mathieu Desnoyers + * Copyright (C) 2013 Mathieu Desnoyers * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License, version 2.1 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include -#include +#define _LGPL_SOURCE +#include #include +#include + #include "readwrite.h" /* @@ -26,16 +18,24 @@ * 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; ssize_t ret; - assert(fd >= 0); - assert(buf); + LTTNG_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); @@ -47,7 +47,7 @@ ssize_t lttng_read(int fd, void *buf, size_t count) } } i += ret; - assert(i <= count); + LTTNG_ASSERT(i <= count); } while (count - i > 0 && ret > 0); return i; @@ -59,13 +59,21 @@ error: } } +LTTNG_HIDDEN ssize_t lttng_write(int fd, const void *buf, size_t count) { size_t i = 0; ssize_t ret; - assert(fd >= 0); - assert(buf); + LTTNG_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); @@ -77,7 +85,7 @@ ssize_t lttng_write(int fd, const void *buf, size_t count) } } i += ret; - assert(i <= count); + LTTNG_ASSERT(i <= count); } while (count - i > 0 && ret > 0); return i;