From 4dde645d3ef7219e36888b7a76191ce6beecd9a6 Mon Sep 17 00:00:00 2001 From: Tim Gardner Date: Tue, 9 Jul 2013 09:19:03 -0600 Subject: [PATCH] UBUNTU: tegra fb: fix NULL deref in sysfs BugLink: http://bugs.launchpad.net/bugs/1190225 Signed-off-by: Tim Gardner --- arch/arm/mach-tegra/include/mach/fb.h | 2 +- drivers/video/tegra/dc/dc_sysfs.c | 6 ++++-- drivers/video/tegra/fb.c | 19 +++++++++++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-tegra/include/mach/fb.h b/arch/arm/mach-tegra/include/mach/fb.h index 5f4a57e..2dbf407 100644 --- a/arch/arm/mach-tegra/include/mach/fb.h +++ b/arch/arm/mach-tegra/include/mach/fb.h @@ -28,7 +28,7 @@ struct tegra_fb_data; struct tegra_fb_info; struct resource; -int tegra_fb_get_mode(struct tegra_dc *dc); +int tegra_fb_get_mode(struct tegra_dc *dc, int *mode); int tegra_fb_set_mode(struct tegra_dc *dc, int fps); #ifdef CONFIG_FB_TEGRA diff --git a/drivers/video/tegra/dc/dc_sysfs.c b/drivers/video/tegra/dc/dc_sysfs.c index 0b259c3..077923b 100644 --- a/drivers/video/tegra/dc/dc_sysfs.c +++ b/drivers/video/tegra/dc/dc_sysfs.c @@ -286,11 +286,13 @@ static DEVICE_ATTR(stereo_mode, static ssize_t nvdps_show(struct device *device, struct device_attribute *attr, char *buf) { - int refresh_rate; + int err, refresh_rate; struct nvhost_device *ndev = to_nvhost_device(device); struct tegra_dc *dc = nvhost_get_drvdata(ndev); - refresh_rate = tegra_fb_get_mode(dc); + err = tegra_fb_get_mode(dc, &refresh_rate); + if (err < 0) + return err; return snprintf(buf, PAGE_SIZE, "%d\n", refresh_rate); } diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c index 0272b7f..c74fffe 100644 --- a/drivers/video/tegra/fb.c +++ b/drivers/video/tegra/fb.c @@ -411,8 +411,23 @@ static int tegra_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long return 0; } -int tegra_fb_get_mode(struct tegra_dc *dc) { - return dc->fb->info->mode->refresh; +int tegra_fb_get_mode(struct tegra_dc *dc, int *mode) { + int err = 0; + if (dc && dc->fb && dc->fb->info && dc->fb->info->mode) + *mode = dc->fb->info->mode->refresh; + else { + err = -EFAULT; + *mode = 0; + if (!dc) + pr_err("%s dc==NULL\n",__FUNCTION__); + else if (!dc->fb) + pr_err("%s dc->fb==NULL\n",__FUNCTION__); + else if (!dc->fb->info) + pr_err("%s dc->fb-info==NULL\n",__FUNCTION__); + else if (!dc->fb->info->mode) + pr_err("%s dc->fb->info->mode==NULL\n",__FUNCTION__); + } + return err; } int tegra_fb_set_mode(struct tegra_dc *dc, int fps) { -- 1.7.9.5