24 Aug, 2017

1 commit

  • genl_ops are not supposed to change at runtime. All functions
    working with genl_ops provided by work with
    const genl_ops. So mark the non-const structs as const.

    Signed-off-by: Arvind Yadav
    Signed-off-by: David S. Miller

    Arvind Yadav
     

19 Aug, 2017

1 commit

  • syszkaller reported use-after-free in tipc [1]

    When msg->rep skb is freed, set the pointer to NULL,
    so that caller does not free it again.

    [1]

    ==================================================================
    BUG: KASAN: use-after-free in skb_push+0xd4/0xe0 net/core/skbuff.c:1466
    Read of size 8 at addr ffff8801c6e71e90 by task syz-executor5/4115

    CPU: 1 PID: 4115 Comm: syz-executor5 Not tainted 4.13.0-rc4+ #32
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
    __dump_stack lib/dump_stack.c:16 [inline]
    dump_stack+0x194/0x257 lib/dump_stack.c:52
    print_address_description+0x73/0x250 mm/kasan/report.c:252
    kasan_report_error mm/kasan/report.c:351 [inline]
    kasan_report+0x24e/0x340 mm/kasan/report.c:409
    __asan_report_load8_noabort+0x14/0x20 mm/kasan/report.c:430
    skb_push+0xd4/0xe0 net/core/skbuff.c:1466
    tipc_nl_compat_recv+0x833/0x18f0 net/tipc/netlink_compat.c:1209
    genl_family_rcv_msg+0x7b7/0xfb0 net/netlink/genetlink.c:598
    genl_rcv_msg+0xb2/0x140 net/netlink/genetlink.c:623
    netlink_rcv_skb+0x216/0x440 net/netlink/af_netlink.c:2397
    genl_rcv+0x28/0x40 net/netlink/genetlink.c:634
    netlink_unicast_kernel net/netlink/af_netlink.c:1265 [inline]
    netlink_unicast+0x4e8/0x6f0 net/netlink/af_netlink.c:1291
    netlink_sendmsg+0xa4a/0xe60 net/netlink/af_netlink.c:1854
    sock_sendmsg_nosec net/socket.c:633 [inline]
    sock_sendmsg+0xca/0x110 net/socket.c:643
    sock_write_iter+0x31a/0x5d0 net/socket.c:898
    call_write_iter include/linux/fs.h:1743 [inline]
    new_sync_write fs/read_write.c:457 [inline]
    __vfs_write+0x684/0x970 fs/read_write.c:470
    vfs_write+0x189/0x510 fs/read_write.c:518
    SYSC_write fs/read_write.c:565 [inline]
    SyS_write+0xef/0x220 fs/read_write.c:557
    entry_SYSCALL_64_fastpath+0x1f/0xbe
    RIP: 0033:0x4512e9
    RSP: 002b:00007f3bc8184c08 EFLAGS: 00000216 ORIG_RAX: 0000000000000001
    RAX: ffffffffffffffda RBX: 0000000000718000 RCX: 00000000004512e9
    RDX: 0000000000000020 RSI: 0000000020fdb000 RDI: 0000000000000006
    RBP: 0000000000000086 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000216 R12: 00000000004b5e76
    R13: 00007f3bc8184b48 R14: 00000000004b5e86 R15: 0000000000000000

    Allocated by task 4115:
    save_stack_trace+0x16/0x20 arch/x86/kernel/stacktrace.c:59
    save_stack+0x43/0xd0 mm/kasan/kasan.c:447
    set_track mm/kasan/kasan.c:459 [inline]
    kasan_kmalloc+0xad/0xe0 mm/kasan/kasan.c:551
    kasan_slab_alloc+0x12/0x20 mm/kasan/kasan.c:489
    kmem_cache_alloc_node+0x13d/0x750 mm/slab.c:3651
    __alloc_skb+0xf1/0x740 net/core/skbuff.c:219
    alloc_skb include/linux/skbuff.h:903 [inline]
    tipc_tlv_alloc+0x26/0xb0 net/tipc/netlink_compat.c:148
    tipc_nl_compat_dumpit+0xf2/0x3c0 net/tipc/netlink_compat.c:248
    tipc_nl_compat_handle net/tipc/netlink_compat.c:1130 [inline]
    tipc_nl_compat_recv+0x756/0x18f0 net/tipc/netlink_compat.c:1199
    genl_family_rcv_msg+0x7b7/0xfb0 net/netlink/genetlink.c:598
    genl_rcv_msg+0xb2/0x140 net/netlink/genetlink.c:623
    netlink_rcv_skb+0x216/0x440 net/netlink/af_netlink.c:2397
    genl_rcv+0x28/0x40 net/netlink/genetlink.c:634
    netlink_unicast_kernel net/netlink/af_netlink.c:1265 [inline]
    netlink_unicast+0x4e8/0x6f0 net/netlink/af_netlink.c:1291
    netlink_sendmsg+0xa4a/0xe60 net/netlink/af_netlink.c:1854
    sock_sendmsg_nosec net/socket.c:633 [inline]
    sock_sendmsg+0xca/0x110 net/socket.c:643
    sock_write_iter+0x31a/0x5d0 net/socket.c:898
    call_write_iter include/linux/fs.h:1743 [inline]
    new_sync_write fs/read_write.c:457 [inline]
    __vfs_write+0x684/0x970 fs/read_write.c:470
    vfs_write+0x189/0x510 fs/read_write.c:518
    SYSC_write fs/read_write.c:565 [inline]
    SyS_write+0xef/0x220 fs/read_write.c:557
    entry_SYSCALL_64_fastpath+0x1f/0xbe

    Freed by task 4115:
    save_stack_trace+0x16/0x20 arch/x86/kernel/stacktrace.c:59
    save_stack+0x43/0xd0 mm/kasan/kasan.c:447
    set_track mm/kasan/kasan.c:459 [inline]
    kasan_slab_free+0x71/0xc0 mm/kasan/kasan.c:524
    __cache_free mm/slab.c:3503 [inline]
    kmem_cache_free+0x77/0x280 mm/slab.c:3763
    kfree_skbmem+0x1a1/0x1d0 net/core/skbuff.c:622
    __kfree_skb net/core/skbuff.c:682 [inline]
    kfree_skb+0x165/0x4c0 net/core/skbuff.c:699
    tipc_nl_compat_dumpit+0x36a/0x3c0 net/tipc/netlink_compat.c:260
    tipc_nl_compat_handle net/tipc/netlink_compat.c:1130 [inline]
    tipc_nl_compat_recv+0x756/0x18f0 net/tipc/netlink_compat.c:1199
    genl_family_rcv_msg+0x7b7/0xfb0 net/netlink/genetlink.c:598
    genl_rcv_msg+0xb2/0x140 net/netlink/genetlink.c:623
    netlink_rcv_skb+0x216/0x440 net/netlink/af_netlink.c:2397
    genl_rcv+0x28/0x40 net/netlink/genetlink.c:634
    netlink_unicast_kernel net/netlink/af_netlink.c:1265 [inline]
    netlink_unicast+0x4e8/0x6f0 net/netlink/af_netlink.c:1291
    netlink_sendmsg+0xa4a/0xe60 net/netlink/af_netlink.c:1854
    sock_sendmsg_nosec net/socket.c:633 [inline]
    sock_sendmsg+0xca/0x110 net/socket.c:643
    sock_write_iter+0x31a/0x5d0 net/socket.c:898
    call_write_iter include/linux/fs.h:1743 [inline]
    new_sync_write fs/read_write.c:457 [inline]
    __vfs_write+0x684/0x970 fs/read_write.c:470
    vfs_write+0x189/0x510 fs/read_write.c:518
    SYSC_write fs/read_write.c:565 [inline]
    SyS_write+0xef/0x220 fs/read_write.c:557
    entry_SYSCALL_64_fastpath+0x1f/0xbe

    The buggy address belongs to the object at ffff8801c6e71dc0
    which belongs to the cache skbuff_head_cache of size 224
    The buggy address is located 208 bytes inside of
    224-byte region [ffff8801c6e71dc0, ffff8801c6e71ea0)
    The buggy address belongs to the page:
    page:ffffea00071b9c40 count:1 mapcount:0 mapping:ffff8801c6e71000 index:0x0
    flags: 0x200000000000100(slab)
    raw: 0200000000000100 ffff8801c6e71000 0000000000000000 000000010000000c
    raw: ffffea0007224a20 ffff8801d98caf48 ffff8801d9e79040 0000000000000000
    page dumped because: kasan: bad access detected

    Memory state around the buggy address:
    ffff8801c6e71d80: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
    ffff8801c6e71e00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    >ffff8801c6e71e80: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc
    ^
    ffff8801c6e71f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ffff8801c6e71f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ==================================================================

    Signed-off-by: Eric Dumazet
    Reported-by: Dmitry Vyukov
    Cc: Jon Maloy
    Cc: Ying Xue
    Signed-off-by: David S. Miller

    Eric Dumazet
     

14 Apr, 2017

1 commit


28 Oct, 2016

3 commits

  • Now genl_register_family() is the only thing (other than the
    users themselves, perhaps, but I didn't find any doing that)
    writing to the family struct.

    In all families that I found, genl_register_family() is only
    called from __init functions (some indirectly, in which case
    I've add __init annotations to clarifly things), so all can
    actually be marked __ro_after_init.

    This protects the data structure from accidental corruption.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • Instead of providing macros/inline functions to initialize
    the families, make all users initialize them statically and
    get rid of the macros.

    This reduces the kernel code size by about 1.6k on x86-64
    (with allyesconfig).

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • Static family IDs have never really been used, the only
    use case was the workaround I introduced for those users
    that assumed their family ID was also their multicast
    group ID.

    Additionally, because static family IDs would never be
    reserved by the generic netlink code, using a relatively
    low ID would only work for built-in families that can be
    registered immediately after generic netlink is started,
    which is basically only the control family (apart from
    the workaround code, which I also had to add code for so
    it would reserve those IDs)

    Thus, anything other than GENL_ID_GENERATE is flawed and
    luckily not used except in the cases I mentioned. Move
    those workarounds into a few lines of code, and then get
    rid of GENL_ID_GENERATE entirely, making it more robust.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

02 Jul, 2016

1 commit

  • Fix incorrect use of nla_strlcpy() where the first NLA_HDRLEN bytes
    of the link name where left out.

    Making the output of tipc-config -ls look something like:
    Link statistics:
    dcast-link
    1:data0-1.1.2:data0
    1:data0-1.1.3:data0

    Also, for the record, the patch that introduce this regression
    claims "Sending the whole object out can cause a leak". Which isn't
    very likely as this is a compat layer, where the data we are parsing
    is generated by us and we know the string to be NULL terminated. But
    you can of course never be to secure.

    Fixes: 5d2be1422e02 (tipc: fix an infoleak in tipc_nl_compat_link_dump)
    Signed-off-by: Richard Alpe
    Signed-off-by: David S. Miller

    Richard Alpe
     

03 Jun, 2016

1 commit


26 May, 2016

1 commit


18 May, 2016

1 commit


26 Feb, 2016

1 commit

  • msg.dst_sk needs to be set up with a valid socket because some callbacks
    later derive the netns from it.

    Fixes: 263ea09084d172d ("Revert "genl: Add genlmsg_new_unicast() for unicast message allocation")
    Reported-by: Jon Maloy
    Bisected-by: Jon Maloy
    Signed-off-by: Florian Westphal
    Acked-by Jon Maloy
    Signed-off-by: David S. Miller

    Florian Westphal
     

19 Feb, 2016

1 commit


21 Nov, 2015

2 commits

  • We move the definition of struct tipc_link from link.h to link.c in
    order to minimize its exposure to the rest of the code.

    When needed, we define new functions to make it possible for external
    entities to access and set data in the link.

    Apart from the above, there are no functional changes.

    Reviewed-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Jon Paul Maloy
     
  • In our effort to have less code and include dependencies between
    entities such as node, link and bearer, we try to narrow down
    the exposed interface towards the node as much as possible.

    In this commit, we move the definition of struct tipc_node, along
    with many of its associated function declarations, from node.h to
    node.c. We also move some function definitions from link.c and
    name_distr.c to node.c, since they access fields in struct tipc_node
    that should not be externally visible. The moved functions are renamed
    according to new location, and made static whenever possible.

    There are no functional changes in this commit.

    Reviewed-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Jon Paul Maloy
     

18 Aug, 2015

1 commit

  • A zero length payload means that no TLV (Type Length Value) data has
    been passed. Prior to this patch a non-existing TLV could be sanity
    checked with TLV_OK() resulting in random behavior where a user
    sending an empty message occasionally got a incorrect "operation not
    supported" message back.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Signed-off-by: David S. Miller

    Richard Alpe
     

10 May, 2015

2 commits

  • The legacy netlink API treated EPERM (permission denied) as
    "operation not supported".

    Reported-by: Tomi Ollila
    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Default link properties can be set for media or bearer. This
    functionality was missed when introducing the NL compatibility layer.

    This patch implements this functionality in the compat netlink
    layer. It works the same way as it did in the old API. We search for
    media and bearers matching the "link name". If we find a matching
    media or bearer the link tolerance, priority or window is used as
    default for new links on that media or bearer.

    Fixes: 37e2d4843f9e (tipc: convert legacy nl link prop set to nl compat)
    Reported-by: Tomi Ollila
    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Signed-off-by: David S. Miller

    Richard Alpe
     

10 Feb, 2015

16 commits

  • Add TIPC_CMD_NOOP to compat layer and remove the old framework.

    All legacy nl commands are now converted to the compat layer in
    netlink_compat.c.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_SHOW_STATS to compat layer. This command does not
    have any counterpart in the new API, meaning it now solely exists as a
    function in the compat layer.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_GET_NETID to compat dumpit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_SET_NETID to compat doit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_SET_NODE_ADDR to compat doit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_GET_NODES to compat dumpit and remove global node
    counter solely used by the legacy API.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_GET_MEDIA_NAMES to compat dumpit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert socket (port) listing to compat dumpit call. If a socket
    (port) has publications a second dumpit call is issued to collect them
    and format then into the legacy buffer before continuing to process
    the sockets (ports).

    Command converted in this patch:
    TIPC_CMD_SHOW_PORTS

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Add functionality for printing a dump header and convert
    TIPC_CMD_SHOW_NAME_TABLE to compat dumpit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_RESET_LINK_STATS to compat doit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert setting of link proprieties to compat doit calls.

    Commands converted in this patch:
    TIPC_CMD_SET_LINK_TOL
    TIPC_CMD_SET_LINK_PRI
    TIPC_CMD_SET_LINK_WINDOW

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Convert TIPC_CMD_GET_LINKS to compat dumpit and remove global link
    counter solely used by the legacy API.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Add functionality for safely appending string data to a TLV without
    keeping write count in the caller.

    Convert TIPC_CMD_SHOW_LINK_STATS to compat dumpit.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Introduce a framework for transcoding legacy nl action into actions
    (.doit) calls from the new nl API. This is done by converting the
    incoming TLV data into netlink data with nested netlink attributes.
    Unfortunately due to the randomness of the legacy API we can't do this
    generically so each legacy netlink command requires a specific
    transcoding recipe. In this case for bearer enable and bearer disable.

    Convert TIPC_CMD_ENABLE_BEARER and TIPC_CMD_DISABLE_BEARER into doit
    compat calls.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • Introduce a framework for dumping netlink data from the new netlink
    API and formatting it to the old legacy API format. This is done by
    looping the dump data and calling a format handler for each entity, in
    this case a bearer.

    We dump until either all data is dumped or we reach the limited buffer
    size of the legacy API. Remember, the legacy API doesn't scale.

    In this commit we convert TIPC_CMD_GET_BEARER_NAMES to use the compat
    layer.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe
     
  • The new netlink API is no longer "v2" but rather the standard API and
    the legacy API is now "nl compat". We split them into separate
    start/stop and put them in different files in order to further
    distinguish them.

    Signed-off-by: Richard Alpe
    Reviewed-by: Erik Hugne
    Reviewed-by: Ying Xue
    Reviewed-by: Jon Maloy
    Signed-off-by: David S. Miller

    Richard Alpe