lseek: return -1 for errors and check for that return value
We cannot check for < 0 in lseek, otherwise we get problems with files > 0x7fffffff Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
ec1b86784d
commit
f295acb556
|
@ -110,7 +110,7 @@ int memory_display(char *addr, ulong offs, ulong nbytes, int size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int open_and_lseek(const char *filename, int mode, ulong pos)
|
||||
int open_and_lseek(const char *filename, int mode, off_t pos)
|
||||
{
|
||||
int fd, ret;
|
||||
|
||||
|
@ -122,9 +122,9 @@ int open_and_lseek(const char *filename, int mode, ulong pos)
|
|||
|
||||
if (!pos)
|
||||
return fd;
|
||||
|
||||
printf("lseek to 0x%08x\n", pos);
|
||||
ret = lseek(fd, pos, SEEK_SET);
|
||||
if (ret < 0) {
|
||||
if (ret == -1) {
|
||||
perror("lseek");
|
||||
close(fd);
|
||||
return ret;
|
||||
|
@ -532,7 +532,7 @@ static struct driver_d mem_drv = {
|
|||
.close = dev_close_default,
|
||||
.read = mem_read,
|
||||
.write = mem_write,
|
||||
.lseek = dev_lseek_default,
|
||||
.lseek = dev_lseek_default,
|
||||
};
|
||||
|
||||
static struct driver_d ram_drv = {
|
||||
|
@ -542,7 +542,7 @@ static struct driver_d ram_drv = {
|
|||
.close = dev_close_default,
|
||||
.read = mem_read,
|
||||
.write = mem_write,
|
||||
.lseek = dev_lseek_default,
|
||||
.lseek = dev_lseek_default,
|
||||
.type = DEVICE_TYPE_DRAM,
|
||||
};
|
||||
|
||||
|
|
|
@ -47,11 +47,11 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s
|
|||
static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
|
||||
{
|
||||
struct device_d *dev = f->inode;
|
||||
int ret;
|
||||
off_t ret;
|
||||
|
||||
ret = dev_lseek(dev, pos);
|
||||
|
||||
if (ret >= 0)
|
||||
if (ret != -1)
|
||||
f->pos = pos;
|
||||
|
||||
return ret;
|
||||
|
|
10
fs/fs.c
10
fs/fs.c
|
@ -516,14 +516,16 @@ off_t lseek(int fildes, off_t offset, int whence)
|
|||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f = &files[fildes];
|
||||
ulong pos;
|
||||
off_t pos;
|
||||
|
||||
errno = 0;
|
||||
|
||||
dev = f->dev;
|
||||
fsdrv = (struct fs_driver_d *)dev->driver->type_data;
|
||||
if (!fsdrv->lseek)
|
||||
return -ENOSYS;
|
||||
if (!fsdrv->lseek) {
|
||||
errno = -ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(whence) {
|
||||
case SEEK_SET:
|
||||
|
@ -549,7 +551,7 @@ off_t lseek(int fildes, off_t offset, int whence)
|
|||
|
||||
out:
|
||||
errno = -EINVAL;
|
||||
return errno;
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(lseek);
|
||||
|
||||
|
|
|
@ -217,7 +217,7 @@ off_t dev_lseek(struct device_d *dev, off_t offset)
|
|||
if (dev->driver->lseek)
|
||||
return dev->driver->lseek(dev, offset);
|
||||
errno = -ENOSYS;
|
||||
return -ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int dev_open(struct device_d *dev, struct filep *f)
|
||||
|
|
Loading…
Reference in New Issue