X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Freadwrite.c;h=14ec171f95b0cbf693a47f9674a0cbaf0d15103f;hb=3afa94aeca5a0daae40fd7b6cc96b7e4c150c7d8;hp=0098f759b2d57dc156088126d457a86226517e65;hpb=aeb162609d6ef1f16ec0e818d3750eb6dfff8b30;p=lttng-tools.git diff --git a/src/common/readwrite.c b/src/common/readwrite.c index 0098f759b..14ec171f9 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,7 +18,7 @@ * 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. */ ssize_t lttng_read(int fd, void *buf, size_t count) @@ -34,8 +26,15 @@ 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 +46,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; @@ -64,8 +63,15 @@ 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 +83,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;