drbd: fifo_alloc() should use struct_size
authorStephen Kitt <steve@sk2.org>
Fri, 24 Jan 2020 20:03:07 +0000 (21:03 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 30 Jan 2020 04:03:33 +0000 (21:03 -0700)
Switching to struct_size for the allocation in fifo_alloc avoids
hard-coding the type of fifo_buffer.values in fifo_alloc. It also
provides overflow protection; to avoid pessimistic code being
generated by the compiler as a result, this patch also switches
fifo_size to unsigned, propagating the change as appropriate.

Reviewed-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Stephen Kitt <steve@sk2.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_nl.c
drivers/block/drbd/drbd_receiver.c
drivers/block/drbd/drbd_worker.c

index ddbf56014c51a906349fbc85fbd75a7d627e757d..aae99a2d7bd40fa43afb3e0d59c1d3ca09b14fd2 100644 (file)
@@ -622,7 +622,7 @@ struct fifo_buffer {
        int total; /* sum of all values */
        int values[0];
 };
-extern struct fifo_buffer *fifo_alloc(int fifo_size);
+extern struct fifo_buffer *fifo_alloc(unsigned int fifo_size);
 
 /* flag bits per connection */
 enum {
index de2f94d0103a660ee69b40d3840e231ce08bf56d..da4a3ebe04efa52de17332056db5d7e4cfd84f46 100644 (file)
@@ -1575,7 +1575,8 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
        struct drbd_device *device;
        struct disk_conf *new_disk_conf, *old_disk_conf;
        struct fifo_buffer *old_plan = NULL, *new_plan = NULL;
-       int err, fifo_size;
+       int err;
+       unsigned int fifo_size;
 
        retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
        if (!adm_ctx.reply_skb)
index 2b3103c308573a5398237bd90d78c6957108ce08..79e2164460303d6aa5964298cfa8f1711e839730 100644 (file)
@@ -3887,7 +3887,7 @@ static int receive_SyncParam(struct drbd_connection *connection, struct packet_i
        struct disk_conf *old_disk_conf = NULL, *new_disk_conf = NULL;
        const int apv = connection->agreed_pro_version;
        struct fifo_buffer *old_plan = NULL, *new_plan = NULL;
-       int fifo_size = 0;
+       unsigned int fifo_size = 0;
        int err;
 
        peer_device = conn_peer_device(connection, pi->vnr);
index 5bdcc70ad5897b350800b966c3975631850ce7fe..b7f605c6e2311936d2e719feef392ddf95c716b1 100644 (file)
@@ -482,11 +482,11 @@ static void fifo_add_val(struct fifo_buffer *fb, int value)
                fb->values[i] += value;
 }
 
-struct fifo_buffer *fifo_alloc(int fifo_size)
+struct fifo_buffer *fifo_alloc(unsigned int fifo_size)
 {
        struct fifo_buffer *fb;
 
-       fb = kzalloc(sizeof(struct fifo_buffer) + sizeof(int) * fifo_size, GFP_NOIO);
+       fb = kzalloc(struct_size(fb, values, fifo_size), GFP_NOIO);
        if (!fb)
                return NULL;