Use ext2_ino_t instead of ino_t for referencing inode numbers.
Use loff_t for offsets instead of off_t to avoid 32-bit overflow.
Use unsigned int for flags so that they are not negative numbers.
Cast int products to ssize_t before multiplication to avoid overflow.
Signed-off-by: Andreas Dilger <adilger@dilger.ca>
Change-Id: Iaeaea8cb8b38902aefd1f4e9919d17fbe23ebbe5
Reviewed-on: https://review.whamcloud.com/37424
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
/*
* Return the count of number of directories in the dx_dir_info structure
*/
-int e2fsck_get_num_dx_dirinfo(e2fsck_t ctx)
+ext2_ino_t e2fsck_get_num_dx_dirinfo(e2fsck_t ctx)
{
return ctx->dx_dir_info_count;
}
/*
* A simple interator function
*/
-struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx, int *control)
+struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx, ext2_ino_t *control)
{
if (*control >= ctx->dx_dir_info_count)
return 0;
- return(ctx->dx_dir_info + (*control)++);
+ return ctx->dx_dir_info + (*control)++;
}
char *log_fn;
FILE *problem_logf;
char *problem_log_fn;
- int flags; /* E2fsck internal flags */
- int options;
- int blocksize; /* blocksize */
- blk64_t use_superblock; /* sb requested by user */
- blk64_t superblock; /* sb used to open fs */
- blk64_t num_blocks; /* Total number of blocks */
- blk64_t free_blocks;
- ino_t free_inodes;
- int mount_flags;
- int openfs_flags;
+ unsigned flags; /* E2fsck internal flags */
+ unsigned options;
+ unsigned blocksize; /* blocksize */
+ blk64_t use_superblock; /* sb requested by user */
+ blk64_t superblock; /* sb used to open fs */
+ blk64_t num_blocks; /* Total number of blocks */
+ blk64_t free_blocks;
+ ext2_ino_t free_inodes;
+ unsigned mount_flags;
+ unsigned openfs_flags;
blkid_cache blkid; /* blkid cache */
#ifdef HAVE_SETJMP_H
struct ext2_inode *inode, int num_blocks);
extern struct dx_dir_info *e2fsck_get_dx_dir_info(e2fsck_t ctx, ext2_ino_t ino);
extern void e2fsck_free_dx_dir_info(e2fsck_t ctx);
-extern int e2fsck_get_num_dx_dirinfo(e2fsck_t ctx);
-extern struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx, int *control);
+extern ext2_ino_t e2fsck_get_num_dx_dirinfo(e2fsck_t ctx);
+extern struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx,
+ ext2_ino_t *control);
/* ea_refcount.c */
typedef __u64 ea_key_t;
const char *source);
#define e2fsck_mark_inode_bad(ctx, ino, count) \
e2fsck_mark_inode_bad_loc(ctx, ino, count, __func__, __LINE__)
-extern void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, ino_t ino, int count,
+extern void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, ext2_ino_t ino, int count,
const char *func, const int line);
-extern int is_inode_bad(e2fsck_t ctx, ino_t ino);
extern void e2fsck_intercept_block_allocations(e2fsck_t ctx);
/* pass2.c */
static void mark_table_blocks(e2fsck_t ctx);
static void alloc_bb_map(e2fsck_t ctx);
static void alloc_imagic_map(e2fsck_t ctx);
-static void add_encrypted_dir(e2fsck_t ctx, ino_t ino);
+static void add_encrypted_dir(e2fsck_t ctx, ext2_ino_t ino);
static void handle_fs_bad_blocks(e2fsck_t ctx);
static void process_inodes(e2fsck_t ctx, char *block_buf);
static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b);
/*
* Mark an inode as being bad and increment its badness counter.
*/
-void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, ino_t ino, int count,
+void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, ext2_ino_t ino, int count,
const char *func, const int line)
{
struct problem_context pctx;
func, line, (unsigned long)ino, result, count + result);
}
-static void add_encrypted_dir(e2fsck_t ctx, ino_t ino)
+static void add_encrypted_dir(e2fsck_t ctx, ext2_ino_t ino)
{
struct problem_context pctx;
int max_array, num_array;
unsigned int dir_size;
int compress;
- ino_t parent;
+ ext2_ino_t parent;
ext2_ino_t dir;
struct ext2_dir_entry *dot_de;
struct ext2_dir_entry *dotdot_de;
blk64_t should_be;
struct problem_context pctx;
blk64_t free_blocks = 0;
- ino_t free_inodes = 0;
+ ext2_ino_t free_inodes = 0;
int csum_flag, clear_test_fs_flag;
inodes_per_block = EXT2_INODES_PER_BLOCK(fs->super);
errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags)
{
- unsigned int group, left, c, d;
+ dgrp_t group;
+ ssize_t left, c, d;
char *buf, *cp;
blk64_t blk;
ssize_t actual;
errcode_t retval;
- off_t r;
+ loff_t r;
buf = malloc(fs->blocksize * BUF_BLOCKS);
if (!buf)
return ENOMEM;
for (group = 0; group < fs->group_desc_count; group++) {
- blk = ext2fs_inode_table_loc(fs, (unsigned)group);
+ blk = ext2fs_inode_table_loc(fs, group);
if (!blk) {
retval = EXT2_ET_MISSING_INODE_TABLE;
goto errout;
retval = errno;
goto errout;
}
- if (actual != (ssize_t) (fs->blocksize * d)) {
+ if (actual != fs->blocksize * d) {
retval = EXT2_ET_SHORT_WRITE;
goto errout;
}
errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd,
int flags EXT2FS_ATTR((unused)))
{
- unsigned int group, c, left;
+ dgrp_t group;
+ ssize_t c, left;
char *buf;
blk64_t blk;
ssize_t actual;
return ENOMEM;
for (group = 0; group < fs->group_desc_count; group++) {
- blk = ext2fs_inode_table_loc(fs, (unsigned)group);
+ blk = ext2fs_inode_table_loc(fs, group);
if (!blk) {
retval = EXT2_ET_MISSING_INODE_TABLE;
goto errout;
retval = errno;
goto errout;
}
- if (actual != (ssize_t) (fs->blocksize * c)) {
+ if (actual != fs->blocksize * c) {
retval = EXT2_ET_SHORT_READ;
goto errout;
}
}
#endif
- actual = write(fd, cp, fs->blocksize * fs->desc_blocks);
+ actual = write(fd, cp, (ssize_t)fs->blocksize * fs->desc_blocks);
#ifdef WORDS_BIGENDIAN
retval = errno;
goto errout;
}
- if (actual != (ssize_t) (fs->blocksize * fs->desc_blocks)) {
+ if (actual != (ssize_t)fs->blocksize * fs->desc_blocks) {
retval = EXT2_ET_SHORT_WRITE;
goto errout;
}
ssize_t actual, size;
errcode_t retval;
- size = fs->blocksize * (fs->group_desc_count + 1);
+ size = (ssize_t)fs->blocksize * (fs->group_desc_count + 1);
buf = malloc(size);
if (!buf)
return ENOMEM;
memcpy(fs->super, buf, SUPERBLOCK_SIZE);
memcpy(fs->group_desc, buf + fs->blocksize,
- fs->blocksize * fs->group_desc_count);
+ (ssize_t)fs->blocksize * fs->group_desc_count);
retval = 0;
return err;
}
-static int is_hardlink(struct hdlinks_s *hdlinks, dev_t dev, ino_t ino)
+static int is_hardlink(struct hdlinks_s *hdlinks, dev_t dev, ext2_ino_t ino)
{
int i;
struct ext2_inode inode;
ext2_file_t journal_file;
errcode_t retval;
- ino_t ino = fs->super->s_journal_inum;
+ ext2_ino_t ino = fs->super->s_journal_inum;
char buf[1024];
if (fs->flags & EXT2_FLAG_IMAGE_FILE)
int flags, fd;
ext2_filsys fs = NULL;
ext2fs_block_bitmap corrupt_map;
- off_t hsize, count, off, offset, corrupt_bytes;
+ loff_t hsize, count, off, offset, corrupt_bytes;
unsigned char c;
- off_t i;
+ loff_t i;
/* If mounted rw, force dryrun mode */
ret = ext2fs_check_if_mounted(fsname, &flags);
c |= 0x80;
if (verbose)
printf("Corrupting byte %lld in block %lld to 0x%x\n",
- (long long) off % fs->blocksize,
- (long long) off / fs->blocksize, c);
+ off % fs->blocksize,
+ off / fs->blocksize, c);
if (dryrun)
continue;
#ifdef HAVE_PWRITE64
* structure, so there's no point in letting the ext2fs library read
* the inode again.
*/
-static ino_t stashed_ino = 0;
+static ext2_ino_t stashed_ino = 0;
static struct ext2_inode *stashed_inode;
static errcode_t meta_get_blocks(ext2_filsys fs EXT2FS_ATTR((unused)),
{
struct ext2_inode inode;
errcode_t retval;
- ino_t ino = fs->super->s_journal_inum;
+ ext2_ino_t ino = fs->super->s_journal_inum;
retval = ext2fs_read_inode(fs, ino, &inode);
if (retval) {