X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Freadwrite.c;h=be42b5326aeaa553c24ff09b6c62e52dde0f02b6;hb=e8b6939aed74a39cd65e0d6e6609f6602ce3df44;hp=43d4e39eeeaed22896337995b440ba2e5fe46952;hpb=33b141366b29aa086ecb8d06808d7ba91f83cb1e;p=lttng-tools.git diff --git a/src/common/readwrite.c b/src/common/readwrite.c index 43d4e39ee..be42b5326 100644 --- a/src/common/readwrite.c +++ b/src/common/readwrite.c @@ -1,21 +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 */ +#define _LGPL_SOURCE +#include #include + +#include + #include "readwrite.h" /* @@ -23,16 +18,27 @@ * 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; + 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); + ret = read(fd, buf + i, count - i); if (ret < 0) { if (errno == EINTR) { continue; /* retry operation */ @@ -41,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; @@ -53,13 +59,24 @@ error: } } +LTTNG_HIDDEN ssize_t lttng_write(int fd, const void *buf, size_t count) { size_t i = 0; ssize_t ret; + 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); + ret = write(fd, buf + i, count - i); if (ret < 0) { if (errno == EINTR) { continue; /* retry operation */ @@ -68,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;