Fix real bugs and clean up the build with -Wall -Wextra
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:
1 parent
41fb30313e
commit
293e6a7280
28 files changed
+258
-190
No files matched your search
+15
-9
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include "fsck.h"
|
||||
#include "misc.h"
|
||||
#include <getopt.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/mman.h>
|
||||
@@ -198,7 +199,7 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
|
||||
break;
|
||||
#endif
|
||||
case 'd': /* --create-passes-dump */
|
||||
asprintf(&data->rebuild.passes_dump_file_name, "%s",
|
||||
xasprintf(&data->rebuild.passes_dump_file_name, "%s",
|
||||
optarg);
|
||||
data->options |= OPT_SAVE_PASSES_DUMP;
|
||||
break;
|
||||
@@ -208,7 +209,7 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
|
||||
break;
|
||||
|
||||
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)
|
||||
reiserfs_panic
|
||||
("reiserfsck: Unknown hash is specified: %s",
|
||||
@@ -221,12 +222,12 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
|
||||
break;
|
||||
|
||||
case 'R': /* preparing rollback data */
|
||||
asprintf(&data->rebuild.rollback_file, "%s", optarg);
|
||||
xasprintf(&data->rebuild.rollback_file, "%s", optarg);
|
||||
data->options |= OPT_SAVE_ROLLBACK;
|
||||
break;
|
||||
|
||||
case 'B': /* list of phisically corrupted blocks */
|
||||
asprintf(&badblocks_file, "%s", optarg);
|
||||
xasprintf(&badblocks_file, "%s", optarg);
|
||||
data->options |= BADBLOCKS_FILE;
|
||||
break;
|
||||
|
||||
@@ -916,25 +917,29 @@ static void rebuild_tree(reiserfs_filsys_t fs)
|
||||
"reiserfsck --rebuild-tree started at %s"
|
||||
"###########\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)) {
|
||||
case START_FROM_THE_BEGINNING:
|
||||
reset_super_block(fs);
|
||||
pass_0(fs);
|
||||
|
||||
/* fall through */
|
||||
case START_FROM_PASS_1:
|
||||
reset_super_block(fs);
|
||||
pass_1(fs);
|
||||
|
||||
/* fall through */
|
||||
case START_FROM_PASS_2:
|
||||
pass_2(fs);
|
||||
|
||||
/* fall through */
|
||||
case START_FROM_SEMANTIC:
|
||||
pass_3_semantic(fs);
|
||||
/* fall through */
|
||||
|
||||
/* if --lost+found is set - link unaccessed directories to lost+found
|
||||
directory */
|
||||
case START_FROM_LOST_FOUND:
|
||||
pass_3a_look_for_lost(fs);
|
||||
/* fall through */
|
||||
|
||||
case START_FROM_PASS_4:
|
||||
/* 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->fs_dev = fd;
|
||||
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)) {
|
||||
fs->fs_journal_dev = open(data->journal_dev_name,
|
||||
@@ -1454,7 +1459,8 @@ int main(int argc, char *argv[])
|
||||
if (auto_check(fs))
|
||||
break;
|
||||
data->mode = FSCK_FIX_FIXABLE;
|
||||
case FSCK_CHECK:
|
||||
/* fall through */
|
||||
case FSCK_CHECK: /* and FSCK_FIX_FIXABLE */
|
||||
case FSCK_FIX_FIXABLE:
|
||||
check_fs(fs);
|
||||
break;
|
||||
|
||||
Reference in new issue
Block a user