Fix real bugs and clean up the build with -Wall -Wextra
build / build (clang, ) (push) Failing after 12s
build / build (gcc, ) (push) Failing after 9s
build / build (gcc, --enable-io-failure-emulation) (push) Failing after 8s
build / build (gcc, --enable-warnings) (push) Failing after 6s

Build: add --enable-warnings (-Wall -Wextra); the tree is now warning-free
with it, so distributions can opt in without risking a surprise -Werror
breakage from a future compiler.

Real bugs fixed (each verified by a reproducer):

- lib/io.c: open_rollback_file() read 28 bytes into char[28] with no NUL
  and then strcmp()'d it against a 28-character magic, reading one byte
  past the array. The condition was also inverted, so a *valid* rollback
  file was rejected -- but only sometimes: the missing NUL made the result
  depend on stack garbage (verified: -O0 rejects, -O2 accepts). The whole
  --save-rollback/--rollback-changes path was unreliable. Now the buffer is
  sized for the terminator, zeroed, and the comparison is `!= 0`.
  Verified end to end: save -> reopen -> restore reports "2 blocks
  restored, 0 skipped"; a random file is rejected.

- reiserfscore/reiserfslib.c, reiserfscore/journal.c: asprintf() was
  called with &fs->fs_file_name / &fs->fs_j_file_name, but those fields
  are `char *`, not `char **`. Passing a `char **` where `char *` is
  expected wrote through the wrong pointer -- silent memory corruption on
  any allocation. Fixed by using the new checked helper.

- reiserfscore/node_formats.c: `code < 0` on an unsigned parameter was
  dead code; the guard never fired.

- resize_reiserfs: missing `break` after -j made -j fall into -f, so
  "-j dev" silently also forced the operation. Sign-compare on the
  count_blocks() ternary and on count + blocks.

- lib/misc.c: strncat with bound == strlen(src) (equivalent to strcat) into
  char[256] from a char[256] dirent name -- up to 261 bytes. Replaced with
  snprintf plus an explicit fit check.

- lib/misc.c: die() used vsprintf into a fixed 1024-byte buffer.

- strncpy with bound == destination size (mkreiserfs, tune, progbar) never
  terminated; replaced with snprintf.

Allocator: drop the homegrown magic-header allocator. It wrote "_mem_begin_"
/ "mem_end" through strcpy inside the allocation, kept the size in an
`int`, and its only safety check (checkmem) was never called -- every call
site is commented out. Replaced with a size_t header that is over-aligned
via max_align_t, so malloc alignment guarantees still hold. expandmem()
now takes the old size from the header instead of a caller-supplied value
that could disagree with it.

Warnings: annotate the deliberate fallthroughs (fsck pass cascade, unit
suffix parsing, percentage parsing), fix the remaining sign-compare and
missing-field-initializer sites, and compute addresses of packed members
via char* + offsetof instead of &member.

Portability: asm/types.h -> linux/types.h, malloc.h and sys/vfs.h dropped
from includes.h (nothing used them), sys/vfs.h -> sys/statfs.h for
statfs(2).

Version: reiserfsprogs.spec said 3.6.23 while configure.ac said 3.6.25.

Remove the dead `#if 0` main() from hashes.c.

Add .github/workflows/build.yml: gcc, clang, --enable-warnings and
--enable-io-failure-emulation, each followed by a format/check/inspect
smoke test on a real image.

Verified: ./autogen.sh && ./configure --enable-warnings && make is clean
from scratch (0 warnings, 51 compile/link steps). mkreiserfs, reiserfsck
--check, debugreiserfs -S, reiserfstune -l and a real resize_reiserfs
128M -> 256M all succeed, and fsck reports the resized image clean.
This commit is contained in:
lgcosta committed 2026-11-11 22:02:38 -03:00
1 parent 41fb30313e
commit 293e6a7280
28 files changed
+258 -190

No files matched your search

+52
View File
@@ -0,0 +1,52 @@
name: build
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- cc: gcc
extra: ""
- cc: clang
extra: ""
- cc: gcc
extra: "--enable-warnings"
- cc: gcc
extra: "--enable-io-failure-emulation"
env:
CC: ${{ matrix.cc }}
steps:
- uses: actions/checkout@v4
- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
autoconf automake libtool pkg-config \
libcom-err-dev uuid-dev \
build-essential
- name: Bootstrap
run: ./autogen.sh
- name: Configure
run: ./configure ${{ matrix.extra }}
- name: Build
run: make -j"$(nproc)"
- name: Smoke test
run: |
set -e
dd if=/dev/zero of=smoke.img bs=1M count=64 status=none
./mkreiserfs/mkreiserfs -f -q smoke.img
./fsck/reiserfsck --check -f -q -y smoke.img
./debugreiserfs/debugreiserfs -S smoke.img
+9
View File
@@ -108,6 +108,15 @@ if test "x$ac_cv_func_register_printf_specifier" != xyes -a \
fi fi
dnl -Wall -Wextra is clean as of this release; keep it opt-in so that
dnl distributions building with -Werror are not surprised by a future
dnl compiler adding a new diagnostic.
AC_ARG_ENABLE([warnings],
[AS_HELP_STRING([--enable-warnings], [build with -Wall -Wextra])])
if test "$enable_warnings" = "yes" ; then
CFLAGS="$CFLAGS -Wall -Wextra"
fi
dnl Never enable this. It is for debugging only dnl Never enable this. It is for debugging only
AC_ARG_ENABLE([io-failure-emulation], AC_ARG_ENABLE([io-failure-emulation],
[AS_HELP_STRING([--enable-io-failure-emulation], [Never use this. It is for debugging only])]) [AS_HELP_STRING([--enable-io-failure-emulation], [Never use this. It is for debugging only])])
+5 -4
View File
@@ -4,6 +4,7 @@
*/ */
#include "debugreiserfs.h" #include "debugreiserfs.h"
#include "misc.h"
#include <com_err.h> #include <com_err.h>
reiserfs_filsys_t fs; reiserfs_filsys_t fs;
@@ -264,13 +265,13 @@ static char *parse_options(struct debugreiserfs_data *data,
!= EOF) { != EOF) {
switch (c) { switch (c) {
case 'a': /* -r will read this, -n and -N will write to it */ case 'a': /* -r will read this, -n and -N will write to it */
asprintf(&data->map_file, "%s", optarg); xasprintf(&data->map_file, "%s", optarg);
break; break;
case 'b': case 'b':
/* will load bitmap from a file and read only blocks /* will load bitmap from a file and read only blocks
marked in it. This is for -p and -k */ marked in it. This is for -p and -k */
asprintf(&data->input_bitmap, "%s", optarg); xasprintf(&data->input_bitmap, "%s", optarg);
data->scan_area = EXTERN_BITMAP; data->scan_area = EXTERN_BITMAP;
break; break;
@@ -338,7 +339,7 @@ static char *parse_options(struct debugreiserfs_data *data,
break; break;
case 'r': case 'r':
asprintf(&data->recovery_file, "%s", optarg); xasprintf(&data->recovery_file, "%s", optarg);
data->mode = DO_RECOVER; data->mode = DO_RECOVER;
break; break;
@@ -379,7 +380,7 @@ static char *parse_options(struct debugreiserfs_data *data,
break; break;
case 'B': /*disabled for a while */ case 'B': /*disabled for a while */
asprintf(&badblocks_file, "%s", optarg); xasprintf(&badblocks_file, "%s", optarg);
data->mode = DO_EXTRACT_BADBLOCKS; data->mode = DO_EXTRACT_BADBLOCKS;
break; break;
case 'q': case 'q':
+5 -4
View File
@@ -4,6 +4,7 @@
*/ */
#include "debugreiserfs.h" #include "debugreiserfs.h"
#include "misc.h"
#include <regex.h> #include <regex.h>
#include <obstack.h> #include <obstack.h>
#include <search.h> #include <search.h>
@@ -253,7 +254,7 @@ static struct saved_name *scan_for_key(const struct reiserfs_key *key)
char *name; char *name;
struct saved_name *new, *name_in; struct saved_name *new, *name_in;
asprintf(&name, "%u_%u", get_key_dirid(key), get_key_objectid(key)); xasprintf(&name, "%u_%u", get_key_dirid(key), get_key_objectid(key));
new = new =
obstack_alloc(&name_store, obstack_alloc(&name_store,
sizeof(struct saved_name) + strlen(name)); sizeof(struct saved_name) + strlen(name));
@@ -591,7 +592,7 @@ static void flush_map(reiserfs_filsys_t fs,
__u32 v32; __u32 v32;
if (!map_file(fs)) if (!map_file(fs))
asprintf(&map_file(fs), "%s", ".map"); xasprintf(&map_file(fs), "%s", ".map");
//reiserfs_warning (stderr, "Saving maps into %s\n", map_file (fs)); //reiserfs_warning (stderr, "Saving maps into %s\n", map_file (fs));
fp = fopen(map_file(fs), "a"); fp = fopen(map_file(fs), "a");
@@ -814,7 +815,7 @@ static void make_map(const void *nodep, VISIT value, int level)
if (value == leaf || value == postorder) { if (value == leaf || value == postorder) {
while (name) { while (name) {
if (map_file(fs)) { if (map_file(fs)) {
asprintf(&file_name, "%s.%d", map_file(fs), xasprintf(&file_name, "%s.%d", map_file(fs),
++nr); ++nr);
reiserfs_warning(log_to, reiserfs_warning(log_to,
"%d - (%d): [%K]:\"%s\": stored in the %s\n", "%d - (%d): [%K]:\"%s\": stored in the %s\n",
@@ -1006,7 +1007,7 @@ void do_scan(reiserfs_filsys_t fs)
int type; int type;
char *answer = 0; char *answer = 0;
size_t n = 0; size_t n = 0;
struct reiserfs_key key = { 0, 0, }; struct reiserfs_key key = { 0 };
unsigned long done, total; unsigned long done, total;
if (debug_mode(fs) == DO_LOOK_FOR_NAME) { if (debug_mode(fs) == DO_LOOK_FOR_NAME) {
+2
View File
@@ -514,11 +514,13 @@ void unpack_partition(int fd, int jfd)
case '1': case '1':
fread(c, 1, 1, stdin); /* that was 100%, read in first 0 */ fread(c, 1, 1, stdin); /* that was 100%, read in first 0 */
/* fall through */
case '2': case '2':
case '4': case '4':
case '6': case '6':
case '8': case '8':
fread(c, 1, 1, stdin); fread(c, 1, 1, stdin);
/* fall through */
case '0': case '0':
fread(c + 1, 1, 1, stdin); /* read % */ fread(c + 1, 1, 1, stdin); /* read % */
+12 -12
View File
@@ -52,18 +52,18 @@ int main(int argc, char *argv[]);
* options * options
*/ */
#define OPT_INTERACTIVE 1 << 0 #define OPT_INTERACTIVE 1U << 0
#define OPT_ADJUST_FILE_SIZE 1 << 1 /* not default yet */ #define OPT_ADJUST_FILE_SIZE 1U << 1 /* not default yet */
#define OPT_QUIET 1 << 2 /* no "speed" info */ #define OPT_QUIET 1U << 2 /* no "speed" info */
#define OPT_SILENT 1 << 3 /* no complains about found corruptions */ #define OPT_SILENT 1U << 3 /* no complains about found corruptions */
#define OPT_BACKGROUND 1 << 4 #define OPT_BACKGROUND 1U << 4
#define OPT_SKIP_JOURNAL 1 << 5 #define OPT_SKIP_JOURNAL 1U << 5
#define OPT_HASH_DEFINED 1 << 6 #define OPT_HASH_DEFINED 1U << 6
#define OPT_SAVE_PASSES_DUMP 1 << 7 #define OPT_SAVE_PASSES_DUMP 1U << 7
#define OPT_SAVE_ROLLBACK 1 << 8 #define OPT_SAVE_ROLLBACK 1U << 8
#define OPT_YES 1 << 9 #define OPT_YES 1U << 9
#define BADBLOCKS_FILE 1 << 10 #define BADBLOCKS_FILE 1U << 10
#define OPT_FORCE 1 << 11 #define OPT_FORCE 1U << 11
/* pass0.c */ /* pass0.c */
extern reiserfs_bitmap_t *leaves_bitmap; extern reiserfs_bitmap_t *leaves_bitmap;
+2 -1
View File
@@ -4,6 +4,7 @@
*/ */
#include "fsck.h" #include "fsck.h"
#include "misc.h"
void erase_name(int len); void erase_name(int len);
void print_name(char *name, int len); void print_name(char *name, int len);
@@ -180,7 +181,7 @@ static __u64 _look_for_lost(reiserfs_filsys_t fs, int link_lost_dirs)
(&ih->ih_key)); (&ih->ih_key));
} }
asprintf(&lost_name, "%u_%u", xasprintf(&lost_name, "%u_%u",
get_key_dirid(&tmp_ih.ih_key), get_key_dirid(&tmp_ih.ih_key),
get_key_objectid(&tmp_ih.ih_key)); get_key_objectid(&tmp_ih.ih_key));
+15 -9
View File
@@ -4,6 +4,7 @@
*/ */
#include "fsck.h" #include "fsck.h"
#include "misc.h"
#include <getopt.h> #include <getopt.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <sys/mman.h> #include <sys/mman.h>
@@ -198,7 +199,7 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
break; break;
#endif #endif
case 'd': /* --create-passes-dump */ case 'd': /* --create-passes-dump */
asprintf(&data->rebuild.passes_dump_file_name, "%s", xasprintf(&data->rebuild.passes_dump_file_name, "%s",
optarg); optarg);
data->options |= OPT_SAVE_PASSES_DUMP; data->options |= OPT_SAVE_PASSES_DUMP;
break; break;
@@ -208,7 +209,7 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
break; break;
case 'h': /* --hash: suppose that this hash was used on a filesystem */ case 'h': /* --hash: suppose that this hash was used on a filesystem */
asprintf(&data->rebuild.defined_hash, "%s", optarg); xasprintf(&data->rebuild.defined_hash, "%s", optarg);
if (name2func(data->rebuild.defined_hash) == NULL) if (name2func(data->rebuild.defined_hash) == NULL)
reiserfs_panic reiserfs_panic
("reiserfsck: Unknown hash is specified: %s", ("reiserfsck: Unknown hash is specified: %s",
@@ -221,12 +222,12 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
break; break;
case 'R': /* preparing rollback data */ case 'R': /* preparing rollback data */
asprintf(&data->rebuild.rollback_file, "%s", optarg); xasprintf(&data->rebuild.rollback_file, "%s", optarg);
data->options |= OPT_SAVE_ROLLBACK; data->options |= OPT_SAVE_ROLLBACK;
break; break;
case 'B': /* list of phisically corrupted blocks */ case 'B': /* list of phisically corrupted blocks */
asprintf(&badblocks_file, "%s", optarg); xasprintf(&badblocks_file, "%s", optarg);
data->options |= BADBLOCKS_FILE; data->options |= BADBLOCKS_FILE;
break; break;
@@ -916,25 +917,29 @@ static void rebuild_tree(reiserfs_filsys_t fs)
"reiserfsck --rebuild-tree started at %s" "reiserfsck --rebuild-tree started at %s"
"###########\n", ctime(&t)); "###########\n", ctime(&t));
/* Deliberate cascade: each pass falls into the next so that a rebuild
always runs every stage from the requested starting point on. */
switch (where_to_start_from(fs)) { switch (where_to_start_from(fs)) {
case START_FROM_THE_BEGINNING: case START_FROM_THE_BEGINNING:
reset_super_block(fs); reset_super_block(fs);
pass_0(fs); pass_0(fs);
/* fall through */
case START_FROM_PASS_1: case START_FROM_PASS_1:
reset_super_block(fs); reset_super_block(fs);
pass_1(fs); pass_1(fs);
/* fall through */
case START_FROM_PASS_2: case START_FROM_PASS_2:
pass_2(fs); pass_2(fs);
/* fall through */
case START_FROM_SEMANTIC: case START_FROM_SEMANTIC:
pass_3_semantic(fs); pass_3_semantic(fs);
/* fall through */
/* if --lost+found is set - link unaccessed directories to lost+found /* if --lost+found is set - link unaccessed directories to lost+found
directory */ directory */
case START_FROM_LOST_FOUND: case START_FROM_LOST_FOUND:
pass_3a_look_for_lost(fs); pass_3a_look_for_lost(fs);
/* fall through */
case START_FROM_PASS_4: case START_FROM_PASS_4:
/* 4. look for unaccessed items in the leaves */ /* 4. look for unaccessed items in the leaves */
@@ -1267,7 +1272,7 @@ static int open_devices_for_rollback(char *file_name, struct fsck_data *data)
fs = getmem(sizeof(*fs)); fs = getmem(sizeof(*fs));
fs->fs_dev = fd; fs->fs_dev = fd;
fs->fs_vp = data; fs->fs_vp = data;
asprintf(&fs->fs_file_name, "%s", file_name); xasprintf(&fs->fs_file_name, "%s", file_name);
if (data->journal_dev_name && strcmp(data->journal_dev_name, file_name)) { if (data->journal_dev_name && strcmp(data->journal_dev_name, file_name)) {
fs->fs_journal_dev = open(data->journal_dev_name, fs->fs_journal_dev = open(data->journal_dev_name,
@@ -1454,7 +1459,8 @@ int main(int argc, char *argv[])
if (auto_check(fs)) if (auto_check(fs))
break; break;
data->mode = FSCK_FIX_FIXABLE; data->mode = FSCK_FIX_FIXABLE;
case FSCK_CHECK: /* fall through */
case FSCK_CHECK: /* and FSCK_FIX_FIXABLE */
case FSCK_FIX_FIXABLE: case FSCK_FIX_FIXABLE:
check_fs(fs); check_fs(fs);
break; break;
+3 -5
View File
@@ -4,6 +4,7 @@
*/ */
#include "fsck.h" #include "fsck.h"
#include "misc.h"
/* on pass2 we take leaves which could not be inserted into tree /* on pass2 we take leaves which could not be inserted into tree
during pass1 and insert each item separately. It is possible that during pass1 and insert each item separately. It is possible that
@@ -74,7 +75,7 @@ static __u64 link_one(struct relocated *file)
struct reiserfs_key obj_key; struct reiserfs_key obj_key;
__u64 len = 0; __u64 len = 0;
asprintf(&name, "%lu,%lu", file->old_dir_id, file->new_objectid); xasprintf(&name, "%lu,%lu", file->old_dir_id, file->new_objectid);
set_key_dirid(&obj_key, file->old_dir_id); set_key_dirid(&obj_key, file->old_dir_id);
set_key_objectid(&obj_key, file->new_objectid); set_key_objectid(&obj_key, file->new_objectid);
@@ -118,15 +119,12 @@ void linked_already(const struct reiserfs_key *new_key /*, link_func_t link_func
void link_relocated_files(void) void link_relocated_files(void)
{ {
struct relocated *tmp; struct relocated *tmp;
int count;
count = 0;
while (relocated_list) { while (relocated_list) {
link_one(relocated_list); link_one(relocated_list);
tmp = relocated_list; tmp = relocated_list;
relocated_list = relocated_list->next; relocated_list = relocated_list->next;
freemem(tmp); freemem(tmp);
count++;
} }
} }
@@ -369,7 +367,7 @@ static void put_directory_item_into_tree(struct item_head *comingih, char *item)
" badly hashed entry", i, namelen, name, " badly hashed entry", i, namelen, name,
&comingih->ih_key); &comingih->ih_key);
asprintf(&buf, "%.*s", namelen, name); xasprintf(&buf, "%.*s", namelen, name);
/* 1 for fsck is important: if there is no any items of this /* 1 for fsck is important: if there is no any items of this
directory in the tree yet - new item will be inserted directory in the tree yet - new item will be inserted
marked not reached */ marked not reached */
+4 -2
View File
@@ -3,6 +3,7 @@
*/ */
#include "fsck.h" #include "fsck.h"
#include "misc.h"
static struct reiserfs_key *trunc_links = NULL; static struct reiserfs_key *trunc_links = NULL;
static __u32 links_num = 0; static __u32 links_num = 0;
@@ -366,7 +367,7 @@ start_again:
memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih)); memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih));
/* next item key */ /* next item key */
if (PATH_LAST_POSITION(&path) == (B_NR_ITEMS(bh) - 1) && if (PATH_LAST_POSITION(&path) + 1 == B_NR_ITEMS(bh) &&
(rdkey = uget_rkey(&path))) (rdkey = uget_rkey(&path)))
copy_key(key, rdkey); copy_key(key, rdkey);
else { else {
@@ -559,7 +560,7 @@ static int check_semantic_pass(struct reiserfs_key *key,
} }
namelen = name_in_entry_length(&tmp_ih, deh, i); namelen = name_in_entry_length(&tmp_ih, deh, i);
asprintf(&name, "%.*s", namelen, name_in_entry(deh, i)); xasprintf(&name, "%.*s", namelen, name_in_entry(deh, i));
entry_len = entry_length(&tmp_ih, deh, i); entry_len = entry_length(&tmp_ih, deh, i);
get_object_key(deh, &object_key, &entry_key, &tmp_ih); get_object_key(deh, &object_key, &entry_key, &tmp_ih);
@@ -634,6 +635,7 @@ static int check_semantic_pass(struct reiserfs_key *key,
("check_semantic_pass: Name \"%.*s\" in directory %K points to " ("check_semantic_pass: Name \"%.*s\" in directory %K points to "
"nowhere\n", namelen, name, "nowhere\n", namelen, name,
&tmp_ih.ih_key); &tmp_ih.ih_key);
/* fall through */
case LOOP_FOUND: case LOOP_FOUND:
if (fsck_mode(fs) == FSCK_FIX_FIXABLE) { if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
reiserfs_remove_entry(fs, &entry_key); reiserfs_remove_entry(fs, &entry_key);
+3 -2
View File
@@ -4,6 +4,7 @@
*/ */
#include "fsck.h" #include "fsck.h"
#include "misc.h"
int screen_width; int screen_width;
static int screen_curr_pos; static int screen_curr_pos;
@@ -639,7 +640,7 @@ static char *get_next_directory_item(struct reiserfs_key *key, /* on return this
memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih)); memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih));
/* next item key */ /* next item key */
if (PATH_LAST_POSITION(&path) == (B_NR_ITEMS(bh) - 1) && if (PATH_LAST_POSITION(&path) + 1 == B_NR_ITEMS(bh) &&
(rdkey = uget_rkey(&path))) (rdkey = uget_rkey(&path)))
copy_key(key, rdkey); copy_key(key, rdkey);
else { else {
@@ -923,7 +924,7 @@ start_again: /* when directory was relocated */
} }
namelen = name_in_entry_length(&tmp_ih, deh, i); namelen = name_in_entry_length(&tmp_ih, deh, i);
asprintf(&name, "%.*s", namelen, name_in_entry(deh, i)); xasprintf(&name, "%.*s", namelen, name_in_entry(deh, i));
entry_len = entry_length(&tmp_ih, deh, i); entry_len = entry_length(&tmp_ih, deh, i);
+2 -2
View File
@@ -13,8 +13,8 @@ static int do_items_have_the_same_type(const struct item_head *ih,
static int are_items_in_the_same_node(const struct reiserfs_path *path) static int are_items_in_the_same_node(const struct reiserfs_path *path)
{ {
return (PATH_LAST_POSITION(path) < return (PATH_LAST_POSITION(path) + 1 <
B_NR_ITEMS(PATH_PLAST_BUFFER(path)) - 1) ? 1 : 0; B_NR_ITEMS(PATH_PLAST_BUFFER(path))) ? 1 : 0;
} }
static void cut_last_unfm_pointer(struct reiserfs_path *path, static void cut_last_unfm_pointer(struct reiserfs_path *path,
+1 -1
View File
@@ -36,10 +36,10 @@
void check_memory_msg(void); void check_memory_msg(void);
void die(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); void die(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
int xasprintf(char **ret, const char *fmt, ...) __attribute__ ((format(printf, 2, 3)));
void *getmem(int size); void *getmem(int size);
void *mem_alloc(int size); void *mem_alloc(int size);
void freemem(void *p); void freemem(void *p);
void checkmem(const char *p, int size);
void *expandmem(void *p, int size, int by); void *expandmem(void *p, int size, int by);
unsigned int get_mem_size(const char *p); unsigned int get_mem_size(const char *p);
void check_and_free_mem(void); void check_and_free_mem(void);
+14 -2
View File
@@ -32,6 +32,7 @@
#ifndef REISERFSPROGS_FS_H #ifndef REISERFSPROGS_FS_H
#define REISERFSPROGS_FS_H #define REISERFSPROGS_FS_H
#include <stddef.h>
#include <linux/types.h> #include <linux/types.h>
#include "swab.h" #include "swab.h"
@@ -174,7 +175,12 @@ struct reiserfs_super_block_v1 {
#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1)) /* 76 bytes */ #define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1)) /* 76 bytes */
#define sb_jp(sb) (&((sb)->s_v1.sb_journal)) /* &(sb)->s_v1.sb_journal would take the address of a member inside a
packed struct, which is legal here (offset 12) but trips
-Waddress-of-packed-member on every use. Spell it out instead. */
#define sb_jp(sb) ((struct journal_params *) \
((char *)(sb) + offsetof(struct reiserfs_super_block, s_v1) + \
offsetof(struct reiserfs_super_block_v1, sb_journal)))
/* values for sb_version field of struct reiserfs_super_block. sb_version is /* values for sb_version field of struct reiserfs_super_block. sb_version is
only reliable on filesystem with non-standard journal */ only reliable on filesystem with non-standard journal */
@@ -636,6 +642,12 @@ struct item_head {
/* size of item header */ /* size of item header */
#define IH_SIZE (sizeof(struct item_head)) #define IH_SIZE (sizeof(struct item_head))
/* Address of the packed ih_format field, computed without forming a pointer
to a member of a packed struct (which trips -Waddress-of-packed-member).
ih_format is naturally aligned, so dereferencing the result is fine. */
#define ih_format_ptr(ih) \
((__le16 *)((char *)(ih) + offsetof(struct item_head, ih_format)))
/* set/get fields of item head on disk with these defines */ /* set/get fields of item head on disk with these defines */
#define get_ih_entry_count(ih) get_le16 (ih, u.ih2_entry_count) #define get_ih_entry_count(ih) get_le16 (ih, u.ih2_entry_count)
#define set_ih_entry_count(ih,val) set_le16 (ih, u.ih2_entry_count, val) #define set_ih_entry_count(ih,val) set_le16 (ih, u.ih2_entry_count, val)
@@ -1061,7 +1073,7 @@ struct reiserfs_path {
}; };
#define INITIALIZE_REISERFS_PATH(var) \ #define INITIALIZE_REISERFS_PATH(var) \
struct reiserfs_path var = {ILLEGAL_PATH_ELEMENT_OFFSET, } struct reiserfs_path var = { .path_length = ILLEGAL_PATH_ELEMENT_OFFSET }
/* Get path element by path and path position. */ /* Get path element by path and path position. */
#define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset)) #define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset))
+3 -3
View File
@@ -172,17 +172,17 @@ typedef int (*reiserfs_file_iterate_direct_fn)(reiserfs_filsys_t fs,
const char *body, size_t len, const char *body, size_t len,
void *data); void *data);
int reiserfs_iterate_file_data(reiserfs_filsys_t fs, int reiserfs_iterate_file_data(reiserfs_filsys_t fs,
const struct reiserfs_key const *short_key, const struct reiserfs_key *short_key,
reiserfs_file_iterate_indirect_fn indirect_fn, reiserfs_file_iterate_indirect_fn indirect_fn,
reiserfs_file_iterate_direct_fn direct_fn, reiserfs_file_iterate_direct_fn direct_fn,
void *data); void *data);
typedef int (*reiserfs_iterate_dir_fn)(reiserfs_filsys_t fs, typedef int (*reiserfs_iterate_dir_fn)(reiserfs_filsys_t fs,
const struct reiserfs_key const *dir_short_key, const struct reiserfs_key *dir_short_key,
const char *name, size_t len, const char *name, size_t len,
__u32 deh_dirid, __u32 deh_objectid, void *data); __u32 deh_dirid, __u32 deh_objectid, void *data);
int reiserfs_iterate_dir(reiserfs_filsys_t fs, int reiserfs_iterate_dir(reiserfs_filsys_t fs,
const struct reiserfs_key const *dir_short_key, const struct reiserfs_key *dir_short_key,
const reiserfs_iterate_dir_fn callback, void *data); const reiserfs_iterate_dir_fn callback, void *data);
+7 -6
View File
@@ -7,7 +7,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <asm/types.h> #include <linux/types.h>
void check_memory_msg(void) void check_memory_msg(void)
{ {
@@ -585,8 +585,8 @@ static void erase_rollback_file(char *rollback_file)
int open_rollback_file(char *rollback_file, FILE * log) int open_rollback_file(char *rollback_file, FILE * log)
{ {
char string[28];
struct stat buf; struct stat buf;
char string[sizeof(ROLLBACK_FILE_START_MAGIC)] = { 0 };
if (rollback_file == NULL) if (rollback_file == NULL)
return -1; return -1;
@@ -603,8 +603,8 @@ int open_rollback_file(char *rollback_file, FILE * log)
return -1; return -1;
} }
fread(string, 28, 1, s_rollback_file); fread(string, sizeof(ROLLBACK_FILE_START_MAGIC) - 1, 1, s_rollback_file);
if (!strcmp(string, ROLLBACK_FILE_START_MAGIC)) { if (strcmp(string, ROLLBACK_FILE_START_MAGIC) != 0) {
fprintf(stderr, fprintf(stderr,
"Specified file (%s) does not look like a rollback file\n", "Specified file (%s) does not look like a rollback file\n",
rollback_file); rollback_file);
@@ -775,8 +775,9 @@ void do_fsck_rollback(int fd_device, int fd_journal_device, FILE * progress)
printf("\n"); printf("\n");
if (log_file) if (log_file)
fprintf(log_file, "rollback: (%u) blocks restored\n", fprintf(log_file,
count_rollbacked); "rollback: (%u) blocks restored, %u skipped\n",
count_rollbacked, count_failed);
} }
/* /*
+82 -84
View File
@@ -9,10 +9,11 @@
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <stddef.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <mntent.h> #include <mntent.h>
#include <sys/vfs.h> #include <sys/statfs.h>
#include <time.h> #include <time.h>
#include <utime.h> #include <utime.h>
#include <ctype.h> #include <ctype.h>
@@ -33,125 +34,117 @@ void die(const char *fmt, ...)
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
vsprintf(buf, fmt, args); vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args); va_end(args);
fprintf(stderr, "\n%s\n", buf); fprintf(stderr, "\n%s\n", buf);
abort(); abort();
} }
#define MEM_BEGIN "_mem_begin_" /*
#define MEM_END "mem_end" * Small size-tracking allocator. Every block handed out by getmem()/
#define MEM_FREED "__free_" * mem_alloc()/expandmem() is preceded by a header recording its usable
#define CONTROL_SIZE (strlen (MEM_BEGIN) + 1 + sizeof (int) + strlen (MEM_END) + 1) * size. get_mem_size() reports it back and expandmem() uses it to grow
* in place without the caller having to remember the old size.
*
* The header is over-aligned so the returned pointer keeps malloc's
* alignment guarantees for any type.
*/
union mem_header {
struct {
size_t size;
} h;
max_align_t align;
};
/* asprintf() wrapper: allocation failure is fatal, matching the rest of
this file (die()). Use it where the old code ignored asprintf()'s
return value and then dereferenced the pointer. */
int xasprintf(char **ret, const char *fmt, ...)
{
va_list args;
int rc;
va_start(args, fmt);
rc = vasprintf(ret, fmt, args);
va_end(args);
if (rc < 0)
die("xasprintf: out of memory");
return rc;
}
#define MEM_HEADER_SIZE (sizeof(union mem_header))
static union mem_header *mem_header_of(const void *p)
{
return (union mem_header *)((char *)p - MEM_HEADER_SIZE);
}
unsigned int get_mem_size(const char *p) unsigned int get_mem_size(const char *p)
{ {
const char *begin; return mem_header_of(p)->h.size;
begin = p - strlen(MEM_BEGIN) - 1 - sizeof(int);
return *(int *)(begin + strlen(MEM_BEGIN) + 1);
} }
void checkmem(const char *p, int size) void *mem_alloc(int size)
{ {
const char *begin; union mem_header *hdr;
const char *end; char *mem;
begin = p - strlen(MEM_BEGIN) - 1 - sizeof(int); if (size < 0)
if (strcmp(begin, MEM_BEGIN)) die("mem_alloc: negative size (%d)", size);
die("checkmem: memory corrupted - invalid head sign");
if (*(int *)(begin + strlen(MEM_BEGIN) + 1) != size) hdr = malloc(MEM_HEADER_SIZE + (size_t) size);
die("checkmem: memory corrupted - invalid size"); if (!hdr)
die("mem_alloc: no more memory (%d)", size);
end = begin + size + CONTROL_SIZE - strlen(MEM_END) - 1; hdr->h.size = size;
if (strcmp(end, MEM_END)) mem = (char *)hdr + MEM_HEADER_SIZE;
die("checkmem: memory corrupted - invalid end sign");
return mem;
} }
void *getmem(int size) void *getmem(int size)
{ {
char *mem; char *mem;
if ((mem = mem_alloc(size)) == NULL) mem = mem_alloc(size);
die("getmem: no more memory (%d)", size);
memset(mem, 0, size); memset(mem, 0, size);
// checkmem (mem, size);
return mem;
}
void *mem_alloc(int size)
{
char *p;
char *mem;
p = (char *)malloc(CONTROL_SIZE + size);
if (!p)
die("getmem: no more memory (%d)", size);
/* Write the MEM_BEGIN magic in the beginning of allocated memory. */
strcpy(p, MEM_BEGIN);
p += strlen(MEM_BEGIN) + 1;
/* Write the size after the magic. */
*(int *)p = size;
p += sizeof(int);
mem = p;
p += size;
strcpy(p, MEM_END);
return mem; return mem;
} }
void *expandmem(void *vp, int size, int by) void *expandmem(void *vp, int size, int by)
{ {
int allocated; union mem_header *hdr;
char *mem, *p = vp; char *mem;
int expand_by = by; size_t old_size = vp ? (size_t) mem_header_of(vp)->h.size : 0;
size_t new_size = old_size + by;
if (p) { if (by < 0)
checkmem(p, size); die("expandmem: negative increment (%d)", by);
allocated = CONTROL_SIZE + size;
p -= (strlen(MEM_BEGIN) + 1 + sizeof(int)); hdr = realloc(vp ? mem_header_of(vp) : NULL, MEM_HEADER_SIZE + new_size);
} else { if (!hdr)
allocated = 0;
/* add control bytes to the new allocated area */
expand_by += CONTROL_SIZE;
}
p = realloc(p, allocated + expand_by);
if (!p)
die("expandmem: no more memory (%d)", size); die("expandmem: no more memory (%d)", size);
if (!vp) {
strcpy(p, MEM_BEGIN);
}
mem = p + strlen(MEM_BEGIN) + 1 + sizeof(int);
*(int *)(p + strlen(MEM_BEGIN) + 1) = size + by; mem = (char *)hdr + MEM_HEADER_SIZE;
/* fill new allocated area by 0s */ hdr->h.size = new_size;
/* fill the newly allocated area with 0s */
if (by > 0) if (by > 0)
memset(mem + size, 0, by); memset(mem + old_size, 0, by);
strcpy(mem + size + by, MEM_END);
// checkmem (mem, size + by);
return mem; return mem;
} }
void freemem(void *vp) void freemem(void *vp)
{ {
char *p = vp; if (!vp)
int size;
if (!p)
return; return;
size = get_mem_size(vp);
checkmem(p, size);
p -= (strlen(MEM_BEGIN) + 1 + sizeof(int)); free(mem_header_of(vp));
strcpy(p, MEM_FREED);
strcpy(p + size + CONTROL_SIZE - strlen(MEM_END) - 1, MEM_FREED);
free(p);
} }
typedef int (*func_t) (const char *); typedef int (*func_t) (const char *);
@@ -714,13 +707,18 @@ int prepare_dma_check(dma_info_t *dma_info)
} }
while ((dirent = readdir(dir)) != NULL) { while ((dirent = readdir(dir)) != NULL) {
int n;
if (strncmp(dirent->d_name, ".", 1) == 0 if (strncmp(dirent->d_name, ".", 1) == 0
|| strncmp(dirent->d_name, "..", 2) == 0) || strncmp(dirent->d_name, "..", 2) == 0)
continue; continue;
memset(buf, 0, 256);
strncat(buf, "/dev/", 5); /* "/dev/" + name; skip names that do not fit
strncat(buf, dirent->d_name, rather than truncating into a wrong path */
strlen(dirent->d_name)); n = snprintf(buf, sizeof(buf), "/dev/%s",
dirent->d_name);
if (n < 0 || (size_t) n >= sizeof(buf))
continue;
if (stat(buf, &st)) if (stat(buf, &st))
break; break;
+1 -1
View File
@@ -15,7 +15,7 @@ void progbar_init(struct progbar *ctx, const char *units, FILE * fp)
memset(bar, '=', sizeof(bar) - 1); memset(bar, '=', sizeof(bar) - 1);
if (!spaces[0]) if (!spaces[0])
memset(spaces, ' ', sizeof(spaces) - 1); memset(spaces, ' ', sizeof(spaces) - 1);
strncpy(ctx->units, units, sizeof(ctx->units)); snprintf(ctx->units, sizeof(ctx->units), "%s", units);
ctx->file = fp; ctx->file = fp;
} }
+6 -2
View File
@@ -122,7 +122,11 @@ static void make_super_block(reiserfs_filsys_t fs)
reiserfs_warning(stderr, reiserfs_warning(stderr,
"\nSpecified LABEL is longer then 16 " "\nSpecified LABEL is longer then 16 "
"characters, will be truncated\n\n"); "characters, will be truncated\n\n");
strncpy(fs->fs_ondisk_sb->s_label, LABEL, 16); /* on-disk label is a fixed 16-byte field; keep it
NUL-terminated for the userspace readers below */
snprintf(fs->fs_ondisk_sb->s_label,
sizeof(fs->fs_ondisk_sb->s_label),
"%s", LABEL);
} }
set_sb_v2_flag(fs->fs_ondisk_sb, reiserfs_attrs_cleared); set_sb_v2_flag(fs->fs_ondisk_sb, reiserfs_attrs_cleared);
} }
@@ -643,7 +647,7 @@ int main(int argc, char **argv)
break; break;
case 'B': /* --badblock-list */ case 'B': /* --badblock-list */
asprintf(&badblocks_file, "%s", optarg); xasprintf(&badblocks_file, "%s", optarg);
break; break;
case 'h': /* --hash */ case 'h': /* --hash */
+1 -1
View File
@@ -1538,7 +1538,7 @@ void do_balance(struct tree_balance *tb, /* tree_balance structure
insert_ptr[0] = (struct buffer_head *)body; insert_ptr[0] = (struct buffer_head *)body;
/* we must prepare insert_key */ /* we must prepare insert_key */
if (PATH_H_B_ITEM_ORDER(tb->tb_path, 0) /*LAST_POSITION (tb->tb_path) */ if ((int)PATH_H_B_ITEM_ORDER(tb->tb_path, 0) /*LAST_POSITION (tb->tb_path) */
/*item_pos */ == -1) { /*item_pos */ == -1) {
/* get delimiting key from buffer in tree */ /* get delimiting key from buffer in tree */
copy_key(&insert_key[0].ih_key, copy_key(&insert_key[0].ih_key,
+1 -27
View File
@@ -22,7 +22,7 @@
// r5 // r5
// //
#include <asm/types.h> #include <linux/types.h>
#define DELTA 0x9E3779B9 #define DELTA 0x9E3779B9
#define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */ #define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */
@@ -190,29 +190,3 @@ u32 r5_hash(const signed char *msg, int len)
} }
return a; return a;
} }
#if 0
#include <stdio.h>
int main(void)
{
char *name = 0;
size_t n = 0;
while (1) {
getline(&name, &n, stdin);
if (!strcmp(name, "\n"))
break;
name[strlen(name) - 1] = 0;
printf("tea %lu\n, r5 %lu\nyura %lu\n",
keyed_hash(name, strlen(name)) & 0x7fffff80,
r5_hash(name, strlen(name)) & 0x7fffff80,
yura_hash(name, strlen(name)) & 0x7fffff80);
free(name);
name = 0;
n = 0;
}
}
#endif
+1 -3
View File
@@ -15,8 +15,6 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <asm/types.h> #include <linux/types.h>
#include <fcntl.h> #include <fcntl.h>
#include <malloc.h>
#include <sys/vfs.h>
#include <time.h> #include <time.h>
+2 -2
View File
@@ -506,7 +506,7 @@ int reiserfs_open_journal(reiserfs_filsys_t fs, const char *j_filename,
if (fs->fs_journal_dev == -1) if (fs->fs_journal_dev == -1)
return -1; return -1;
asprintf(&fs->fs_j_file_name, "%s", j_filename); xasprintf(&fs->fs_j_file_name, "%s", j_filename);
if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) { if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) {
reiserfs_warning(stderr, "Journal of (%lu) block size found on " reiserfs_warning(stderr, "Journal of (%lu) block size found on "
@@ -694,7 +694,7 @@ int reiserfs_create_journal(reiserfs_filsys_t fs, const char *j_device, /* journ
return 0; return 0;
} }
asprintf(&fs->fs_j_file_name, "%s", j_device); xasprintf(&fs->fs_j_file_name, "%s", j_device);
if (len < JOURNAL_MIN_SIZE + 1) { if (len < JOURNAL_MIN_SIZE + 1) {
reiserfs_warning(stderr, reiserfs_warning(stderr,
+5 -5
View File
@@ -610,7 +610,7 @@ int find_hash_in_use(const char *name, int namelen, __u32 offset,
char *code2name(unsigned int code) char *code2name(unsigned int code)
{ {
if (code >= HASH_AMOUNT || code < 0) if (code >= HASH_AMOUNT)
return NULL; return NULL;
return hashes[code].name; return hashes[code].name;
} }
@@ -1031,22 +1031,22 @@ int name_length(const char *name, int key_format)
/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/ /* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
__u16 get_ih_key_format(const struct item_head * ih) __u16 get_ih_key_format(const struct item_head * ih)
{ {
get_bit_field_XX(16, &ih->ih_format, 0, 12); get_bit_field_XX(16, ih_format_ptr(ih), 0, 12);
} }
__u16 get_ih_flags(const struct item_head *ih) __u16 get_ih_flags(const struct item_head *ih)
{ {
get_bit_field_XX(16, &ih->ih_format, 12, 4); get_bit_field_XX(16, ih_format_ptr(ih), 12, 4);
} }
void set_ih_key_format(struct item_head *ih, __u16 val) void set_ih_key_format(struct item_head *ih, __u16 val)
{ {
set_bit_field_XX(16, &ih->ih_format, val, 0, 12); set_bit_field_XX(16, ih_format_ptr(ih), val, 0, 12);
} }
void set_ih_flags(struct item_head *ih, __u16 val) void set_ih_flags(struct item_head *ih, __u16 val)
{ {
set_bit_field_XX(16, &ih->ih_format, val, 12, 4); set_bit_field_XX(16, ih_format_ptr(ih), val, 12, 4);
} }
/* access to fields of stat data (both v1 and v2) */ /* access to fields of stat data (both v1 and v2) */
+6 -6
View File
@@ -82,7 +82,7 @@ reiserfs_filsys_t reiserfs_open(const char *filename, int flags,
fs = getmem(sizeof(*fs)); fs = getmem(sizeof(*fs));
fs->fs_dev = fd; fs->fs_dev = fd;
fs->fs_vp = vp; fs->fs_vp = vp;
asprintf(&fs->fs_file_name, "%s", filename); xasprintf(&fs->fs_file_name, "%s", filename);
/* reiserfs super block is either in 16-th or in 2-nd 4k block of the /* reiserfs super block is either in 16-th or in 2-nd 4k block of the
device */ device */
@@ -215,7 +215,7 @@ reiserfs_filsys_t reiserfs_create(const char *filename,
} }
fs->fs_blocksize = block_size; fs->fs_blocksize = block_size;
asprintf(&fs->fs_file_name, "%s", filename); xasprintf(&fs->fs_file_name, "%s", filename);
fs->fs_format = version; fs->fs_format = version;
if (new_format) if (new_format)
@@ -664,7 +664,7 @@ struct reiserfs_key *uget_rkey(const struct reiserfs_path *path)
struct reiserfs_key *reiserfs_next_key(const struct reiserfs_path *path) struct reiserfs_key *reiserfs_next_key(const struct reiserfs_path *path)
{ {
if (get_item_pos(path) < B_NR_ITEMS(get_bh(path)) - 1) if (get_item_pos(path) + 1 < B_NR_ITEMS(get_bh(path)))
return leaf_key(get_bh(path), get_item_pos(path) + 1); return leaf_key(get_bh(path), get_item_pos(path) + 1);
return uget_rkey(path); return uget_rkey(path);
@@ -1054,7 +1054,7 @@ int reiserfs_add_entry(reiserfs_filsys_t fs, const struct reiserfs_key *dir,
const char *name, int name_len, const char *name, int name_len,
const struct reiserfs_key *key, __u16 fsck_need) const struct reiserfs_key *key, __u16 fsck_need)
{ {
struct item_head entry_ih = { {0,}, }; struct item_head entry_ih = { 0 };
char *entry; char *entry;
int retval; int retval;
INITIALIZE_REISERFS_PATH(path); INITIALIZE_REISERFS_PATH(path);
@@ -1458,7 +1458,7 @@ void add_badblock_list(reiserfs_filsys_t fs, int replace)
} }
int reiserfs_iterate_file_data(reiserfs_filsys_t fs, int reiserfs_iterate_file_data(reiserfs_filsys_t fs,
const struct reiserfs_key const *short_key, const struct reiserfs_key *short_key,
reiserfs_file_iterate_indirect_fn indirect_fn, reiserfs_file_iterate_indirect_fn indirect_fn,
reiserfs_file_iterate_direct_fn direct_fn, reiserfs_file_iterate_direct_fn direct_fn,
void *data) void *data)
@@ -1555,7 +1555,7 @@ fail:
} }
int reiserfs_iterate_dir(reiserfs_filsys_t fs, int reiserfs_iterate_dir(reiserfs_filsys_t fs,
const struct reiserfs_key const *dir_short_key, const struct reiserfs_key *dir_short_key,
const reiserfs_iterate_dir_fn callback, void *data) const reiserfs_iterate_dir_fn callback, void *data)
{ {
INITIALIZE_REISERFS_PATH(path); INITIALIZE_REISERFS_PATH(path);
+1 -1
View File
@@ -1,4 +1,4 @@
%define reiserfsprogsversion 3.6.23 %define reiserfsprogsversion 3.6.25
Vendor: Hans Reiser Vendor: Hans Reiser
Distribution: Hans Reiser Distribution: Hans Reiser
+5 -2
View File
@@ -48,9 +48,11 @@ static long long int calc_new_fs_size(unsigned long count,
case 'G': case 'G':
case 'g': case 'g':
bytes *= 1024; bytes *= 1024;
/* fall through */
case 'M': case 'M':
case 'm': case 'm':
bytes *= 1024; bytes *= 1024;
/* fall through */
case 'K': case 'K':
case 'k': case 'k':
bytes *= 1024; bytes *= 1024;
@@ -58,7 +60,7 @@ static long long int calc_new_fs_size(unsigned long count,
blocks = bytes / bs; blocks = bytes / bs;
return rel ? count + blocks : blocks; return rel ? (long long int)count + blocks : blocks;
} }
/* print some fs parameters */ /* print some fs parameters */
@@ -215,6 +217,7 @@ int main(int argc, char *argv[])
reiserfs_exit(1, reiserfs_exit(1,
"Missing argument to -j option"); "Missing argument to -j option");
jdevice_name = optarg; jdevice_name = optarg;
break;
case 'f': case 'f':
opt_force = 1; opt_force = 1;
break; break;
@@ -292,7 +295,7 @@ int main(int argc, char *argv[])
block_count_new = bytes_count_str ? block_count_new = bytes_count_str ?
calc_new_fs_size(get_sb_block_count(sb), calc_new_fs_size(get_sb_block_count(sb),
fs->fs_blocksize, bytes_count_str) : fs->fs_blocksize, bytes_count_str) :
count_blocks(devname, fs->fs_blocksize); (long long int)count_blocks(devname, fs->fs_blocksize);
if (resizer_check_fs_size(fs, block_count_new)) if (resizer_check_fs_size(fs, block_count_new))
return 1; return 1;
+8 -3
View File
@@ -6,6 +6,7 @@
#define _GNU_SOURCE #define _GNU_SOURCE
#include "tune.h" #include "tune.h"
#include "misc.h"
#include <getopt.h> #include <getopt.h>
#include <stdarg.h> #include <stdarg.h>
@@ -487,11 +488,11 @@ int main(int argc, char **argv)
Force++; Force++;
break; break;
case 'b': /* --add-badblocks */ case 'b': /* --add-badblocks */
asprintf(&badblocks_file, "%s", optarg); xasprintf(&badblocks_file, "%s", optarg);
Bads = 1; Bads = 1;
break; break;
case 'B': /* --badblocks */ case 'B': /* --badblocks */
asprintf(&badblocks_file, "%s", optarg); xasprintf(&badblocks_file, "%s", optarg);
Bads = 2; Bads = 2;
break; break;
case 'u': case 'u':
@@ -675,7 +676,11 @@ int main(int argc, char **argv)
if (strlen(LABEL) > 16) if (strlen(LABEL) > 16)
message message
("Specified LABEL is longer then 16 characters, will be truncated\n"); ("Specified LABEL is longer then 16 characters, will be truncated\n");
strncpy(fs->fs_ondisk_sb->s_label, LABEL, 16); /* on-disk label is a fixed 16-byte field; keep it
NUL-terminated for the userspace readers below */
snprintf(fs->fs_ondisk_sb->s_label,
sizeof(fs->fs_ondisk_sb->s_label),
"%s", LABEL);
need_dirty = 1; need_dirty = 1;
} }
if (Max_mnt_count && if (Max_mnt_count &&