• Yann Droneaud's avatar
    RDMA/cxgb4: Add missing padding at end of struct c4iw_create_cq_resp · b6f04d3d
    Yann Droneaud authored
    The i386 ABI disagrees with most other ABIs regarding alignment of
    data types larger than 4 bytes: on most ABIs a padding must be added
    at end of the structures, while it is not required on i386.
    
    So for most ABI struct c4iw_create_cq_resp gets implicitly padded
    to be aligned on a 8 bytes multiple, while for i386, such padding
    is not added.
    
    The tool pahole can be used to find such implicit padding:
    
      $ pahole --anon_include \
               --nested_anon_include \
               --recursive \
               --class_name c4iw_create_cq_resp \
               drivers/infiniband/hw/cxgb4/iw_cxgb4.o
    
    Then, structure layout can be compared between i386 and x86_64:
    
      +++ obj-i386/drivers/infiniband/hw/cxgb4/iw_cxgb4.o.pahole.txt   2014-03-28 11:43:05.547432195 +0100
      --- obj-x86_64/drivers/infiniband/hw/cxgb4/iw_cxgb4.o.pahole.txt 2014-03-28 10:55:10.990133017 +0100
      @@ -14,9 +13,8 @@ struct c4iw_create_cq_resp {
              __u32                      size;                 /*    28     4 */
              __u32                      qid_mask;             /*    32     4 */
    
      -       /* size: 36, cachelines: 1, members: 6 */
      -       /* last cacheline: 36 bytes */
      +       /* size: 40, cachelines: 1, members: 6 */
      +       /* padding: 4 */
      +       /* last cacheline: 40 bytes */
       };
    
    This ABI disagreement will make an x86_64 kernel try to write past the
    buffer provided by an i386 binary.
    
    When boundary check will be implemented, the x86_64 kernel will refuse
    to write past the i386 userspace provided buffer and the uverbs will
    fail.
    
    If the structure is on a page boundary and the next page is not
    mapped, ib_copy_to_udata() will fail and the uverb will fail.
    
    This patch adds an explicit padding at end of structure
    c4iw_create_cq_resp, and, like 92b0ca7c ("IB/mlx5: Fix stack info
    leak in mlx5_ib_alloc_ucontext()"), makes function c4iw_create_cq()
    not writting this padding field to userspace. This way, x86_64 kernel
    will be able to write struct c4iw_create_cq_resp as expected by
    unpatched and patched i386 libcxgb4.
    
    Link: http://marc.info/?i=cover.1399309513.git.ydroneaud@opteya.com
    Cc: <stable@vger.kernel.org>
    Fixes: cfdda9d7 ("RDMA/cxgb4: Add driver for Chelsio T4 RNIC")
    Fixes: e24a72a3 ("RDMA/cxgb4: Fix four byte info leak in c4iw_create_cq()")
    Cc: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarYann Droneaud <ydroneaud@opteya.com>
    Acked-by: default avatarSteve Wise <swise@opengridcomputing.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    b6f04d3d
cq.c 24.6 KB