* [PATCH 0/4] drbd: A few bug fixes
@ 2026-03-17 23:23 Ethan Tidmore
2026-03-17 23:23 ` [PATCH 1/4] drbd: Fix out-of-bounds access Ethan Tidmore
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Ethan Tidmore @ 2026-03-17 23:23 UTC (permalink / raw)
To: Philipp Reisner, Lars Ellenberg, Christoph Böhmwalder,
Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel, Ethan Tidmore
Here are 4 bug fixes found with Smatch.
Ethan Tidmore (4):
drbd: Fix out-of-bounds access
drbd: Fix variable dereference before check
drbd: Add missing error code in drbd_main.c
drbd: Add check for error pointer
drivers/block/drbd/drbd_main.c | 1 +
drivers/block/drbd/drbd_nl.c | 2 +-
drivers/block/drbd/drbd_receiver.c | 2 +-
drivers/block/drbd/drbd_req.c | 4 +++-
4 files changed, 6 insertions(+), 3 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] drbd: Fix out-of-bounds access
2026-03-17 23:23 [PATCH 0/4] drbd: A few bug fixes Ethan Tidmore
@ 2026-03-17 23:23 ` Ethan Tidmore
2026-03-17 23:23 ` [PATCH 2/4] drbd: Fix variable dereference before check Ethan Tidmore
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Ethan Tidmore @ 2026-03-17 23:23 UTC (permalink / raw)
To: Philipp Reisner, Lars Ellenberg, Christoph Böhmwalder,
Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel, Ethan Tidmore
The array sync_rule_names[] has 22 elements and rule is used to access
this array. The variable rule has the possibility of being index 22
because the condition (rule > ARRAY_SIZE(sync_rule_names)) could
evaluate to 22 > 22 which would be false and then rule would be used to
index sync_rule_names[] which would cause and out-of-bounds bug.
Change condition from (rule > ARRAY_SIZE(sync_rule_names)) to
(rule >= ARRAY_SIZE(sync_rule_names)).
Detected by Smatch:
drivers/block/drbd/drbd_receiver.c:280 drbd_sync_rule_str() error:
buffer overflow 'sync_rule_names' 22 <= 22
Fixes: 851f106c134a3 ("drbd: rework receiver for DRBD 9 transport and protocol")
Signed-off-by: Ethan Tidmore <ethantidmore06@gmail.com>
---
drivers/block/drbd/drbd_receiver.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 06d83b5ffafb..280be2ee7d7e 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -273,7 +273,7 @@ static void drbd_cancel_conflicting_resync_requests(struct drbd_peer_device *pee
static const char *drbd_sync_rule_str(enum sync_rule rule)
{
- if (rule < 0 || rule > ARRAY_SIZE(sync_rule_names)) {
+ if (rule < 0 || rule >= ARRAY_SIZE(sync_rule_names)) {
WARN_ON(true);
return "?";
}
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] drbd: Fix variable dereference before check
2026-03-17 23:23 [PATCH 0/4] drbd: A few bug fixes Ethan Tidmore
2026-03-17 23:23 ` [PATCH 1/4] drbd: Fix out-of-bounds access Ethan Tidmore
@ 2026-03-17 23:23 ` Ethan Tidmore
2026-03-17 23:23 ` [PATCH 3/4] drbd: Add missing error code in drbd_main.c Ethan Tidmore
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Ethan Tidmore @ 2026-03-17 23:23 UTC (permalink / raw)
To: Philipp Reisner, Lars Ellenberg, Christoph Böhmwalder,
Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel, Ethan Tidmore
The struct is 'req' is checked for NULL after resource was assigned from
a member from it.
Check 'req' for NULL before assigning resource.
Detected by Smatch:
drivers/block/drbd/drbd_req.c:1996 drbd_unplug() warn:
variable dereferenced before check 'req' (see line 1993)
Fixes: 71d075200b462 ("drbd: rework request processing for DRBD 9 multi-peer IO")
Signed-off-by: Ethan Tidmore <ethantidmore06@gmail.com>
---
drivers/block/drbd/drbd_req.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index e88b5da15c1e..4cbd9ec15157 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -1990,12 +1990,14 @@ static void drbd_unplug(struct blk_plug_cb *cb, bool from_schedule)
{
struct drbd_plug_cb *plug = container_of(cb, struct drbd_plug_cb, cb);
struct drbd_request *req = plug->most_recent_req;
- struct drbd_resource *resource = req->device->resource;
+ struct drbd_resource *resource;
kfree(cb);
if (!req)
return;
+ resource = req->device->resource;
+
read_lock_irq(&resource->state_rwlock);
/* In case the sender did not process it yet, raise the flag to
* have it followed with P_UNPLUG_REMOTE just after. */
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] drbd: Add missing error code in drbd_main.c
2026-03-17 23:23 [PATCH 0/4] drbd: A few bug fixes Ethan Tidmore
2026-03-17 23:23 ` [PATCH 1/4] drbd: Fix out-of-bounds access Ethan Tidmore
2026-03-17 23:23 ` [PATCH 2/4] drbd: Fix variable dereference before check Ethan Tidmore
@ 2026-03-17 23:23 ` Ethan Tidmore
2026-03-17 23:23 ` [PATCH 4/4] drbd: Add check for error pointer Ethan Tidmore
2026-03-26 14:25 ` [PATCH 0/4] drbd: A few bug fixes Christoph Böhmwalder
4 siblings, 0 replies; 7+ messages in thread
From: Ethan Tidmore @ 2026-03-17 23:23 UTC (permalink / raw)
To: Philipp Reisner, Lars Ellenberg, Christoph Böhmwalder,
Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel, Ethan Tidmore
No error code is assigned in alloc_workqueue() error path.
Assign error code -ENOMEM.
Detected by Smatch:
drivers/block/drbd/drbd_main.c:4575 drbd_init() warn:
missing error code 'err'
Fixes: b2e550c8d1f54 ("drbd: rework module core for DRBD 9 transport and multi-peer")
Signed-off-by: Ethan Tidmore <ethantidmore06@gmail.com>
---
drivers/block/drbd/drbd_main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index e2c3530cfa13..689b7cac5ec2 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -4569,6 +4569,7 @@ static int __init drbd_init(void)
goto fail;
}
+ err = -ENOMEM;
ping_ack_sender = alloc_workqueue("drbd_pas",
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_HIGHPRI, 0);
if (!ping_ack_sender)
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] drbd: Add check for error pointer
2026-03-17 23:23 [PATCH 0/4] drbd: A few bug fixes Ethan Tidmore
` (2 preceding siblings ...)
2026-03-17 23:23 ` [PATCH 3/4] drbd: Add missing error code in drbd_main.c Ethan Tidmore
@ 2026-03-17 23:23 ` Ethan Tidmore
2026-03-26 14:26 ` Christoph Böhmwalder
2026-03-26 14:25 ` [PATCH 0/4] drbd: A few bug fixes Christoph Böhmwalder
4 siblings, 1 reply; 7+ messages in thread
From: Ethan Tidmore @ 2026-03-17 23:23 UTC (permalink / raw)
To: Philipp Reisner, Lars Ellenberg, Christoph Böhmwalder,
Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel, Ethan Tidmore
The function find_cfg_context_attr() can return an error pointer or NULL
in its error path.
Change NULL check to IS_ERR_OR_NULL().
Detected by Smatch:
drivers/block/drbd/drbd_nl.c:6571 drbd_adm_dump_paths() error:
'resource_filter' dereferencing possible ERR_PTR()
Fixes: 626c95b0e2a23 ("drbd: rework netlink interface for DRBD 9 multi-peer config")
Signed-off-by: Ethan Tidmore <ethantidmore06@gmail.com>
---
drivers/block/drbd/drbd_nl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index c5e253820ccf..1f458eb972e9 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -6566,7 +6566,7 @@ static int drbd_adm_dump_paths(struct sk_buff *skb, struct netlink_callback *cb)
resource = (struct drbd_resource *)cb->args[0];
if (!cb->args[0]) {
resource_filter = find_cfg_context_attr(cb->nlh, T_ctx_resource_name);
- if (resource_filter) {
+ if (!IS_ERR_OR_NULL(resource_filter)) {
retcode = ERR_RES_NOT_KNOWN;
resource = drbd_find_resource(nla_data(resource_filter));
if (!resource)
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 0/4] drbd: A few bug fixes
2026-03-17 23:23 [PATCH 0/4] drbd: A few bug fixes Ethan Tidmore
` (3 preceding siblings ...)
2026-03-17 23:23 ` [PATCH 4/4] drbd: Add check for error pointer Ethan Tidmore
@ 2026-03-26 14:25 ` Christoph Böhmwalder
4 siblings, 0 replies; 7+ messages in thread
From: Christoph Böhmwalder @ 2026-03-26 14:25 UTC (permalink / raw)
To: Ethan Tidmore, Philipp Reisner, Lars Ellenberg, Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel
On 3/18/26 00:23, Ethan Tidmore wrote:
> Here are 4 bug fixes found with Smatch.
>
> Ethan Tidmore (4):
> drbd: Fix out-of-bounds access
> drbd: Fix variable dereference before check
> drbd: Add missing error code in drbd_main.c
> drbd: Add check for error pointer
>
> drivers/block/drbd/drbd_main.c | 1 +
> drivers/block/drbd/drbd_nl.c | 2 +-
> drivers/block/drbd/drbd_receiver.c | 2 +-
> drivers/block/drbd/drbd_req.c | 4 +++-
> 4 files changed, 6 insertions(+), 3 deletions(-)
>
Thanks, these all look good.
I'll squash them into the DRDB9 series to keep the history clean.
Regards,
Christoph
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 4/4] drbd: Add check for error pointer
2026-03-17 23:23 ` [PATCH 4/4] drbd: Add check for error pointer Ethan Tidmore
@ 2026-03-26 14:26 ` Christoph Böhmwalder
0 siblings, 0 replies; 7+ messages in thread
From: Christoph Böhmwalder @ 2026-03-26 14:26 UTC (permalink / raw)
To: Ethan Tidmore, Philipp Reisner, Lars Ellenberg, Jens Axboe
Cc: drbd-dev, linux-block, linux-kernel
On 3/18/26 00:23, Ethan Tidmore wrote:
> The function find_cfg_context_attr() can return an error pointer or NULL
> in its error path.
>
> Change NULL check to IS_ERR_OR_NULL().
>
> Detected by Smatch:
> drivers/block/drbd/drbd_nl.c:6571 drbd_adm_dump_paths() error:
> 'resource_filter' dereferencing possible ERR_PTR()
>
> Fixes: 626c95b0e2a23 ("drbd: rework netlink interface for DRBD 9 multi-peer config")
> Signed-off-by: Ethan Tidmore <ethantidmore06@gmail.com>
> ---
> drivers/block/drbd/drbd_nl.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
> index c5e253820ccf..1f458eb972e9 100644
> --- a/drivers/block/drbd/drbd_nl.c
> +++ b/drivers/block/drbd/drbd_nl.c
> @@ -6566,7 +6566,7 @@ static int drbd_adm_dump_paths(struct sk_buff *skb, struct netlink_callback *cb)
> resource = (struct drbd_resource *)cb->args[0];
> if (!cb->args[0]) {
> resource_filter = find_cfg_context_attr(cb->nlh, T_ctx_resource_name);
> - if (resource_filter) {
> + if (!IS_ERR_OR_NULL(resource_filter)) {
> retcode = ERR_RES_NOT_KNOWN;
> resource = drbd_find_resource(nla_data(resource_filter));
> if (!resource)
find_cfg_context_attr is also called identically in 3 other cases, so
these have the same issue.
I've also fixed these 3 cases in my squash.
Regards,
Christoph
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-03-26 14:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-17 23:23 [PATCH 0/4] drbd: A few bug fixes Ethan Tidmore
2026-03-17 23:23 ` [PATCH 1/4] drbd: Fix out-of-bounds access Ethan Tidmore
2026-03-17 23:23 ` [PATCH 2/4] drbd: Fix variable dereference before check Ethan Tidmore
2026-03-17 23:23 ` [PATCH 3/4] drbd: Add missing error code in drbd_main.c Ethan Tidmore
2026-03-17 23:23 ` [PATCH 4/4] drbd: Add check for error pointer Ethan Tidmore
2026-03-26 14:26 ` Christoph Böhmwalder
2026-03-26 14:25 ` [PATCH 0/4] drbd: A few bug fixes Christoph Böhmwalder
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox