Commit ec9c96ef authored by Kyle McMartin's avatar Kyle McMartin Committed by Ingo Molnar

dma-debug: Fix check_unmap null pointer dereference

While it's debatable whether or not a NULL device argument to
the DMA API functions is valid... since it certainly isn't
valid on devices with an IOMMU... dma-debug really shouldn't be
dereferencing null pointers either.

Guard against that in err_printk and the driver_filter
functions. A Fedora rawhide user was seeing this in one of the
dvb drivers resulting in an oops on boot.

[ A patch has been sent for testing to the driver, but I feel
  the dma debugging support should be fixed as well. (There's
  still a pile of legacy garbage in the kernel passing null
  pointers to dma_{alloc,free}_*. :( ]
Signed-off-by: default avatarKyle McMartin <kyle@redhat.com>
Cc: mchehab@infradead.org
Cc: Joerg Roedel <joerg.roedel@amd.com>
LKML-Reference: <20090820011708.GP25206@bombadil.infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 429966b8
...@@ -156,9 +156,13 @@ static bool driver_filter(struct device *dev) ...@@ -156,9 +156,13 @@ static bool driver_filter(struct device *dev)
return true; return true;
/* driver filter on and initialized */ /* driver filter on and initialized */
if (current_driver && dev->driver == current_driver) if (current_driver && dev && dev->driver == current_driver)
return true; return true;
/* driver filter on, but we can't filter on a NULL device... */
if (!dev)
return false;
if (current_driver || !current_driver_name[0]) if (current_driver || !current_driver_name[0])
return false; return false;
...@@ -183,17 +187,17 @@ static bool driver_filter(struct device *dev) ...@@ -183,17 +187,17 @@ static bool driver_filter(struct device *dev)
return ret; return ret;
} }
#define err_printk(dev, entry, format, arg...) do { \ #define err_printk(dev, entry, format, arg...) do { \
error_count += 1; \ error_count += 1; \
if (driver_filter(dev) && \ if (driver_filter(dev) && \
(show_all_errors || show_num_errors > 0)) { \ (show_all_errors || show_num_errors > 0)) { \
WARN(1, "%s %s: " format, \ WARN(1, "%s %s: " format, \
dev_driver_string(dev), \ dev ? dev_driver_string(dev) : "NULL", \
dev_name(dev) , ## arg); \ dev ? dev_name(dev) : "NULL", ## arg); \
dump_entry_trace(entry); \ dump_entry_trace(entry); \
} \ } \
if (!show_all_errors && show_num_errors > 0) \ if (!show_all_errors && show_num_errors > 0) \
show_num_errors -= 1; \ show_num_errors -= 1; \
} while (0); } while (0);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment