gst_writev: respect IOV_MAX for the writev iovec array #439
authorJim Mason <jmason@ibinx.com>
Fri, 6 Sep 2019 18:23:01 +0000 (19:23 +0100)
committerJim Mason <jmason@ibinx.com>
Fri, 6 Sep 2019 18:23:01 +0000 (19:23 +0100)
plugins/elements/gstelements_private.c

index a92deaa9d1885457792052f6c66f7f430a459eb1..c5493b0ad8d6dab4a94d993e667899f5b9c5656d 100644 (file)
@@ -127,19 +127,27 @@ struct iovec
 #define FDSINK_MAX_ALLOCA_SIZE (64 * 1024)      /* 64k */
 #define FDSINK_MAX_MALLOC_SIZE ( 8 * 1024 * 1024)       /*  8M */
 
-/* UIO_MAXIOV is documented in writev(2), but <sys/uio.h> only
- * declares it on osx/ios if defined(KERNEL) */
+/* UIO_MAXIOV is documented in writev(2) on osx/ios, but <sys/uio.h>
+ * only declares it if defined(KERNEL) */
 #ifndef UIO_MAXIOV
 #define UIO_MAXIOV 512
 #endif
 
+/*
+ * POSIX writev(2) documents IOV_MAX as the max length of the iov array.
+ * If IOV_MAX is undefined, fall back to the legacy UIO_MAXIOV.
+ */
+#ifndef IOV_MAX
+#define IOV_MAX UIO_MAXIOV
+#endif
+
 static gssize
 gst_writev (gint fd, const struct iovec *iov, gint iovcnt, gsize total_bytes)
 {
   gssize written;
 
 #ifdef HAVE_SYS_UIO_H
-  if (iovcnt <= UIO_MAXIOV) {
+  if (iovcnt <= IOV_MAX) {
     do {
       written = writev (fd, iov, iovcnt);
     } while (written < 0 && errno == EINTR);