[OpenBIOS] r546 - trunk/openbios-devel/modules
svn at openbios.org
svn at openbios.org
Mon Aug 10 22:18:27 CEST 2009
Author: laurent
Date: 2009-08-10 22:18:27 +0200 (Mon, 10 Aug 2009)
New Revision: 546
Modified:
trunk/openbios-devel/modules/disk-label.c
Log:
This patch modifies disk-label.c to not allow to read beyond
the selected partition limits.
Signed-off-by: Laurent Vivier <Laurent at vivier.eu>
Modified: trunk/openbios-devel/modules/disk-label.c
===================================================================
--- trunk/openbios-devel/modules/disk-label.c 2009-08-10 19:57:43 UTC (rev 545)
+++ trunk/openbios-devel/modules/disk-label.c 2009-08-10 20:18:27 UTC (rev 546)
@@ -99,8 +99,8 @@
if( ph ) {
di->offs_hi = 0;
di->offs_lo = 0;
- di->size_hi = -1;
- di->size_lo = -1;
+ di->size_hi = 0;
+ di->size_lo = 0;
di->part_ih = 0;
di->type = -1;
di->block_size = 512;
@@ -174,7 +174,14 @@
{
int ret, len = POP();
char *buf = (char*)POP();
+ llong pos = tell( di->fd );
+ ducell offs = ((ducell)di->offs_hi << BITS) | di->offs_lo;
+ ducell size = ((ducell)di->size_hi << BITS) | di->size_lo;
+ if (size && len > pos - offs + size) {
+ len = size - (pos - offs);
+ }
+
ret = read_io( di->fd, buf, len );
PUSH( ret );
}
@@ -188,6 +195,7 @@
ducell offs = ((ducell)di->offs_hi << BITS) | di->offs_lo;
ducell size = ((ducell)di->size_hi << BITS) | di->size_lo;
+ DPRINTF("dlabel_seek %llx [%llx, %llx]\n", pos, offs, size);
if( pos != -1 )
pos += offs;
else if( size ) {
@@ -196,8 +204,12 @@
} else {
/* let parent handle the EOF seek. */
}
+ DPRINTF("dlabel_seek: 0x%llx\n", pos );
+ if (size && (pos - offs >= size )) {
+ PUSH(-1);
+ return;
+ }
- DPRINTF("dlabel_seek: %x %08x\n", (int)(pos>>32), (int)pos );
ret = seek_io( di->fd, pos );
PUSH( ret );
}
More information about the OpenBIOS
mailing list