X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Freadwrite.c;h=14ec171f95b0cbf693a47f9674a0cbaf0d15103f;hb=7966af5763c4aaca39df9bbfa9277ff15715c720;hp=7b8460962eda5ee7e917be20cce7c47be0a56ea4;hpb=043af8b55bfcc8276b7ae301efa2c72b1f3378e3;p=lttng-tools.git diff --git a/src/common/readwrite.c b/src/common/readwrite.c index 7b8460962..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,7 +26,15 @@ ssize_t lttng_read(int fd, void *buf, size_t count) size_t i = 0; ssize_t ret; - 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); @@ -46,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; @@ -63,7 +63,15 @@ ssize_t lttng_write(int fd, const void *buf, size_t count) size_t i = 0; ssize_t ret; - 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); @@ -75,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;