hurd: writev: Add back cleanup handler
authorJoe Simmons-Talbott <josimmon@redhat.com>
Mon, 19 Jun 2023 14:38:42 +0000 (10:38 -0400)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 20 Jun 2023 16:37:04 +0000 (18:37 +0200)
There is a potential memory leak for large writes due to writev being a
"shall occur" cancellation point.  Add back the cleanup handler removed
in cf30aa43a5917f441c9438aaee201c53c8e1d76b.

Checked on i686-gnu and x86_64-linux-gnu.
Message-Id: <20230619143842.2901522-1-josimmon@redhat.com>

sysdeps/posix/writev.c

index d4c3cf6..0c86e7e 100644 (file)
 #include <errno.h>
 
 
+static void
+ifree (struct scratch_buffer *sbuf)
+{
+   scratch_buffer_free (sbuf);
+}
+
 /* Write data pointed by the buffers described by VECTOR, which
    is a vector of COUNT 'struct iovec's, to file descriptor FD.
    The data is written in the order specified.
@@ -51,7 +57,7 @@ __writev (int fd, const struct iovec *vector, int count)
      since it's faster for small buffer sizes but can handle larger
      allocations as well.  */
 
-  struct scratch_buffer buf;
+  struct scratch_buffer __attribute__ ((__cleanup__ (ifree))) buf;
   scratch_buffer_init (&buf);
   if (!scratch_buffer_set_array_size (&buf, 1, bytes))
     /* XXX I don't know whether it is acceptable to try writing
@@ -75,8 +81,6 @@ __writev (int fd, const struct iovec *vector, int count)
 
   ssize_t bytes_written = __write (fd, buffer, bytes);
 
-  scratch_buffer_free (&buf);
-
   return bytes_written;
 }
 libc_hidden_def (__writev)