X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lib%2Fext2fs%2Fread_bb_file.c;h=a6d3bebaf732c3ba601ac200621bfa1ab2f84cbf;hb=f8a9d77cea1fc924f59f24955a1c8d6878410f5c;hp=40c34ee3c35507b58fd3fed2221601c8a9a3ef91;hpb=544349270e4c74a6feb971123884a8cf5052a7ee;p=tools%2Fe2fsprogs.git diff --git a/lib/ext2fs/read_bb_file.c b/lib/ext2fs/read_bb_file.c index 40c34ee..a6d3beb 100644 --- a/lib/ext2fs/read_bb_file.c +++ b/lib/ext2fs/read_bb_file.c @@ -4,11 +4,12 @@ * Copyright (C) 1994, 1995, 2000 Theodore Ts'o. * * %Begin-Header% - * This file may be redistributed under the terms of the GNU Public - * License. + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. * %End-Header% */ +#include "config.h" #include #include #if HAVE_UNISTD_H @@ -29,7 +30,7 @@ /* * Reads a list of bad blocks from a FILE * */ -errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, +errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, ext2_badblocks_list *bb_list, void *priv_data, void (*invalid)(ext2_filsys fs, @@ -38,7 +39,7 @@ errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, void *priv_data)) { errcode_t retval; - blk_t blockno; + unsigned long long blockno; int count; char buf[128]; @@ -54,43 +55,54 @@ errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, while (!feof (f)) { if (fgets(buf, sizeof(buf), f) == NULL) break; - count = sscanf(buf, "%u", &blockno); + count = sscanf(buf, "%llu", &blockno); if (count <= 0) continue; + /* Badblocks isn't going to be updated for 64bit */ + if (blockno >> 32) + return EOVERFLOW; if (fs && ((blockno < fs->super->s_first_data_block) || - (blockno >= fs->super->s_blocks_count))) { + (blockno >= ext2fs_blocks_count(fs->super)))) { if (invalid) - (invalid)(fs, blockno, buf, priv_data); + (invalid)(fs, (blk64_t) blockno, buf, priv_data); continue; } - retval = ext2fs_badblocks_list_add(*bb_list, blockno); + retval = ext2fs_badblocks_list_add(*bb_list, (blk64_t) blockno); if (retval) return retval; } return 0; } +struct compat_struct { + void (*invalid)(ext2_filsys, blk_t); +}; + static void call_compat_invalid(ext2_filsys fs, blk_t blk, - char *badstr EXT2FS_ATTR((unused)), + char *badstr EXT2FS_ATTR((unused)), void *priv_data) { - void (*invalid)(ext2_filsys, blk_t); + struct compat_struct *st; - invalid = (void (*)(ext2_filsys, blk_t)) priv_data; - if (invalid) - invalid(fs, blk); + st = (struct compat_struct *) priv_data; + if (st->invalid) + (st->invalid)(fs, blk); } /* * Reads a list of bad blocks from a FILE * */ -errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, +errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, ext2_badblocks_list *bb_list, void (*invalid)(ext2_filsys fs, blk_t blk)) { - return ext2fs_read_bb_FILE2(fs, f, bb_list, (void *) invalid, + struct compat_struct st; + + st.invalid = invalid; + + return ext2fs_read_bb_FILE2(fs, f, bb_list, &st, call_compat_invalid); }