Clamp number of vectors to IOV_MAX / UIO_MAXIOV for GOutputStream writev() calls in the implementations

More vectors will give an error and we can simply clamp here and
consider it like a short write instead.

In case of GSocketOutputStream this is done here instead of inside
GSocket before calling sendmsg() because we we can't generically handle
short writes when sending messages on a socket, e.g. for datagram
sockets this causes only part of the datagram to be sent and an error
would be more useful in this case than sending corrupted data.

Also reduce the fallback limit to 16 in gsocket.c as that's the minimum
value required by POSIX and add a static assertion that the limit is
never bigger than G_MAXINT as that's the type recvmmsg/sendmmsg take.
This commit is contained in:
Sebastian Dröge
2019-05-29 16:04:55 +03:00
parent 57a1d79361
commit 20a2c379c4
5 changed files with 47 additions and 32 deletions

View File

@@ -42,6 +42,7 @@
#endif
#include "glib-private.h"
#include "gioprivate.h"
#ifdef G_OS_WIN32
#include <io.h>
@@ -243,11 +244,11 @@ g_local_file_output_stream_writev (GOutputStream *stream,
if (bytes_written)
*bytes_written = 0;
/* Clamp to G_MAXINT as writev() takes an integer for the number of vectors.
* We handle this like a short write in this case
/* Clamp the number of vectors if more given than we can write in one go.
* The caller has to handle short writes anyway.
*/
if (n_vectors > G_MAXINT)
n_vectors = G_MAXINT;
if (n_vectors > G_IOV_MAX)
n_vectors = G_IOV_MAX;
file = G_LOCAL_FILE_OUTPUT_STREAM (stream);