[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] minios: fix bug in lseek for mini-os
# HG changeset patch # User Matthew Fioravante <matthew.fioravante@xxxxxxxxxx> # Date 1353329987 0 # Node ID 42a7c393c3901e3ecb734cd8a5f28894a0364b7e # Parent 17539cec2b9d0f1500d76f43178f57ab0a4160a8 minios: fix bug in lseek for mini-os lseek always used files[fd].file.offset. It should use the offset of whatever union member is actually being used. Signed-off-by: Matthew Fioravante <matthew.fioravante@xxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r 17539cec2b9d -r 42a7c393c390 extras/mini-os/lib/sys.c --- a/extras/mini-os/lib/sys.c Mon Nov 19 12:59:46 2012 +0000 +++ b/extras/mini-os/lib/sys.c Mon Nov 19 12:59:47 2012 +0000 @@ -360,45 +360,54 @@ int write(int fd, const void *buf, size_ off_t lseek(int fd, off_t offset, int whence) { + off_t* target = NULL; switch(files[fd].type) { -#if defined(CONFIG_BLKFRONT) || defined(CONFIG_TPMFRONT) || defined(CONFIG_TPM_TIS) #ifdef CONFIG_BLKFRONT case FTYPE_BLK: + target = &files[fd].blk.offset; + break; #endif -#ifdef CONFIG_TPMFRNT +#ifdef CONFIG_TPMFRONT case FTYPE_TPMFRONT: + target = &files[fd].tpmfront.offset; + break; #endif #ifdef CONFIG_TPM_TIS case FTYPE_TPM_TIS: + target = &files[fd].tpm_tis.offset; + break; #endif - switch (whence) { - case SEEK_SET: - files[fd].file.offset = offset; - break; - case SEEK_CUR: - files[fd].file.offset += offset; - break; - case SEEK_END: - { - struct stat st; - int ret; - ret = fstat(fd, &st); - if (ret) - return -1; - files[fd].file.offset = st.st_size + offset; - break; - } - default: - errno = EINVAL; - return -1; - } - return files[fd].file.offset; - break; -#endif - default: /* Not implemented on this FTYPE */ - errno = ESPIPE; - return (off_t) -1; + case FTYPE_FILE: + target = &files[fd].file.offset; + break; + default: + /* Not implemented for this filetype */ + errno = ESPIPE; + return (off_t) -1; } + + switch (whence) { + case SEEK_SET: + *target = offset; + break; + case SEEK_CUR: + *target += offset; + break; + case SEEK_END: + { + struct stat st; + int ret; + ret = fstat(fd, &st); + if (ret) + return -1; + *target = st.st_size + offset; + break; + } + default: + errno = EINVAL; + return -1; + } + return *target; } int fsync(int fd) { _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |