Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1638967 > unrolled thread

[block-xen-blkback] question about pontential null pointer dereference

Started by"Gustavo A. R. Silva" <garsilva@embeddedor.com>
First post2017-05-10 19:00 +0200
Last post2017-05-11 17:40 +0200
Articles 4 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [block-xen-blkback] question about pontential null pointer  dereference "Gustavo A. R. Silva" <garsilva@embeddedor.com> - 2017-05-10 19:00 +0200
    Re: [Xen-devel] [block-xen-blkback] question about pontential null  pointer dereference Juergen Gross <jgross@suse.com> - 2017-05-11 11:00 +0200
      Re: [Xen-devel] [block-xen-blkback] question about pontential null  pointer dereference "Gustavo A. R. Silva" <garsilva@embeddedor.com> - 2017-05-11 17:20 +0200
        [PATCH] block: xen-blkback: add null check to avoid null pointer  dereference "Gustavo A. R. Silva" <garsilva@embeddedor.com> - 2017-05-11 17:40 +0200

#1638967 — [block-xen-blkback] question about pontential null pointer dereference

From"Gustavo A. R. Silva" <garsilva@embeddedor.com>
Date2017-05-10 19:00 +0200
Subject[block-xen-blkback] question about pontential null pointer dereference
Message-ID<tFD7X-37G-1@gated-at.bofh.it>
Hello everybody,

While looking into Coverity ID 1350942 I ran into the following piece  
of code at drivers/block/xen-blkback/xenbus.c:490:

490static int xen_blkbk_remove(struct xenbus_device *dev)
491{
492        struct backend_info *be = dev_get_drvdata(&dev->dev);
493
494        pr_debug("%s %p %d\n", __func__, dev, dev->otherend_id);
495
496        if (be->major || be->minor)
497                xenvbd_sysfs_delif(dev);
498
499        if (be->backend_watch.node) {
500                unregister_xenbus_watch(&be->backend_watch);
501                kfree(be->backend_watch.node);
502                be->backend_watch.node = NULL;
503        }
504
505        dev_set_drvdata(&dev->dev, NULL);
506
507        if (be->blkif)
508                xen_blkif_disconnect(be->blkif);
509
510        /* Put the reference we set in xen_blkif_alloc(). */
511        xen_blkif_put(be->blkif);
512        kfree(be->mode);
513        kfree(be);
514        return 0;
515}

The issue here is that line 507 implies that be->blkif might be NULL.  
If this is the case, there is a NULL pointer dereference when  
executing line 511 once macro xen_blkif_put() dereference be->blkif

Is there any chance for be->blkif to be NULL at line 511?

I'm trying to figure out if this is a false positive or something that  
actually needs to be fixed.

I'd really appreciate any comment on this.

Thank you!
--
Gustavo A. R. Silva

[toc] | [next] | [standalone]


#1639256 — Re: [Xen-devel] [block-xen-blkback] question about pontential null pointer dereference

FromJuergen Gross <jgross@suse.com>
Date2017-05-11 11:00 +0200
SubjectRe: [Xen-devel] [block-xen-blkback] question about pontential null pointer dereference
Message-ID<tFS6Z-47s-3@gated-at.bofh.it>
In reply to#1638967
On 10/05/17 18:49, Gustavo A. R. Silva wrote:
> 
> Hello everybody,
> 
> While looking into Coverity ID 1350942 I ran into the following piece of
> code at drivers/block/xen-blkback/xenbus.c:490:
> 
> 490static int xen_blkbk_remove(struct xenbus_device *dev)
> 491{
> 492        struct backend_info *be = dev_get_drvdata(&dev->dev);
> 493
> 494        pr_debug("%s %p %d\n", __func__, dev, dev->otherend_id);
> 495
> 496        if (be->major || be->minor)
> 497                xenvbd_sysfs_delif(dev);
> 498
> 499        if (be->backend_watch.node) {
> 500                unregister_xenbus_watch(&be->backend_watch);
> 501                kfree(be->backend_watch.node);
> 502                be->backend_watch.node = NULL;
> 503        }
> 504
> 505        dev_set_drvdata(&dev->dev, NULL);
> 506
> 507        if (be->blkif)
> 508                xen_blkif_disconnect(be->blkif);
> 509
> 510        /* Put the reference we set in xen_blkif_alloc(). */
> 511        xen_blkif_put(be->blkif);
> 512        kfree(be->mode);
> 513        kfree(be);
> 514        return 0;
> 515}
> 
> The issue here is that line 507 implies that be->blkif might be NULL. If
> this is the case, there is a NULL pointer dereference when executing
> line 511 once macro xen_blkif_put() dereference be->blkif
> 
> Is there any chance for be->blkif to be NULL at line 511?

Yes. xen_blkbk_probe() will call xen_blkbk_remove() with be->blkif being
NULL in the failure path.

The call to xen_blkif_put() should be guarded by the "if (be->blkif)" of
line 507, too.


Juergen

[toc] | [prev] | [next] | [standalone]


#1639714 — Re: [Xen-devel] [block-xen-blkback] question about pontential null pointer dereference

From"Gustavo A. R. Silva" <garsilva@embeddedor.com>
Date2017-05-11 17:20 +0200
SubjectRe: [Xen-devel] [block-xen-blkback] question about pontential null pointer dereference
Message-ID<tFY2M-81A-59@gated-at.bofh.it>
In reply to#1639256
Hi Juergen,

Quoting Juergen Gross <jgross@suse.com>:

> On 10/05/17 18:49, Gustavo A. R. Silva wrote:
>>
>> Hello everybody,
>>
>> While looking into Coverity ID 1350942 I ran into the following piece of
>> code at drivers/block/xen-blkback/xenbus.c:490:
>>
>> 490static int xen_blkbk_remove(struct xenbus_device *dev)
>> 491{
>> 492        struct backend_info *be = dev_get_drvdata(&dev->dev);
>> 493
>> 494        pr_debug("%s %p %d\n", __func__, dev, dev->otherend_id);
>> 495
>> 496        if (be->major || be->minor)
>> 497                xenvbd_sysfs_delif(dev);
>> 498
>> 499        if (be->backend_watch.node) {
>> 500                unregister_xenbus_watch(&be->backend_watch);
>> 501                kfree(be->backend_watch.node);
>> 502                be->backend_watch.node = NULL;
>> 503        }
>> 504
>> 505        dev_set_drvdata(&dev->dev, NULL);
>> 506
>> 507        if (be->blkif)
>> 508                xen_blkif_disconnect(be->blkif);
>> 509
>> 510        /* Put the reference we set in xen_blkif_alloc(). */
>> 511        xen_blkif_put(be->blkif);
>> 512        kfree(be->mode);
>> 513        kfree(be);
>> 514        return 0;
>> 515}
>>
>> The issue here is that line 507 implies that be->blkif might be NULL. If
>> this is the case, there is a NULL pointer dereference when executing
>> line 511 once macro xen_blkif_put() dereference be->blkif
>>
>> Is there any chance for be->blkif to be NULL at line 511?
>
> Yes. xen_blkbk_probe() will call xen_blkbk_remove() with be->blkif being
> NULL in the failure path.
>
> The call to xen_blkif_put() should be guarded by the "if (be->blkif)" of
> line 507, too.
>

Thanks for clarifying. I'll send a patch to fix this shortly.

--
Gustavo A. R. Silva

[toc] | [prev] | [next] | [standalone]


#1639747 — [PATCH] block: xen-blkback: add null check to avoid null pointer dereference

From"Gustavo A. R. Silva" <garsilva@embeddedor.com>
Date2017-05-11 17:40 +0200
Subject[PATCH] block: xen-blkback: add null check to avoid null pointer dereference
Message-ID<tFYm5-88r-1@gated-at.bofh.it>
In reply to#1639714
Add null check before calling xen_blkif_put() to avoid potential
null pointer dereference.

Addresses-Coverity-ID: 1350942
Cc: Juergen Gross <jgross@suse.com>
Signed-off-by: Gustavo A. R. Silva <garsilva@embeddedor.com>
---
 drivers/block/xen-blkback/xenbus.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index 8fe61b5..1f3dfaa 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -504,11 +504,13 @@ static int xen_blkbk_remove(struct xenbus_device *dev)
 
 	dev_set_drvdata(&dev->dev, NULL);
 
-	if (be->blkif)
+	if (be->blkif) {
 		xen_blkif_disconnect(be->blkif);
 
-	/* Put the reference we set in xen_blkif_alloc(). */
-	xen_blkif_put(be->blkif);
+		/* Put the reference we set in xen_blkif_alloc(). */
+		xen_blkif_put(be->blkif);
+	}
+
 	kfree(be->mode);
 	kfree(be);
 	return 0;
-- 
2.5.0

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web