summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Kostka <kostka.grzegorz@gmail.com>2017-10-20 09:40:37 +0200
committerGitHub <noreply@github.com>2017-10-20 09:40:37 +0200
commit2d9c5b5d776dcaa543b4a37f738617dfca64fff1 (patch)
tree0b56d87e7a61e40d0eb74a3a07f188d2ade16cf5
parentcc66c4021879f44ff267298c4a666ae8d78d9e43 (diff)
parentd8218c9442655f8bdebb912483d425dded654bfd (diff)
Merge pull request #33 from enetor/fseek
Use int64_t as offset to ext4_fseek.
-rw-r--r--include/ext4.h2
-rw-r--r--src/ext4.c10
2 files changed, 7 insertions, 5 deletions
diff --git a/include/ext4.h b/include/ext4.h
index 3694410..516bbdd 100644
--- a/include/ext4.h
+++ b/include/ext4.h
@@ -368,7 +368,7 @@ int ext4_fwrite(ext4_file *file, const void *buf, size_t size, size_t *wcnt);
* @ref SEEK_END
*
* @return Standard error code.*/
-int ext4_fseek(ext4_file *file, uint64_t offset, uint32_t origin);
+int ext4_fseek(ext4_file *file, int64_t offset, uint32_t origin);
/**@brief Get file position.
*
diff --git a/src/ext4.c b/src/ext4.c
index b27ae6b..a6d3e23 100644
--- a/src/ext4.c
+++ b/src/ext4.c
@@ -2016,23 +2016,25 @@ Finish:
return r;
}
-int ext4_fseek(ext4_file *file, uint64_t offset, uint32_t origin)
+int ext4_fseek(ext4_file *file, int64_t offset, uint32_t origin)
{
switch (origin) {
case SEEK_SET:
- if (offset > file->fsize)
+ if (offset < 0 || (uint64_t)offset > file->fsize)
return EINVAL;
file->fpos = offset;
return EOK;
case SEEK_CUR:
- if ((offset + file->fpos) > file->fsize)
+ if ((offset < 0 && (uint64_t)(-offset) > file->fpos) ||
+ (offset > 0 &&
+ (uint64_t)offset > (file->fsize - file->fpos)))
return EINVAL;
file->fpos += offset;
return EOK;
case SEEK_END:
- if (offset > file->fsize)
+ if (offset < 0 || (uint64_t)offset > file->fsize)
return EINVAL;
file->fpos = file->fsize - offset;