Ping.

On Wed, Aug 5, 2020 at 4:22 PM Shu-Chun Weng <s...@google.com> wrote:

> Ping: https://patchew.org/QEMU/20200723231020.769893-1-...@google.com/
>
> On Thu, Jul 23, 2020 at 4:10 PM Shu-Chun Weng <s...@google.com> wrote:
>
>> The three options handling `struct sock_fprog` (TUNATTACHFILTER,
>> TUNDETACHFILTER, and TUNGETFILTER) are not implemented. Linux kernel
>> keeps a user space pointer in them which we cannot correctly handle.
>>
>> Signed-off-by: Josh Kunz <j...@google.com>
>> Signed-off-by: Shu-Chun Weng <s...@google.com>
>> ---
>> v2:
>>   Title changed from "linux-user: Add several IFTUN ioctls"
>>
>>   Properly specify the argument types for various options, including a
>> custom
>>   implementation for TUNSETTXFILTER.
>>
>>   #ifdef guards for macros introduced up to 5 years ago.
>>
>>  linux-user/ioctls.h       | 45 +++++++++++++++++++++++++++++++++++++++
>>  linux-user/syscall.c      | 36 +++++++++++++++++++++++++++++++
>>  linux-user/syscall_defs.h | 32 ++++++++++++++++++++++++++++
>>  3 files changed, 113 insertions(+)
>>
>> diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
>> index 0713ae1311..b9fb01f558 100644
>> --- a/linux-user/ioctls.h
>> +++ b/linux-user/ioctls.h
>> @@ -593,3 +593,48 @@
>>    IOCTL(KCOV_DISABLE, 0, TYPE_NULL)
>>    IOCTL(KCOV_INIT_TRACE, IOC_R, TYPE_ULONG)
>>  #endif
>> +
>> +  IOCTL(TUNSETDEBUG,     IOC_W, TYPE_INT)
>> +  IOCTL(TUNSETIFF,       IOC_RW, MK_PTR(MK_STRUCT(STRUCT_short_ifreq)))
>> +  IOCTL(TUNSETPERSIST,   IOC_W, TYPE_INT)
>> +  IOCTL(TUNSETOWNER,     IOC_W, TYPE_INT)
>> +  IOCTL(TUNSETLINK,      IOC_W, TYPE_INT)
>> +  IOCTL(TUNSETGROUP,     IOC_W, TYPE_INT)
>> +  IOCTL(TUNGETFEATURES,  IOC_R, MK_PTR(TYPE_INT))
>> +  IOCTL(TUNSETOFFLOAD,   IOC_W, TYPE_LONG)
>> +  IOCTL_SPECIAL(TUNSETTXFILTER, IOC_W, do_ioctl_TUNSETTXFILTER,
>> +                /*
>> +                 * We can't represent `struct tun_filter` in thunk so
>> leaving
>> +                 * this empty. do_ioctl_TUNSETTXFILTER will do the
>> conversion.
>> +                 */
>> +                TYPE_NULL)
>> +  IOCTL(TUNGETIFF,       IOC_R, MK_PTR(MK_STRUCT(STRUCT_short_ifreq)))
>> +  IOCTL(TUNGETSNDBUF,    IOC_R, MK_PTR(TYPE_INT))
>> +  IOCTL(TUNSETSNDBUF,    IOC_W, MK_PTR(TYPE_INT))
>> +  /*
>> +   * TUNATTACHFILTER and TUNDETACHFILTER are not supported. Linux kernel
>> keeps a
>> +   * user pointer in TUNATTACHFILTER, which we are not able to correctly
>> handle.
>> +   */
>> +  IOCTL(TUNGETVNETHDRSZ, IOC_R, MK_PTR(TYPE_INT))
>> +  IOCTL(TUNSETVNETHDRSZ, IOC_W, MK_PTR(TYPE_INT))
>> +  IOCTL(TUNSETQUEUE,     IOC_W, MK_PTR(MK_STRUCT(STRUCT_short_ifreq)))
>> +  IOCTL(TUNSETIFINDEX ,  IOC_W, MK_PTR(TYPE_INT))
>> +  /* TUNGETFILTER is not supported: see TUNATTACHFILTER. */
>> +  IOCTL(TUNSETVNETLE,    IOC_W, MK_PTR(TYPE_INT))
>> +  IOCTL(TUNGETVNETLE,    IOC_R, MK_PTR(TYPE_INT))
>> +#ifdef TUNSETVNETBE
>> +  IOCTL(TUNSETVNETBE,    IOC_W, MK_PTR(TYPE_INT))
>> +  IOCTL(TUNGETVNETBE,    IOC_R, MK_PTR(TYPE_INT))
>> +#endif
>> +#ifdef TUNSETSTEERINGEBPF
>> +  IOCTL(TUNSETSTEERINGEBPF, IOC_W, MK_PTR(TYPE_INT))
>> +#endif
>> +#ifdef TUNSETFILTEREBPF
>> +  IOCTL(TUNSETFILTEREBPF, IOC_W, MK_PTR(TYPE_INT))
>> +#endif
>> +#ifdef TUNSETCARRIER
>> +  IOCTL(TUNSETCARRIER,   IOC_W, MK_PTR(TYPE_INT))
>> +#endif
>> +#ifdef TUNGETDEVNETNS
>> +  IOCTL(TUNGETDEVNETNS,  IOC_R, TYPE_NULL)
>> +#endif
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index 1211e759c2..7f1efed189 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -56,6 +56,7 @@
>>  #include <linux/wireless.h>
>>  #include <linux/icmp.h>
>>  #include <linux/icmpv6.h>
>> +#include <linux/if_tun.h>
>>  #include <linux/errqueue.h>
>>  #include <linux/random.h>
>>  #ifdef CONFIG_TIMERFD
>> @@ -5422,6 +5423,41 @@ static abi_long do_ioctl_drm(const IOCTLEntry *ie,
>> uint8_t *buf_temp,
>>
>>  #endif
>>
>> +static abi_long do_ioctl_TUNSETTXFILTER(const IOCTLEntry *ie, uint8_t
>> *buf_temp,
>> +                                        int fd, int cmd, abi_long arg)
>> +{
>> +    struct tun_filter *filter = (struct tun_filter *)buf_temp;
>> +    struct tun_filter *target_filter;
>> +    char *target_addr;
>> +
>> +    assert(ie->access == IOC_W);
>> +
>> +    target_filter = lock_user(VERIFY_READ, arg, sizeof(*filter), 1);
>> +    if (!target_filter) {
>> +        return -TARGET_EFAULT;
>> +    }
>> +    filter->flags = tswap16(target_filter->flags);
>> +    filter->count = tswap16(target_filter->count);
>> +    unlock_user(target_filter, arg, sizeof(*filter));
>> +
>> +    if (filter->count) {
>> +        if (sizeof(*filter) + filter->count * ETH_ALEN >
>> MAX_STRUCT_SIZE) {
>> +            return -TARGET_EFAULT;
>> +        }
>> +
>> +        target_addr = lock_user(VERIFY_READ, arg + sizeof(*filter),
>> +                                filter->count * ETH_ALEN, 1);
>> +        if (!target_addr) {
>> +            return -TARGET_EFAULT;
>> +        }
>> +        memcpy(filter->addr, target_addr, filter->count * ETH_ALEN);
>> +        unlock_user(target_addr, arg + sizeof(*filter),
>> +                    filter->count * ETH_ALEN);
>> +    }
>> +
>> +    return get_errno(safe_ioctl(fd, ie->host_cmd, filter));
>> +}
>> +
>>  IOCTLEntry ioctl_entries[] = {
>>  #define IOCTL(cmd, access, ...) \
>>      { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ } },
>> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
>> index 3c261cff0e..7ef0ff0328 100644
>> --- a/linux-user/syscall_defs.h
>> +++ b/linux-user/syscall_defs.h
>> @@ -891,6 +891,38 @@ struct target_rtc_pll_info {
>>
>>  #define TARGET_SIOCGIWNAME     0x8B01          /* get name == wireless
>> protocol */
>>
>> +/* From <linux/if_tun.h> */
>> +
>> +#define TARGET_TUNSETDEBUG        TARGET_IOW('T', 201, int)
>> +#define TARGET_TUNSETIFF          TARGET_IOW('T', 202, int)
>> +#define TARGET_TUNSETPERSIST      TARGET_IOW('T', 203, int)
>> +#define TARGET_TUNSETOWNER        TARGET_IOW('T', 204, int)
>> +#define TARGET_TUNSETLINK         TARGET_IOW('T', 205, int)
>> +#define TARGET_TUNSETGROUP        TARGET_IOW('T', 206, int)
>> +#define TARGET_TUNGETFEATURES     TARGET_IOR('T', 207, unsigned int)
>> +#define TARGET_TUNSETOFFLOAD      TARGET_IOW('T', 208, unsigned int)
>> +#define TARGET_TUNSETTXFILTER     TARGET_IOW('T', 209, unsigned int)
>> +#define TARGET_TUNGETIFF          TARGET_IOR('T', 210, unsigned int)
>> +#define TARGET_TUNGETSNDBUF       TARGET_IOR('T', 211, int)
>> +#define TARGET_TUNSETSNDBUF       TARGET_IOW('T', 212, int)
>> +/*
>> + * TUNATTACHFILTER and TUNDETACHFILTER are not supported. Linux kernel
>> keeps a
>> + * user pointer in TUNATTACHFILTER, which we are not able to correctly
>> handle.
>> + */
>> +#define TARGET_TUNGETVNETHDRSZ    TARGET_IOR('T', 215, int)
>> +#define TARGET_TUNSETVNETHDRSZ    TARGET_IOW('T', 216, int)
>> +#define TARGET_TUNSETQUEUE        TARGET_IOW('T', 217, int)
>> +#define TARGET_TUNSETIFINDEX      TARGET_IOW('T', 218, unsigned int)
>> +/* TUNGETFILTER is not supported: see TUNATTACHFILTER. */
>> +#define TARGET_TUNSETVNETLE       TARGET_IOW('T', 220, int)
>> +#define TARGET_TUNGETVNETLE       TARGET_IOR('T', 221, int)
>> +#define TARGET_TUNSETVNETBE       TARGET_IOW('T', 222, int)
>> +#define TARGET_TUNGETVNETBE       TARGET_IOR('T', 223, int)
>> +#define TARGET_TUNSETSTEERINGEBPF TARGET_IOR('T', 224, int)
>> +#define TARGET_TUNSETFILTEREBPF   TARGET_IOR('T', 225, int)
>> +#define TARGET_TUNSETCARRIER      TARGET_IOW('T', 226, int)
>> +#define TARGET_TUNGETDEVNETNS     TARGET_IO('T', 227)
>> +
>>  /* From <linux/random.h> */
>>
>>  #define TARGET_RNDGETENTCNT    TARGET_IOR('R', 0x00, int)
>> --
>> 2.28.0.rc0.142.g3c755180ce-goog
>>
>>

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to