From: Yue Hu <[email protected]> The return value of ftell() is a long int, use ftello{64} instead. Also, use lseek64 for large file position to avoid this error if we have it. And need to return at once if they fail.
Signed-off-by: Yue Hu <[email protected]> --- configure.ac | 2 ++ lib/fragments.c | 34 +++++++++++++++++++++++++++++----- lib/inode.c | 9 +++++++-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index a736ff0..5c9666a 100644 --- a/configure.ac +++ b/configure.ac @@ -190,6 +190,8 @@ AC_CHECK_FUNCS(m4_flatten([ llistxattr memset realpath + lseek64 + ftello64 pread64 pwrite64 strdup diff --git a/lib/fragments.c b/lib/fragments.c index e69ae47..4302cd5 100644 --- a/lib/fragments.c +++ b/lib/fragments.c @@ -3,7 +3,18 @@ * Copyright (C), 2022, Coolpad Group Limited. * Created by Yue Hu <[email protected]> */ +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE +#endif +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif +#ifndef _GNU_SOURCE #define _GNU_SOURCE +#endif #include <stdlib.h> #include <unistd.h> #include "erofs/err.h" @@ -30,6 +41,13 @@ static struct list_head dupli_frags[FRAGMENT_HASHSIZE]; static FILE *packedfile; const char *frags_packedname = "packed_file"; +#ifndef HAVE_LSEEK64 +static inline off_t lseek64(int fd, u64 offset, int set) +{ + return lseek(fd, offset, set); +} +#endif + static int z_erofs_fragments_dedupe_find(struct erofs_inode *inode, int fd, u32 crc) { @@ -53,8 +71,7 @@ static int z_erofs_fragments_dedupe_find(struct erofs_inode *inode, int fd, if (!data) return -ENOMEM; - ret = lseek(fd, inode->i_size - length, SEEK_SET); - if (ret < 0) { + if (lseek64(fd, inode->i_size - length, SEEK_SET) < 0) { ret = -errno; goto out; } @@ -113,8 +130,7 @@ int z_erofs_fragments_dedupe(struct erofs_inode *inode, int fd, u32 *tofcrc) if (inode->i_size <= EROFS_TOF_HASHLEN) return 0; - ret = lseek(fd, inode->i_size - EROFS_TOF_HASHLEN, SEEK_SET); - if (ret < 0) + if (lseek64(fd, inode->i_size - EROFS_TOF_HASHLEN, SEEK_SET) < 0) return -errno; ret = read(fd, data_to_hash, EROFS_TOF_HASHLEN); @@ -192,9 +208,17 @@ void z_erofs_fragments_commit(struct erofs_inode *inode) int z_erofs_pack_fragments(struct erofs_inode *inode, void *data, unsigned int len, u32 tofcrc) { +#ifdef HAVE_FTELLO64 + off64_t offset = ftello64(packedfile); +#else + off_t offset = ftello(packedfile); +#endif int ret; - inode->fragmentoff = ftell(packedfile); + if (offset < 0) + return -errno; + + inode->fragmentoff = (erofs_off_t)offset; inode->fragment_size = len; if (fwrite(data, len, 1, packedfile) != 1) diff --git a/lib/inode.c b/lib/inode.c index 9de4dec..a8510f3 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -1196,7 +1196,10 @@ struct erofs_inode *erofs_mkfs_build_special_from_fd(int fd, const char *name) struct erofs_inode *inode; int ret; - lseek(fd, 0, SEEK_SET); + ret = lseek(fd, 0, SEEK_SET); + if (ret < 0) + return ERR_PTR(-errno); + ret = fstat64(fd, &st); if (ret) return ERR_PTR(-errno); @@ -1223,7 +1226,9 @@ struct erofs_inode *erofs_mkfs_build_special_from_fd(int fd, const char *name) ret = erofs_write_compressed_file(inode, fd); if (ret == -ENOSPC) { - lseek(fd, 0, SEEK_SET); + ret = lseek(fd, 0, SEEK_SET); + if (ret < 0) + return ERR_PTR(-errno); ret = write_uncompressed_file_from_fd(inode, fd); } -- 2.17.1
