Author: mcayland Date: Sat May 1 11:48:57 2010 New Revision: 764 URL: http://tracker.coreboot.org/trac/openbios/changeset/764
Log: Add checks to the read_io, seek_io and close_io routines to ensure that they do not perform any actions if an invalid file handle (-1) is passed. This resolves the issue with extra arguments being left on the Forth stack when an invalid device access is attempted.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@siriusit.co.uk
Modified: trunk/openbios-devel/libc/diskio.c
Modified: trunk/openbios-devel/libc/diskio.c ============================================================================== --- trunk/openbios-devel/libc/diskio.c Fri Apr 30 23:56:29 2010 (r763) +++ trunk/openbios-devel/libc/diskio.c Sat May 1 11:48:57 2010 (r764) @@ -164,27 +164,40 @@ int read_io( int fd, void *buf, size_t cnt ) { - priv_fd_t *fdp = file_descriptors[fd]; + priv_fd_t *fdp; ucell ret;
- PUSH( (ucell)buf ); - PUSH( cnt ); - call_package( fdp->read_xt, fdp->ih ); - ret = POP(); + if (fd != -1) { + fdp = file_descriptors[fd];
- if( !ret && cnt ) + PUSH( (ucell)buf ); + PUSH( cnt ); + call_package( fdp->read_xt, fdp->ih ); + ret = POP(); + + if( !ret && cnt ) + ret = -1; + } else { ret = -1; + } + return ret; }
int seek_io( int fd, llong offs ) { - priv_fd_t *fdp = file_descriptors[fd]; + priv_fd_t *fdp;
- DPUSH( offs ); - call_package( fdp->seek_xt, fdp->ih ); - return ((((cell)POP()) >= 0)? 0 : -1); + if (fd != -1) { + fdp = file_descriptors[fd]; + + DPUSH( offs ); + call_package( fdp->seek_xt, fdp->ih ); + return ((((cell)POP()) >= 0)? 0 : -1); + } else { + return -1; + } }
llong @@ -203,13 +216,17 @@ int close_io( int fd ) { - priv_fd_t *fdp = file_descriptors[fd]; + priv_fd_t *fdp; + + if (fd != -1) { + fdp = file_descriptors[fd];
- if( fdp->do_close ) - close_dev( fdp->ih ); - free( fdp ); + if( fdp->do_close ) + close_dev( fdp->ih ); + free( fdp );
- file_descriptors[fd]=NULL; + file_descriptors[fd]=NULL; + }
return 0; }