From: Markus Elfring <[email protected]>
Date: Wed, 23 Dec 2015 14:31:01 +0100

The kfree() function was called by the ldm_validate_privheads() function
during error handling even if the passed variable "ph" contained
a null pointer.

* Corresponding implementation details could be improved by adjustments
  for jump targets according to the Linux coding style convention.

* The variable "result" will eventually be set to an appropriate value.
  Thus let us omit the explicit initialisation at the beginning.

Signed-off-by: Markus Elfring <[email protected]>
---
 block/partitions/ldm.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/block/partitions/ldm.c b/block/partitions/ldm.c
index 3118d24..6fc9150 100644
--- a/block/partitions/ldm.c
+++ b/block/partitions/ldm.c
@@ -335,16 +335,20 @@ static bool ldm_validate_privheads(struct 
parsed_partitions *state,
        struct privhead *ph[3] = { ph1 };
        Sector sect;
        u8 *data;
-       bool result = false;
+       bool result;
        long num_sects;
        int i;
 
        BUG_ON (!state || !ph1);
 
        ph[1] = kmalloc (sizeof (*ph[1]), GFP_KERNEL);
+       if (!ph[1])
+               return false;
        ph[2] = kmalloc (sizeof (*ph[2]), GFP_KERNEL);
-       if (!ph[1] || !ph[2])
-               goto out;
+       if (!ph[2]) {
+               result = false;
+               goto free_a_head;
+       }
 
        /* off[1 & 2] are relative to ph[0]->config_start */
        ph[0]->config_start = 0;
@@ -355,14 +359,15 @@ static bool ldm_validate_privheads(struct 
parsed_partitions *state,
                                        &sect);
                if (!data) {
                        ldm_crit ("Disk read failed.");
-                       goto out;
+                       result = false;
+                       goto free_another_head;
                }
                result = ldm_parse_privhead (data, ph[i]);
                put_dev_sector (sect);
                if (!result) {
                        ldm_error ("Cannot find PRIVHEAD %d.", i+1); /* Log 
again */
                        if (i < 2)
-                               goto out;       /* Already logged */
+                               goto free_another_head; /* Already logged */
                        else
                                break;  /* FIXME ignore for now, 3rd PH can 
fail on odd-sized disks */
                }
@@ -373,30 +378,31 @@ static bool ldm_validate_privheads(struct 
parsed_partitions *state,
        if ((ph[0]->config_start > num_sects) ||
           ((ph[0]->config_start + ph[0]->config_size) > num_sects)) {
                ldm_crit ("Database extends beyond the end of the disk.");
-               goto out;
+               goto free_another_head;
        }
 
        if ((ph[0]->logical_disk_start > ph[0]->config_start) ||
           ((ph[0]->logical_disk_start + ph[0]->logical_disk_size)
                    > ph[0]->config_start)) {
                ldm_crit ("Disk and database overlap.");
-               goto out;
+               goto free_another_head;
        }
 
        if (!ldm_compare_privheads (ph[0], ph[1])) {
                ldm_crit ("Primary and backup PRIVHEADs don't match.");
-               goto out;
+               goto free_another_head;
        }
        /* FIXME ignore this for now
        if (!ldm_compare_privheads (ph[0], ph[2])) {
                ldm_crit ("Primary and backup PRIVHEADs don't match.");
-               goto out;
+               goto free_another_head;
        }*/
        ldm_debug ("Validated PRIVHEADs successfully.");
        result = true;
-out:
-       kfree (ph[1]);
-       kfree (ph[2]);
+free_another_head:
+       kfree(ph[2]);
+free_a_head:
+       kfree(ph[1]);
        return result;
 }
 
-- 
2.6.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to