Message ID | 20200124200307.1808593-1-steve@sk2.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drbd fifo_alloc: use struct_size | expand |
On 1/24/20 14:03, Stephen Kitt wrote: > 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. > > Signed-off-by: Stephen Kitt <steve@sk2.org> Reviewed-by: Gustavo A. R. Silva <gustavo@embeddedor.com> Thanks -- Gustavo > --- > drivers/block/drbd/drbd_int.h | 2 +- > drivers/block/drbd/drbd_nl.c | 3 ++- > drivers/block/drbd/drbd_receiver.c | 2 +- > drivers/block/drbd/drbd_worker.c | 4 ++-- > 4 files changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h > index ddbf56014c51..aae99a2d7bd4 100644 > --- a/drivers/block/drbd/drbd_int.h > +++ b/drivers/block/drbd/drbd_int.h > @@ -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 { > diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c > index de2f94d0103a..da4a3ebe04ef 100644 > --- a/drivers/block/drbd/drbd_nl.c > +++ b/drivers/block/drbd/drbd_nl.c > @@ -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) > diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c > index 2b3103c30857..79e216446030 100644 > --- a/drivers/block/drbd/drbd_receiver.c > +++ b/drivers/block/drbd/drbd_receiver.c > @@ -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); > diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c > index 5bdcc70ad589..b7f605c6e231 100644 > --- a/drivers/block/drbd/drbd_worker.c > +++ b/drivers/block/drbd/drbd_worker.c > @@ -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; > >
On 1/24/20 1:03 PM, Stephen Kitt wrote: > 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. Applied, thanks.
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index ddbf56014c51..aae99a2d7bd4 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -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 { diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index de2f94d0103a..da4a3ebe04ef 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -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) diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 2b3103c30857..79e216446030 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -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); diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 5bdcc70ad589..b7f605c6e231 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -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;
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. Signed-off-by: Stephen Kitt <steve@sk2.org> --- drivers/block/drbd/drbd_int.h | 2 +- drivers/block/drbd/drbd_nl.c | 3 ++- drivers/block/drbd/drbd_receiver.c | 2 +- drivers/block/drbd/drbd_worker.c | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-)