Colin Watson
2010-Jul-14 13:11 UTC
[syslinux] [PATCH] gfxboot: fix buffer overrun when loading kernel/initramfs
If the file size wasn't a multiple of 64KB, we could overwrite the next
entry in the malloc arena so reading the initramfs would fail.
Signed-off-by: Colin Watson <cjwatson at ubuntu.com>
---
com32/gfxboot/gfxboot.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/com32/gfxboot/gfxboot.c b/com32/gfxboot/gfxboot.c
index dd4d641..0fbfadd 100644
--- a/com32/gfxboot/gfxboot.c
+++ b/com32/gfxboot/gfxboot.c
@@ -21,6 +21,7 @@
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <minmax.h>
#include <syslinux/loadfile.h>
#include <syslinux/config.h>
@@ -749,7 +750,7 @@ void *load_one(char *file, ssize_t *file_size)
if(size) {
buf = malloc(size);
for(i = 1, cur = 0 ; cur < size && i > 0; cur += i) {
- i = save_read(fd, buf + cur, CHUNK_SIZE);
+ i = save_read(fd, buf + cur, min(CHUNK_SIZE, size - cur));
if(i == -1) break;
gfx_progress_update(i);
}
--
1.7.1
Sebastian Herbszt
2010-Jul-15 12:54 UTC
[syslinux] [PATCH] gfxboot: fix buffer overrun when loadingkernel/initramfs
Colin Watson wrote:> If the file size wasn't a multiple of 64KB, we could overwrite the next > entry in the malloc arena so reading the initramfs would fail.Can you please describe how to reproduce the problem you're facing?> Signed-off-by: Colin Watson <cjwatson at ubuntu.com> > --- > com32/gfxboot/gfxboot.c | 3 ++- > 1 files changed, 2 insertions(+), 1 deletions(-) > > diff --git a/com32/gfxboot/gfxboot.c b/com32/gfxboot/gfxboot.c > index dd4d641..0fbfadd 100644 > --- a/com32/gfxboot/gfxboot.c > +++ b/com32/gfxboot/gfxboot.c > @@ -21,6 +21,7 @@ > #include <fcntl.h> > #include <sys/types.h> > #include <sys/stat.h> > +#include <minmax.h> > > #include <syslinux/loadfile.h> > #include <syslinux/config.h> > @@ -749,7 +750,7 @@ void *load_one(char *file, ssize_t *file_size) > if(size) { > buf = malloc(size); > for(i = 1, cur = 0 ; cur < size && i > 0; cur += i) { > - i = save_read(fd, buf + cur, CHUNK_SIZE); > + i = save_read(fd, buf + cur, min(CHUNK_SIZE, size - cur));If there are fewer bytes to read (e.g. size-cur) than we request (CHUNK_SIZE) the read() call should return the fewer bytes (i == size-cur) and not overrun buf.> if(i == -1) break; > gfx_progress_update(i); > } > -- > 1.7.1Sebastian