lkml.org 
[lkml]   [2021]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 51/63] drbd: Use struct_group() to zero algs
    Date
    In preparation for FORTIFY_SOURCE performing compile-time and run-time
    field bounds checking for memset(), avoid intentionally writing across
    neighboring fields.

    Add a struct_group() for the algs so that memset() can correctly reason
    about the size.

    Cc: Philipp Reisner <philipp.reisner@linbit.com>
    Cc: Lars Ellenberg <lars.ellenberg@linbit.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: drbd-dev@lists.linbit.com
    Cc: linux-block@vger.kernel.org
    Signed-off-by: Kees Cook <keescook@chromium.org>
    ---
    drivers/block/drbd/drbd_main.c | 3 ++-
    drivers/block/drbd/drbd_protocol.h | 6 ++++--
    drivers/block/drbd/drbd_receiver.c | 3 ++-
    3 files changed, 8 insertions(+), 4 deletions(-)

    diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
    index 55234a558e98..b824679cfcb2 100644
    --- a/drivers/block/drbd/drbd_main.c
    +++ b/drivers/block/drbd/drbd_main.c
    @@ -729,7 +729,8 @@ int drbd_send_sync_param(struct drbd_peer_device *peer_device)
    cmd = apv >= 89 ? P_SYNC_PARAM89 : P_SYNC_PARAM;

    /* initialize verify_alg and csums_alg */
    - memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX);
    + BUILD_BUG_ON(sizeof(p->algs) != 2 * SHARED_SECRET_MAX);
    + memset(&p->algs, 0, sizeof(p->algs));

    if (get_ldev(peer_device->device)) {
    dc = rcu_dereference(peer_device->device->ldev->disk_conf);
    diff --git a/drivers/block/drbd/drbd_protocol.h b/drivers/block/drbd/drbd_protocol.h
    index dea59c92ecc1..a882b65ab5d2 100644
    --- a/drivers/block/drbd/drbd_protocol.h
    +++ b/drivers/block/drbd/drbd_protocol.h
    @@ -283,8 +283,10 @@ struct p_rs_param_89 {

    struct p_rs_param_95 {
    u32 resync_rate;
    - char verify_alg[SHARED_SECRET_MAX];
    - char csums_alg[SHARED_SECRET_MAX];
    + struct_group(algs,
    + char verify_alg[SHARED_SECRET_MAX];
    + char csums_alg[SHARED_SECRET_MAX];
    + );
    u32 c_plan_ahead;
    u32 c_delay_target;
    u32 c_fill_target;
    diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
    index 1f740e42e457..6df2539e215b 100644
    --- a/drivers/block/drbd/drbd_receiver.c
    +++ b/drivers/block/drbd/drbd_receiver.c
    @@ -3921,7 +3921,8 @@ static int receive_SyncParam(struct drbd_connection *connection, struct packet_i

    /* initialize verify_alg and csums_alg */
    p = pi->data;
    - memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX);
    + BUILD_BUG_ON(sizeof(p->algs) != 2 * SHARED_SECRET_MAX);
    + memset(&p->algs, 0, sizeof(p->algs));

    err = drbd_recv_all(peer_device->connection, p, header_size);
    if (err)
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-08-18 08:17    [W:5.984 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site