linux/drivers/power
Krzysztof Kozlowski 8e59c7f234 power_supply: Fix NULL pointer dereference during bq27x00_battery probe
Power supply is often registered during probe of a driver. The
power_supply_register() returns pointer to newly allocated structure as
return value. However before returning the power_supply_register()
calls back the get_property() method provided by the driver through
uevent.

In that time the driver probe is still in progress and driver did not
assigned pointer to power supply to its local variables. This leads to
NULL pointer dereference from get_property() function.
Starting from bq27x00_battery_probe():
  di->bat = power_supply_register()
    device_add()
      kobject_uevent()
        power_supply_uevent()
          power_supply_show_property()
            power_supply_get_property()
              bq27x00_battery_get_property()
                dereference of (di->bat) which is NULL here

The first uevent of power supply (the one coming from device creation)
should not call back to the driver. To prevent that from happening,
increment the atomic use counter at the end of power_supply_register().
This means that power_supply_get_property() will return -ENODEV.

IMPORTANT:
The patch has impact on this first uevent sent from power supply because
it will not contain properties from power supply.

The uevent with properties will be sent later after indicating that
power supply has changed. This also has a race now, but will be fixed in
other patches.

Reported-by: H. Nikolaus Schaller <hns@goldelico.com>
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Fixes: 297d716f62 ("power_supply: Change ownership from driver to core")
Tested-By: Dr. H. Nikolaus Schaller <hns@goldelico.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
2015-05-21 15:40:54 +02:00
..
avs PM / AVS: rockchip-io: add driver handling Rockchip io domains 2014-09-25 09:57:23 -07:00
reset power: reset: Add MFD_SYSCON depends for brcmstb 2015-05-01 22:48:28 +02:00
88pm860x_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
88pm860x_charger.c power_supply: 88pm860x_charger: Fix possible NULL pointer dereference and use of initialized variable 2015-03-20 12:46:04 +01:00
ab8500_bmdata.c ab8500_bmdata: Export abx500_res_to_temp tables for hwmon 2013-04-16 17:38:10 -07:00
ab8500_btemp.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ab8500_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ab8500_fg.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
abx500_chargalg.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
apm_power.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
axp288_fuel_gauge.c axp288_fuel_gauge: Add original author details 2015-04-30 17:19:55 +02:00
bq27x00_battery.c power: bq27x00_battery: Add missing MODULE_ALIAS 2015-05-01 23:01:48 +02:00
bq2415x_charger.c power_supply: bq2415x_charger: Decrement the power supply's device reference counter 2015-03-13 23:15:54 +01:00
bq24190_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
bq24735-charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
charger-manager.c power_supply: charger-manager: Fix dereferencing of ERR_PTR 2015-03-24 13:40:14 +01:00
collie_battery.c power_supply: fix oops in collie_battery driver 2015-04-30 17:39:40 +02:00
da9030_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
da9052-battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
da9150-charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ds2760_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ds2780_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ds2781_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ds2782_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
generic-adc-battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
goldfish_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
gpio-charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
intel_mid_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ipaq_micro_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
isp1704_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
jz4740-battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
Kconfig X-Power AXP288 PMIC Fuel Gauge Driver 2015-03-07 20:08:58 +01:00
lp8727_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
lp8788-charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
ltc2941-battery-gauge.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
Makefile X-Power AXP288 PMIC Fuel Gauge Driver 2015-03-07 20:08:58 +01:00
max8903_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
max8925_power.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
max8997_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
max8998_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
max14577_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
max17040_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
max17042_battery.c power: max17042_battery: add missed blank 2015-04-06 17:46:46 +02:00
max77693_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
olpc_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
pcf50633-charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
pda_power.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
pm2301_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
pm2301_charger.h power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
pmu_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
power_supply_core.c power_supply: Fix NULL pointer dereference during bq27x00_battery probe 2015-05-21 15:40:54 +02:00
power_supply_leds.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
power_supply_sysfs.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
power_supply.h device.h: cleanup users outside of linux/include (C files) 2012-03-11 14:27:37 -04:00
rt5033_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
rx51_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
s3c_adc_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
sbs-battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
smb347-charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
test_power.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
tosa_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
tps65090-charger.c power: constify of_device_id array 2015-03-20 13:23:06 +01:00
twl4030_charger.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
twl4030_madc_battery.c power: twl4030_madc_battery: Add missing MODULE_ALIAS 2015-04-06 19:39:57 +02:00
wm97xx_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
wm831x_backup.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
wm831x_power.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
wm8350_power.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00
z2_battery.c power_supply: Change ownership from driver to core 2015-03-13 23:15:51 +01:00