9
0
Fork 0

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:
Sascha Hauer 2008-08-01 08:59:27 +02:00
parent ec1b86784d
commit f295acb556
4 changed files with 14 additions and 12 deletions

View File

@ -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,
};

View File

@ -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
View File

@ -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);

View File

@ -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)