Thermal/int340x/processor_thermal: Fix memory leak
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Tue, 23 Dec 2014 23:23:35 +0000 (15:23 -0800)
committerZhang Rui <rui.zhang@intel.com>
Wed, 24 Dec 2014 02:37:43 +0000 (10:37 +0800)
Address memory leak for buffer allocated with ACPI_ALLOCATE_BUFFER.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
drivers/thermal/int340x_thermal/processor_thermal_device.c

index f83c55b09e526eee85eaa2cbce3988ad3e634c67..31bb553aac2633e6ca96ad6c115fe409c610bc35 100644 (file)
@@ -127,6 +127,7 @@ static int proc_thermal_add(struct device *dev,
        union acpi_object *elements, *ppcc;
        union acpi_object *p;
        int i;
+       int ret;
 
        adev = ACPI_COMPANION(dev);
 
@@ -137,16 +138,20 @@ static int proc_thermal_add(struct device *dev,
        p = buf.pointer;
        if (!p || (p->type != ACPI_TYPE_PACKAGE)) {
                dev_err(dev, "Invalid PPCC data\n");
-               return -EFAULT;
+               ret = -EFAULT;
+               goto free_buffer;
        }
        if (!p->package.count) {
                dev_err(dev, "Invalid PPCC package size\n");
-               return -EFAULT;
+               ret = -EFAULT;
+               goto free_buffer;
        }
 
        proc_priv = devm_kzalloc(dev, sizeof(*proc_priv), GFP_KERNEL);
-       if (!proc_priv)
-               return -ENOMEM;
+       if (!proc_priv) {
+               ret = -ENOMEM;
+               goto free_buffer;
+       }
 
        proc_priv->dev = dev;
        proc_priv->adev = adev;
@@ -154,9 +159,10 @@ static int proc_thermal_add(struct device *dev,
        for (i = 0; i < min((int)p->package.count - 1, 2); ++i) {
                elements = &(p->package.elements[i+1]);
                if (elements->type != ACPI_TYPE_PACKAGE ||
-                   elements->package.count != 6)
-                       return -EFAULT;
-
+                   elements->package.count != 6) {
+                       ret = -EFAULT;
+                       goto free_buffer;
+               }
                ppcc = elements->package.elements;
                proc_priv->power_limits[i].index = ppcc[0].integer.value;
                proc_priv->power_limits[i].min_uw = ppcc[1].integer.value;
@@ -168,8 +174,13 @@ static int proc_thermal_add(struct device *dev,
 
        *priv = proc_priv;
 
-       return sysfs_create_group(&dev->kobj,
-                                 &power_limit_attribute_group);
+       ret = sysfs_create_group(&dev->kobj,
+                                &power_limit_attribute_group);
+
+free_buffer:
+       kfree(buf.pointer);
+
+       return ret;
 }
 
 void proc_thermal_remove(struct proc_thermal_device *proc_priv)