diff options
author | Markus Armbruster <armbru@redhat.com> | 2013-01-23 18:25:08 +0100 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2013-01-26 13:23:33 +0000 |
commit | d09acb9b5ef0bb4fa94d3d459919a6ebaf8804bc (patch) | |
tree | 3ab5a8bc33f0856f130c055b1c1eba2e7585ce9a /hw | |
parent | a6e7c18476f5383720b3f57ef4f467b2e7c2565e (diff) | |
download | qemu-d09acb9b5ef0bb4fa94d3d459919a6ebaf8804bc.zip |
fw_cfg: Splash image loader can overrun a stack variable, fix
read_splashfile() passes the address of an int variable as size_t *
parameter to g_file_get_contents(), with a cast to gag the compiler.
No problem on machines where sizeof(size_t) == sizeof(int).
Happens to work on my x86_64 box (64 bit little endian): the least
significant 32 bits of the file size end up in the right place
(caller's variable file_size), and the most significant 32 bits
clobber a place that gets assigned to before its next use (caller's
variable file_type).
I'd expect it to break on a 64 bit big-endian box.
Fix up the variable types and drop the problematic cast.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/fw_cfg.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c index e4dc7c3c31..b7da5c768e 100644 --- a/hw/fw_cfg.c +++ b/hw/fw_cfg.c @@ -54,7 +54,8 @@ struct FWCfgState { #define JPG_FILE 0 #define BMP_FILE 1 -static char *read_splashfile(char *filename, int *file_sizep, int *file_typep) +static char *read_splashfile(char *filename, size_t *file_sizep, + int *file_typep) { GError *err = NULL; gboolean res; @@ -63,7 +64,7 @@ static char *read_splashfile(char *filename, int *file_sizep, int *file_typep) unsigned int filehead = 0; int bmp_bpp; - res = g_file_get_contents(filename, &content, (gsize *)file_sizep, &err); + res = g_file_get_contents(filename, &content, file_sizep, &err); if (res == FALSE) { error_report("failed to read splash file '%s'", filename); g_error_free(err); @@ -111,7 +112,7 @@ static void fw_cfg_bootsplash(FWCfgState *s) const char *boot_splash_filename = NULL; char *p; char *filename, *file_data; - int file_size; + size_t file_size; int file_type = -1; const char *temp; |