]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: dc: fix memory leak
authorSagar Kadamati <skadamati@nvidia.com>
Fri, 14 Aug 2015 11:02:22 +0000 (16:32 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Fri, 25 Sep 2015 14:28:23 +0000 (07:28 -0700)
Fix memory leak within tegra_dc_probe

Bug 200130473
Bug 200102293

Change-Id: I138822422b45807b097b090108c43e9c7c095080
Signed-off-by: Sagar Kadamati <skadamati@nvidia.com>
Reviewed-on: http://git-master/r/789475
(cherry picked from commit f7dc4cf349ffc73c002a903cbd3608eae52652e1)
Signed-off-by: Yogish Kulkarni <yogishk@nvidia.com>
Reviewed-on: http://git-master/r/759443
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
drivers/video/tegra/dc/dc.c
drivers/video/tegra/dc/edid.c
drivers/video/tegra/dc/hdmi.c
drivers/video/tegra/dc/hdmi2.0.c
drivers/video/tegra/dc/hdmi_state_machine.c

index 83d4992aceccf4fb2f85b9234e823e6425668850..1293080701c51cf5d4a2621c7b65c64a7fe9246f 100644 (file)
@@ -4659,6 +4659,7 @@ static int tegra_dc_probe(struct platform_device *ndev)
                struct tegra_dc_lvds_data *lvds = tegra_dc_get_outdata(dc);
                if (!tegra_edid_get_monspecs(lvds->edid, &specs))
                        tegra_dc_set_fb_mode(dc, specs.modedb, false);
+               kfree(specs.modedb);
        }
 
 #ifndef CONFIG_TEGRA_ISOMGR
index b907e3e331e09076787afd49f7c35ba2a256fb25..6d9a321bdffa77f20cd7aa2143086b70745db161 100644 (file)
@@ -518,6 +518,7 @@ int tegra_edid_get_monspecs(struct tegra_edid *edid, struct fb_monspecs *specs)
        u8 checksum = 0;
        u8 *data;
 
+       memset(specs, 0x0, sizeof(struct fb_monspecs));
        new_data = vzalloc(SZ_32K + sizeof(struct tegra_edid_pvt));
        if (!new_data)
                return -ENOMEM;
@@ -542,7 +543,6 @@ int tegra_edid_get_monspecs(struct tegra_edid *edid, struct fb_monspecs *specs)
                        goto fail;
        }
 
-       memset(specs, 0x0, sizeof(struct fb_monspecs));
        memset(&new_data->eld, 0x0, sizeof(new_data->eld));
        fb_edid_to_monspecs(data, specs);
        if (specs->modedb == NULL) {
index ba45ab675d8669302e4bb215438d265d42bff67e..918cee004f44a98cd75d0966c8d3a2f5bafac3ff 100644 (file)
@@ -1280,6 +1280,7 @@ static int tegra_dc_hdmi_init(struct tegra_dc *dc)
                if (tegra_dc_hpd(dc) && (!dc->initialized)) {
                        if (!tegra_edid_get_monspecs(hdmi->edid, &specs))
                                tegra_dc_set_fb_mode(dc, specs.modedb, false);
+                       kfree(specs.modedb);
                } else
                        tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, false);
        }
index d8c4c85e30ef6532ecf3c5df9011b898826a5acf..c837f2bf3b8f0a1a644f855d5c61ba42bcd6a937 100644 (file)
@@ -1081,6 +1081,7 @@ static int tegra_dc_hdmi_init(struct tegra_dc *dc)
                                tegra_dc_set_fb_mode(dc,
                                                &tegra_dc_vga_mode, false);
                        }
+                       kfree(specs.modedb);
                } else
                        tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, false);
        }
index 32ed7a5a6ee5ef28d03f9072ac79e47435281a93..03858b3c03223f8e905a989e0edf525df836efa3 100644 (file)
@@ -254,14 +254,17 @@ static void handle_check_edid_l(struct tegra_dc_hdmi_data *hdmi)
                if (work_state.edid_reads >= MAX_EDID_READ_ATTEMPTS) {
                        pr_info("Failed to read EDID after %d times. Giving up.\n",
                                work_state.edid_reads);
+                       kfree(specs.modedb);
                        goto end_disabled;
                } else {
                        hdmi_state_machine_set_state_l(HDMI_STATE_CHECK_EDID,
                                                       CHECK_EDID_DELAY_MS);
                }
 
+               kfree(specs.modedb);
                return;
        }
+       kfree(specs.modedb);
 
        if (tegra_edid_get_eld(hdmi->edid, &hdmi->eld) < 0) {
                pr_err("error populating eld\n");