From c2d10bd6c4dcc6af34a90a725f65461542a49a28 Mon Sep 17 00:00:00 2001 From: Jim Mason Date: Fri, 6 Sep 2019 19:23:01 +0100 Subject: [PATCH] gst_writev: respect IOV_MAX for the writev iovec array #439 --- plugins/elements/gstelements_private.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plugins/elements/gstelements_private.c b/plugins/elements/gstelements_private.c index 47c0305..d5368a9 100644 --- a/plugins/elements/gstelements_private.c +++ b/plugins/elements/gstelements_private.c @@ -121,19 +121,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 only - * declares it on osx/ios if defined(KERNEL) */ +/* UIO_MAXIOV is documented in writev(2) on osx/ios, but + * 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); -- 2.7.4