Extract synchronize tracer notifier functions
[lttng-tools.git] / src / common / readwrite.c
index 43d4e39eeeaed22896337995b440ba2e5fe46952..6019aa2dc3f6f0bb79c8f921bee0ee1219c60da9 100644 (file)
@@ -1,21 +1,17 @@
 /*
- * Copyright (C) 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright (C) 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * 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 <assert.h>
+#include <limits.h>
 #include <unistd.h>
+
+#include <common/compat/errno.h>
+
 #include "readwrite.h"
 
 /*
  * 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(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 */
@@ -53,13 +60,24 @@ error:
        }
 }
 
+LTTNG_HIDDEN
 ssize_t lttng_write(int fd, const void *buf, size_t count)
 {
        size_t i = 0;
        ssize_t ret;
 
+       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 */
This page took 0.02384 seconds and 4 git commands to generate.