[vlc-devel] [PATCH v2 15/18] compat: Add custom implementation of recvmsg/sendmsg on NaCl

Dennis Hamester dhamester at jusst.de
Mon Mar 13 16:37:47 CET 2017


Hi Filip,

thanks for the suggestions. I've made the necessary changes for proper
posix conformance.

Best
Dennis

On 13.03.2017 13:22, Filip Roséen wrote:
> Hi Dennis,
> 
> As code within VLC should be able to assume that |recvmsg| and
> |sendmsg|are /POSIX/-compliant, I vote that some adjustments should be
> made to these implementations so that we do not run into issues with
> unexpected behavior in the future.
> 
> See the below resource for the specification in full:
> 
>   * http://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html
> 
> On 2017-03-13 12:37, Dennis Hamester wrote:
> 
>     |From: Dennis Hamester <dennis.hamester at startmail.com>
>     compat/recvmsg.c | 51
>     ++++++++++++++++++++++++++++++++++++++++++++++++++- compat/sendmsg.c
>     | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- configure.ac
>     | 2 ++ 3 files changed, 101 insertions(+), 2 deletions(-) diff --git
>     a/compat/recvmsg.c b/compat/recvmsg.c index 941249fef7..40ec935fc6
>     100644 --- a/compat/recvmsg.c +++ b/compat/recvmsg.c @@ -1,7 +1,10
>     @@
>     /*****************************************************************************
>     * recvmsg.c: POSIX recvmsg() replacement
>     *****************************************************************************
>     - * Copyright © 2016 Rémi Denis-Courmont + * Copyright © 2016-2017
>     VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + *
>     Dennis Hamester <dhamester at jusst.de> * * This program is free
>     software; you can redistribute it and/or modify it * under the terms
>     of the GNU Lesser General Public License as published by @@ -79,3
>     +82,49 @@ ssize_t recvmsg(int fd, struct msghdr *msg, int flags)
>     return -1; } #endif + +#ifdef __native_client__ +#include <errno.h>
>     +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +
>     +ssize_t recvmsg(int fd, struct msghdr *msg, int flags) +{ + if
>     (msg->msg_controllen != 0) + { + errno = ENOSYS; + return -1; + } +
>     + if (msg->msg_iovlen > IOV_MAX) + {|
> 
> This check should include |msg->msg_iovlen <= 0| together with |>
> IOV_MAX|, and |errno| should be set to |EMSGSIZE| according to POSIX.
> 
>     |+ errno = EINVAL; + return -1; + } + + size_t full_size = 0; + for
>     (int i = 0; i < msg->msg_iovlen; ++i) + full_size +=
>     msg->msg_iov[i].iov_len;|
> 
> According to /POSIX/, if the total sum of |msg->msg_iov[i].iov_len|
> would overflow a |ssize_t| the function shall return |-1| and set
> |errno| to |EINVAL|.
> 
>     |+ + char *data = malloc(full_size); + if (!data)|
> 
> |errno = ENOMEM| on allocation failure, also note that if |full_size ==
> 0| it is /implementation-defined/ whether |malloc| will return |NULL| or
> not.
> 
>     |+ return -1; + + ssize_t res; + if (msg->msg_name) + res =
>     recvfrom(fd, data, full_size, flags, msg->msg_name,
>     &msg->msg_namelen); + else + res = recv(fd, data, full_size, flags); +|
> 
> If less than |full_size| bytes of data is read you will |memcpy| garbage
> in the loop that follows, which is undesirable.
> 
>     |+ size_t tmp = 0; + for (int i = 0; i < msg->msg_iovlen; ++i) { +
>     memcpy(msg->msg_iov[i].iov_base, data + tmp,
>     msg->msg_iov[i].iov_len); + tmp += msg->msg_iov[i].iov_len; + } + +
>     msg->msg_flags = 0; + free(data); + return res; +} +#endif diff
>     --git a/compat/sendmsg.c b/compat/sendmsg.c index
>     451ba298bf..5bbe8c413b 100644 --- a/compat/sendmsg.c +++
>     b/compat/sendmsg.c @@ -1,7 +1,10 @@
>     /*****************************************************************************
>     * sendmsg.c: POSIX sendmsg() replacement
>     *****************************************************************************
>     - * Copyright © 2016 Rémi Denis-Courmont + * Copyright © 2016-2017
>     VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + *
>     Dennis Hamester <dhamester at jusst.de> * * This program is free
>     software; you can redistribute it and/or modify it * under the terms
>     of the GNU Lesser General Public License as published by @@ -69,3
>     +72,48 @@ ssize_t sendmsg(int fd, const struct msghdr *msg, int
>     flags) return -1; } #endif + +#ifdef __native_client__ +#include
>     <errno.h> +#include <stdlib.h> +#include <string.h> +#include
>     <sys/socket.h> + +ssize_t sendmsg(int fd, const struct msghdr *msg,
>     int flags) +{ + if (msg->msg_controllen != 0) + { + errno = ENOSYS;
>     + return -1; + } + + if (msg->msg_iovlen > IOV_MAX) + { + errno =
>     EINVAL; + return -1; + }|
> 
> See comments regarding |recvmsg|.
> 
>     |+ size_t full_size = 0; + for (int i = 0; i < msg->msg_iovlen; ++i)
>     + full_size += msg->msg_iov[i].iov_len; + + char *data =
>     malloc(full_size); + if (!data) + return -1; + + size_t tmp = 0; +
>     for (int i = 0; i < msg->msg_iovlen; ++i) { + memcpy(data + tmp,
>     msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len); + tmp +=
>     msg->msg_iov[i].iov_len; + } + + ssize_t res; + if (msg->msg_name) +
>     res = sendto(fd, data, full_size, flags, msg->msg_name,
>     msg->msg_namelen); + else + res = send(fd, data, full_size, flags);
>     + + free(data); + return res; +} +#endif diff --git a/configure.ac
>     b/configure.ac index c9713970fd..787421810e 100644 ---
>     a/configure.ac +++ b/configure.ac @@ -300,6 +300,8 @@ case
>     "${host_os}" in *nacl*) SYS=nacl AC_DEFINE([_XOPEN_SOURCE], [700],
>     [POSIX and XPG 7th edition]) + AC_LIBOBJ([recvmsg]) +
>     AC_LIBOBJ([sendmsg]) ;; *) SYS="${host_os}" -- 2.12.0|
> 
> 
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 

-- 
Dennis Hamester
Software Development
-----------------------------------
jusst technologies GmbH

tel: +49 (0)40 1800 86 75
fax: +49 (0)40 1800 86 76
mail: dhamester at jusst.de

Ohlstedter Straße 12
22397 Hamburg
Deutschland

www.jusst.de

Vertretungsberechtigte Geschäftsführer: Julian Scheel, Wolfgang Scheel
Registergericht: Amtsgericht Hamburg
Registernummer: HRB 94300
USt-ID-Nr.: DE 243309917

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 862 bytes
Desc: OpenPGP digital signature
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170313/b3dad325/attachment.sig>


More information about the vlc-devel mailing list