lkml.org 
[lkml]   [2018]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 096/164] libnvdimm, namespace: use a safe lookup for dimm device name
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Dan Williams <dan.j.williams@intel.com>

    commit 4f8672201b7e7ed4f5f6c3cf6dcd080648580582 upstream.

    The following NULL dereference results from incorrectly assuming that
    ndd is valid in this print:

    struct nvdimm_drvdata *ndd = to_ndd(&nd_region->mapping[i]);

    /*
    * Give up if we don't find an instance of a uuid at each
    * position (from 0 to nd_region->ndr_mappings - 1), or if we
    * find a dimm with two instances of the same uuid.
    */
    dev_err(&nd_region->dev, "%s missing label for %pUb\n",
    dev_name(ndd->dev), nd_label->uuid);

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
    IP: nd_region_register_namespaces+0xd67/0x13c0 [libnvdimm]
    PGD 0 P4D 0
    Oops: 0000 [#1] SMP PTI
    CPU: 43 PID: 673 Comm: kworker/u609:10 Not tainted 4.16.0-rc4+ #1
    [..]
    RIP: 0010:nd_region_register_namespaces+0xd67/0x13c0 [libnvdimm]
    [..]
    Call Trace:
    ? devres_add+0x2f/0x40
    ? devm_kmalloc+0x52/0x60
    ? nd_region_activate+0x9c/0x320 [libnvdimm]
    nd_region_probe+0x94/0x260 [libnvdimm]
    ? kernfs_add_one+0xe4/0x130
    nvdimm_bus_probe+0x63/0x100 [libnvdimm]

    Switch to using the nvdimm device directly.

    Fixes: 0e3b0d123c8f ("libnvdimm, namespace: allow multiple pmem...")
    Cc: <stable@vger.kernel.org>
    Reported-by: Dave Jiang <dave.jiang@intel.com>
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/nvdimm/namespace_devs.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/drivers/nvdimm/namespace_devs.c
    +++ b/drivers/nvdimm/namespace_devs.c
    @@ -1926,7 +1926,7 @@ struct device *create_namespace_pmem(str
    }

    if (i < nd_region->ndr_mappings) {
    - struct nvdimm_drvdata *ndd = to_ndd(&nd_region->mapping[i]);
    + struct nvdimm *nvdimm = nd_region->mapping[i].nvdimm;

    /*
    * Give up if we don't find an instance of a uuid at each
    @@ -1934,7 +1934,7 @@ struct device *create_namespace_pmem(str
    * find a dimm with two instances of the same uuid.
    */
    dev_err(&nd_region->dev, "%s missing label for %pUb\n",
    - dev_name(ndd->dev), nd_label->uuid);
    + nvdimm_name(nvdimm), nd_label->uuid);
    rc = -EINVAL;
    goto err;
    }

    \
     
     \ /
      Last update: 2018-04-22 17:23    [W:4.472 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site