08 May, 2019

1 commit


04 May, 2019

1 commit

  • e is the counter used to save the location of a dump when an
    skb is filled. Once the walk of the table is complete, mr_table_dump
    needs to return without resetting that index to 0. Dump of a specific
    table is looping because of the reset because there is no way to
    indicate the walk of the table is done.

    Move the reset to the caller so the dump of each table starts at 0,
    but the loop counter is maintained if a dump fills an skb.

    Fixes: e1cedae1ba6b0 ("ipmr: Refactor mr_rtm_dumproute")
    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

28 Apr, 2019

1 commit

  • Even if the NLA_F_NESTED flag was introduced more than 11 years ago, most
    netlink based interfaces (including recently added ones) are still not
    setting it in kernel generated messages. Without the flag, message parsers
    not aware of attribute semantics (e.g. wireshark dissector or libmnl's
    mnl_nlmsg_fprintf()) cannot recognize nested attributes and won't display
    the structure of their contents.

    Unfortunately we cannot just add the flag everywhere as there may be
    userspace applications which check nlattr::nla_type directly rather than
    through a helper masking out the flags. Therefore the patch renames
    nla_nest_start() to nla_nest_start_noflag() and introduces nla_nest_start()
    as a wrapper adding NLA_F_NESTED. The calls which add NLA_F_NESTED manually
    are rewritten to use nla_nest_start().

    Except for changes in include/net/netlink.h, the patch was generated using
    this semantic patch:

    @@ expression E1, E2; @@
    -nla_nest_start(E1, E2)
    +nla_nest_start_noflag(E1, E2)

    @@ expression E1, E2; @@
    -nla_nest_start_noflag(E1, E2 | NLA_F_NESTED)
    +nla_nest_start(E1, E2)

    Signed-off-by: Michal Kubecek
    Acked-by: Jiri Pirko
    Acked-by: David Ahern
    Signed-off-by: David S. Miller

    Michal Kubecek
     

20 Oct, 2018

1 commit

  • net/sched/cls_api.c has overlapping changes to a call to
    nlmsg_parse(), one (from 'net') added rtm_tca_policy instead of NULL
    to the 5th argument, and another (from 'net-next') added cb->extack
    instead of NULL to the 6th argument.

    net/ipv4/ipmr_base.c is a case of a bug fix in 'net' being done to
    code which moved (to mr_table_dump)) in 'net-next'. Thanks to David
    Ahern for the heads up.

    Signed-off-by: David S. Miller

    David S. Miller
     

18 Oct, 2018

1 commit

  • If the skb space ends in an unresolved entry while dumping we'll miss
    some unresolved entries. The reason is due to zeroing the entry counter
    between dumping resolved and unresolved mfc entries. We should just
    keep counting until the whole table is dumped and zero when we move to
    the next as we have a separate table counter.

    Reported-by: Colin Ian King
    Fixes: 8fb472c09b9d ("ipmr: improve hash scalability")
    Signed-off-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Nikolay Aleksandrov
     

16 Oct, 2018

2 commits


22 Jun, 2018

1 commit

  • Due to the use of rhashtables in net namespaces,
    rhashtable.h is included in lots of the kernel,
    so a small changes can required a large recompilation.
    This makes development painful.

    This patch splits out rhashtable-types.h which just includes
    the major type declarations, and does not include (non-trivial)
    inline code. rhashtable.h is no longer included by anything
    in the include/ directory.
    Common include files only include rhashtable-types.h so a large
    recompilation is only triggered when that changes.

    Acked-by: Herbert Xu
    Signed-off-by: NeilBrown
    Signed-off-by: David S. Miller

    NeilBrown
     

06 Jun, 2018

1 commit

  • commit 0bbbf0e7d0e7 ("ipmr, ip6mr: Unite creation of new mr_table")
    refactored ipmr_new_table, so that it now returns NULL when
    mr_table_alloc fails. Unfortunately, all callers of ipmr_new_table
    expect an ERR_PTR.

    This can result in NULL deref, for example when ipmr_rules_exit calls
    ipmr_free_table with NULL net->ipv4.mrt in the
    !CONFIG_IP_MROUTE_MULTIPLE_TABLES version.

    This patch makes mr_table_alloc return errors, and changes
    ip6mr_new_table and its callers to return/expect error pointers as
    well. It also removes the version of mr_table_alloc defined under
    !CONFIG_IP_MROUTE_COMMON, since it is never used.

    Fixes: 0bbbf0e7d0e7 ("ipmr, ip6mr: Unite creation of new mr_table")
    Signed-off-by: Sabrina Dubroca
    Signed-off-by: David S. Miller

    Sabrina Dubroca
     

23 May, 2018

1 commit

  • commit 8fb472c09b9d ("ipmr: improve hash scalability")
    added a call to rhltable_init() without checking its return value.

    This problem was then later copied to IPv6 and factorized in commit
    0bbbf0e7d0e7 ("ipmr, ip6mr: Unite creation of new mr_table")

    kasan: CONFIG_KASAN_INLINE enabled
    kasan: GPF could be caused by NULL-ptr deref or user memory access
    general protection fault: 0000 [#1] SMP KASAN
    Dumping ftrace buffer:
    (ftrace buffer empty)
    Modules linked in:
    CPU: 1 PID: 31552 Comm: syz-executor7 Not tainted 4.17.0-rc5+ #60
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:rht_key_hashfn include/linux/rhashtable.h:277 [inline]
    RIP: 0010:__rhashtable_lookup include/linux/rhashtable.h:630 [inline]
    RIP: 0010:rhltable_lookup include/linux/rhashtable.h:716 [inline]
    RIP: 0010:mr_mfc_find_parent+0x2ad/0xbb0 net/ipv4/ipmr_base.c:63
    RSP: 0018:ffff8801826aef70 EFLAGS: 00010203
    RAX: 0000000000000001 RBX: 0000000000000001 RCX: ffffc90001ea0000
    RDX: 0000000000000079 RSI: ffffffff8661e859 RDI: 000000000000000c
    RBP: ffff8801826af1c0 R08: ffff8801b2212000 R09: ffffed003b5e46c2
    R10: ffffed003b5e46c2 R11: ffff8801daf23613 R12: dffffc0000000000
    R13: ffff8801826af198 R14: ffff8801cf8225c0 R15: ffff8801826af658
    FS: 00007ff7fa732700(0000) GS:ffff8801daf00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00000003ffffff9c CR3: 00000001b0210000 CR4: 00000000001406e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    ip6mr_cache_find_parent net/ipv6/ip6mr.c:981 [inline]
    ip6mr_mfc_delete+0x1fe/0x6b0 net/ipv6/ip6mr.c:1221
    ip6_mroute_setsockopt+0x15c6/0x1d70 net/ipv6/ip6mr.c:1698
    do_ipv6_setsockopt.isra.9+0x422/0x4660 net/ipv6/ipv6_sockglue.c:163
    ipv6_setsockopt+0xbd/0x170 net/ipv6/ipv6_sockglue.c:922
    rawv6_setsockopt+0x59/0x140 net/ipv6/raw.c:1060
    sock_common_setsockopt+0x9a/0xe0 net/core/sock.c:3039
    __sys_setsockopt+0x1bd/0x390 net/socket.c:1903
    __do_sys_setsockopt net/socket.c:1914 [inline]
    __se_sys_setsockopt net/socket.c:1911 [inline]
    __x64_sys_setsockopt+0xbe/0x150 net/socket.c:1911
    do_syscall_64+0x1b1/0x800 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x49/0xbe

    Fixes: 8fb472c09b9d ("ipmr: improve hash scalability")
    Fixes: 0bbbf0e7d0e7 ("ipmr, ip6mr: Unite creation of new mr_table")
    Signed-off-by: Eric Dumazet
    Cc: Nikolay Aleksandrov
    Cc: Yuval Mintz
    Reported-by: syzbot
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Eric Dumazet
     

27 Mar, 2018

1 commit

  • Since all the primitive elements used for the notification done by ipmr
    are now common [mr_table, mr_mfc, vif_device] we can refactor the logic
    for dumping them to a common file.

    Signed-off-by: Yuval Mintz
    Signed-off-by: Ido Schimmel
    Signed-off-by: David S. Miller

    Yuval Mintz
     

02 Mar, 2018

6 commits

  • The various MFC entries are being held in the same kind of mr_tables
    for both ipmr and ip6mr, and their traversal logic is identical.
    Also, with the exception of the addresses [and other small tidbits]
    the major bulk of the nla setting is identical.

    Unite as much of the dumping as possible between the two.
    Notice this requires creating an mr_table iterator for each, as the
    for-each preprocessor macro can't be used by the common logic.

    Signed-off-by: Yuval Mintz
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Yuval Mintz
     
  • Same as previously done with the mfc seq, the logic for the vif seq is
    refactored to be shared between ipmr and ip6mr.

    Signed-off-by: Yuval Mintz
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Yuval Mintz
     
  • With the exception of the final dump, ipmr and ip6mr have the exact same
    seq logic for traversing a given mr_table. Refactor that code and make
    it common.

    Signed-off-by: Yuval Mintz
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Yuval Mintz
     
  • ipmr and ip6mr utilize the exact same methods for searching the
    hashed resolved connections, difference being only in the construction
    of the hash comparison key.

    In order to unite the flow, introduce an mr_table operation set that
    would contain the protocol specific information required for common
    flows, in this case - the hash parameters and a comparison key
    representing a (*,*) route.

    Signed-off-by: Yuval Mintz
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Yuval Mintz
     
  • Now that both ipmr and ip6mr are using the same mr_table structure,
    we can have a common function to allocate & initialize a new instance.

    Signed-off-by: Yuval Mintz
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Yuval Mintz
     
  • The two implementations have almost identical structures - vif_device and
    mif_device. As a step toward uniforming the mr_tables, eliminate the
    mif_device and relocate the vif_device definition into a new common
    header file.

    Also, introduce a common initializing function for setting most of the
    vif_device fields in a new common source file. This requires modifying
    the ipv{4,6] Kconfig and ipv4 makefile as we're introducing a new common
    config option - CONFIG_IP_MROUTE_COMMON.

    Signed-off-by: Yuval Mintz
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Yuval Mintz