All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: Laurent Vivier <laurent@vivier.eu>
Cc: "Riku Voipio" <riku.voipio@iki.fi>,
	"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
	"QEMU Developers" <qemu-devel@nongnu.org>,
	"Josh Kunz" <jkz@google.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Artyom Tarasenko" <atar4qemu@gmail.com>
Subject: Re: [PULL v2 01/13] linux-user: Support for NETLINK socket options
Date: Tue, 12 Nov 2019 10:11:19 +0000	[thread overview]
Message-ID: <CAFEAcA-fTQzYjDtHRzghwA6EAREN=m=JixWJzOMkBc7ZPDmp_g@mail.gmail.com> (raw)
In-Reply-To: <20191106130456.6176-2-laurent@vivier.eu>

On Wed, 6 Nov 2019 at 13:07, Laurent Vivier <laurent@vivier.eu> wrote:
>
> From: Josh Kunz <jkz@google.com>
>
> This change includes support for all AF_NETLINK socket options up to about
> kernel version 5.4 (5.4 is not formally released at the time of writing).
> Socket options that were introduced in kernel versions before the oldest
> currently stable kernel version are guarded by kernel version macros.
>
> This change has been built under gcc 8.3, and clang 9.0, and it passes
> `make check`. The netlink options have been tested by emulating some
> non-trival software that uses NETLINK socket options, but they have
> not been exaustively verified.

Hi; Coverity reports a missing-break-in-switch error for
this commit (CID 1407221):

> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index f6751eecb78c..247883292ce5 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -2248,6 +2248,39 @@ set_timeout:
>              return -TARGET_EFAULT;
>         ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val)));
>          break;
> +#ifdef SOL_NETLINK
> +    case SOL_NETLINK:
> +        switch (optname) {
> +        case NETLINK_PKTINFO:
> +        case NETLINK_ADD_MEMBERSHIP:
> +        case NETLINK_DROP_MEMBERSHIP:
> +        case NETLINK_BROADCAST_ERROR:
> +        case NETLINK_NO_ENOBUFS:
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
> +        case NETLINK_LISTEN_ALL_NSID:
> +        case NETLINK_CAP_ACK:
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
> +        case NETLINK_EXT_ACK:
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
> +        case NETLINK_GET_STRICT_CHK:
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
> +            break;
> +        default:
> +            goto unimplemented;
> +        }
> +        val = 0;
> +        if (optlen < sizeof(uint32_t)) {
> +            return -TARGET_EINVAL;
> +        }
> +        if (get_user_u32(val, optval_addr)) {
> +            return -TARGET_EFAULT;
> +        }
> +        ret = get_errno(setsockopt(sockfd, SOL_NETLINK, optname, &val,
> +                                   sizeof(val)));
> +        break;
> +#endif /* SOL_NETLINK */
>      default:
>      unimplemented:
>          gemu_log("Unsupported setsockopt level=%d optname=%d\n", level, optname);
> @@ -2532,6 +2565,74 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
>              break;
>          }
>          break;
> +#ifdef SOL_NETLINK
> +    case SOL_NETLINK:
> +        switch (optname) {
> +        case NETLINK_PKTINFO:
> +        case NETLINK_BROADCAST_ERROR:
> +        case NETLINK_NO_ENOBUFS:
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
> +        case NETLINK_LISTEN_ALL_NSID:
> +        case NETLINK_CAP_ACK:
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
> +        case NETLINK_EXT_ACK:
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
> +        case NETLINK_GET_STRICT_CHK:
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
> +            if (get_user_u32(len, optlen)) {
> +                return -TARGET_EFAULT;
> +            }
> +            if (len != sizeof(val)) {
> +                return -TARGET_EINVAL;
> +            }
> +            lv = len;
> +            ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
> +            if (ret < 0) {
> +                return ret;
> +            }
> +            if (put_user_u32(lv, optlen)
> +                || put_user_u32(val, optval_addr)) {
> +                return -TARGET_EFAULT;
> +            }
> +            break;
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
> +        case NETLINK_LIST_MEMBERSHIPS:
> +        {
> +            uint32_t *results;
> +            int i;
> +            if (get_user_u32(len, optlen)) {
> +                return -TARGET_EFAULT;
> +            }
> +            if (len < 0) {
> +                return -TARGET_EINVAL;
> +            }
> +            results = lock_user(VERIFY_WRITE, optval_addr, len, 1);
> +            if (!results) {
> +                return -TARGET_EFAULT;
> +            }
> +            lv = len;
> +            ret = get_errno(getsockopt(sockfd, level, optname, results, &lv));
> +            if (ret < 0) {
> +                unlock_user(results, optval_addr, 0);
> +                return ret;
> +            }
> +            /* swap host endianess to target endianess. */
> +            for (i = 0; i < (len / sizeof(uint32_t)); i++) {
> +                results[i] = tswap32(results[i]);
> +            }
> +            if (put_user_u32(lv, optlen)) {
> +                return -TARGET_EFAULT;
> +            }
> +            unlock_user(results, optval_addr, 0);
> +            break;
> +        }
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
> +        default:
> +            goto unimplemented;
> +        }
> +#endif /* SOL_NETLINK */

Here at the end of the 'case SOL_NETLINK' we will just
fall straight through into 'default:'. Missing 'break' ?

>      default:
>      unimplemented:
>          gemu_log("getsockopt level=%d optname=%d not yet supported\n",
> --
> 2.21.0

thanks
-- PMM


  reply	other threads:[~2019-11-12 10:12 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-06 13:04 [PULL v2 00/13] Linux user for 4.2 patches Laurent Vivier
2019-11-06 13:04 ` [PULL v2 01/13] linux-user: Support for NETLINK socket options Laurent Vivier
2019-11-12 10:11   ` Peter Maydell [this message]
2019-11-12 10:30     ` Laurent Vivier
2019-11-06 13:04 ` [PULL v2 02/13] scripts/qemu-binfmt-conf: Update for sparc64 Laurent Vivier
2019-11-06 13:04 ` [PULL v2 03/13] tests/tcg/multiarch/linux-test: Fix error check for shmat Laurent Vivier
2019-11-06 13:04 ` [PULL v2 04/13] target/sparc: Define an enumeration for accessing env->regwptr Laurent Vivier
2019-11-06 13:04 ` [PULL v2 05/13] linux-user/sparc: Use WREG constants in sparc/target_cpu.h Laurent Vivier
2019-11-06 13:04 ` [PULL v2 06/13] linux-user/sparc: Begin using WREG constants in sparc/signal.c Laurent Vivier
2019-11-06 13:04 ` [PULL v2 07/13] linux-user/sparc: Use WREG_SP constant " Laurent Vivier
2019-11-06 13:04 ` [PULL v2 08/13] linux-user/sparc: Fix WREG usage in setup_frame Laurent Vivier
2019-11-06 13:04 ` [PULL v2 09/13] linux-user/sparc64: Fix target_signal_frame Laurent Vivier
2019-11-06 13:04 ` [PULL v2 10/13] linux-user: Rename cpu_clone_regs to cpu_clone_regs_child Laurent Vivier
2019-11-06 13:04 ` [PULL v2 11/13] linux-user: Introduce cpu_clone_regs_parent Laurent Vivier
2019-11-06 13:04 ` [PULL v2 12/13] linux-user/sparc: Fix cpu_clone_regs_* Laurent Vivier
2019-11-06 13:04 ` [PULL v2 13/13] linux-user/alpha: Set r20 secondary return value Laurent Vivier
2019-11-06 19:10 ` [PULL v2 00/13] Linux user for 4.2 patches no-reply
2019-11-06 22:04 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFEAcA-fTQzYjDtHRzghwA6EAREN=m=JixWJzOMkBc7ZPDmp_g@mail.gmail.com' \
    --to=peter.maydell@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=atar4qemu@gmail.com \
    --cc=jkz@google.com \
    --cc=laurent@vivier.eu \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=qemu-devel@nongnu.org \
    --cc=riku.voipio@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.