aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2018-10-04 10:39:50 -0400
committerTheodore Ts'o <tytso@mit.edu>2018-10-04 10:39:50 -0400
commit62dfbc0fb2be77c4e0861c03601fd61dbb01e438 (patch)
tree76b14d3a4ccefdf9d46596194d9ef4f367ca5bdc
parent76d5590a4fe7ef75c3319e77ee1317779e1c1707 (diff)
parentb0ec76d623f737a32abc5ab8bb7198bf1d9939a4 (diff)
downloadandroid_external_e2fsprogs-62dfbc0fb2be77c4e0861c03601fd61dbb01e438.tar.gz
android_external_e2fsprogs-62dfbc0fb2be77c4e0861c03601fd61dbb01e438.tar.bz2
android_external_e2fsprogs-62dfbc0fb2be77c4e0861c03601fd61dbb01e438.zip
Merge branch 'maint' into next
-rw-r--r--Makefile.in2
-rwxr-xr-xconfigure4
-rw-r--r--configure.ac3
-rw-r--r--lib/e2p/ljs.c4
-rw-r--r--lib/ext2fs/mkjournal.c2
-rw-r--r--misc/tune2fs.c11
-rw-r--r--tests/d_corrupt_journal_nr_users/expect99
-rw-r--r--tests/d_corrupt_journal_nr_users/image.gzbin0 -> 8788 bytes
-rw-r--r--tests/d_corrupt_journal_nr_users/name1
-rw-r--r--tests/d_corrupt_journal_nr_users/script25
-rw-r--r--tests/f_bad_local_jnl/imagebin0 -> 8388608 bytes
11 files changed, 148 insertions, 3 deletions
diff --git a/Makefile.in b/Makefile.in
index 534e905c..b951c017 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -67,7 +67,7 @@ distclean-doc:
install: subs all-libs-recursive install-progs-recursive \
install-shlibs-libs-recursive install-doc-libs
- if test ! -d e2fsck && test ! -d debugfs && test ! -d misc && test ! -d ext2ed ; then $(MAKE) install-libs ; fi
+@SUBSET_CMT@ $(MAKE) install-libs
install-strip: subs all-libs-recursive install-strip-progs-recursive \
install-shlibs-strip-libs-recursive install-doc-libs
diff --git a/configure b/configure
index ed203d82..af719199 100755
--- a/configure
+++ b/configure
@@ -766,6 +766,7 @@ DEFRAG_CMT
RESIZER_CMT
IMAGER_CMT
DEBUGFS_CMT
+SUBSET_CMT
ALL_CMT
BLKID_CMT
DEPPROFILED_LIBBLKID
@@ -5697,10 +5698,12 @@ fi
ALL_CMT=
+SUBSET_CMT=
# Check whether --enable-subset was given.
if test "${enable_subset+set}" = set; then :
enableval=$enable_subset; if test "$enableval" = "no"
then
+ SUBSET_CMT=#
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Disabling subset-only build" >&5
$as_echo "Disabling subset-only build" >&6; }
else
@@ -5713,6 +5716,7 @@ fi
+
# Check whether --enable-backtrace was given.
if test "${enable_backtrace+set}" = set; then :
enableval=$enable_backtrace; if test "$enableval" = "no"
diff --git a/configure.ac b/configure.ac
index 9028a2ff..c378b81e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -569,10 +569,12 @@ dnl
dnl handle --enable-subset
dnl
ALL_CMT=
+SUBSET_CMT=
AC_ARG_ENABLE([subset],
[ --enable-subset enable subset-only build],
if test "$enableval" = "no"
then
+ SUBSET_CMT=#
AC_MSG_RESULT([Disabling subset-only build])
else
ALL_CMT=#
@@ -580,6 +582,7 @@ else
fi
,)
AC_SUBST(ALL_CMT)
+AC_SUBST(SUBSET_CMT)
dnl
dnl handle --disable-backtrace
dnl
diff --git a/lib/e2p/ljs.c b/lib/e2p/ljs.c
index 0b1beadb..c99126b6 100644
--- a/lib/e2p/ljs.c
+++ b/lib/e2p/ljs.c
@@ -101,10 +101,10 @@ void e2p_list_journal_super(FILE *f, char *journal_sb_buf,
e2p_be32(jsb->s_checksum));
if ((nr_users > 1) ||
!e2p_is_null_uuid(&jsb->s_users[0])) {
- for (i=0; i < nr_users; i++) {
+ for (i=0; i < nr_users && i < JFS_USERS_MAX; i++) {
printf(i ? " %s\n"
: "Journal users: %s\n",
- e2p_uuid2str(&jsb->s_users[i*16]));
+ e2p_uuid2str(&jsb->s_users[i * UUID_SIZE]));
}
}
if (jsb->s_errno != 0)
diff --git a/lib/ext2fs/mkjournal.c b/lib/ext2fs/mkjournal.c
index 7f78291d..a90e80e0 100644
--- a/lib/ext2fs/mkjournal.c
+++ b/lib/ext2fs/mkjournal.c
@@ -401,6 +401,8 @@ errcode_t ext2fs_add_journal_device(ext2_filsys fs, ext2_filsys journal_dev)
/* Check and see if this filesystem has already been added */
nr_users = ntohl(jsb->s_nr_users);
+ if (nr_users > JFS_USERS_MAX)
+ return EXT2_ET_CORRUPT_JOURNAL_SB;
for (i=0; i < nr_users; i++) {
if (memcmp(fs->super->s_uuid,
&jsb->s_users[i*16], 16) == 0)
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index 3fe1c288..a680b461 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -292,6 +292,12 @@ static int remove_journal_device(ext2_filsys fs)
jsb = (journal_superblock_t *) buf;
/* Find the filesystem UUID */
nr_users = ntohl(jsb->s_nr_users);
+ if (nr_users > JFS_USERS_MAX) {
+ fprintf(stderr, _("Journal superblock is corrupted, nr_users\n"
+ "is too high (%d).\n"), nr_users);
+ commit_remove_journal = 1;
+ goto no_valid_journal;
+ }
if (!journal_user(fs->super->s_uuid, jsb->s_users, nr_users)) {
fputs(_("Filesystem's UUID not found on journal device.\n"),
@@ -2855,6 +2861,11 @@ fs_update_journal_user(struct ext2_super_block *sb, __u8 old_uuid[UUID_SIZE])
jsb = (journal_superblock_t *) buf;
/* Find the filesystem UUID */
nr_users = ntohl(jsb->s_nr_users);
+ if (nr_users > JFS_USERS_MAX) {
+ fprintf(stderr, _("Journal superblock is corrupted, nr_users\n"
+ "is too high (%d).\n"), nr_users);
+ return EXT2_ET_CORRUPT_JOURNAL_SB;
+ }
j_uuid = journal_user(old_uuid, jsb->s_users, nr_users);
if (j_uuid == NULL) {
diff --git a/tests/d_corrupt_journal_nr_users/expect b/tests/d_corrupt_journal_nr_users/expect
new file mode 100644
index 00000000..cdfb49a0
--- /dev/null
+++ b/tests/d_corrupt_journal_nr_users/expect
@@ -0,0 +1,99 @@
+Filesystem volume name: <none>
+Last mounted on: <not available>
+Filesystem magic number: 0xEF53
+Filesystem revision #: 1 (dynamic)
+Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
+Default mount options: user_xattr acl
+Filesystem state: clean
+Errors behavior: Continue
+Filesystem OS type: Linux
+Inode count: 512
+Block count: 2048
+Reserved block count: 102
+Free blocks: 982
+Free inodes: 501
+First block: 0
+Block size: 4096
+Fragment size: 4096
+Group descriptor size: 64
+Blocks per group: 32768
+Fragments per group: 32768
+Inodes per group: 512
+Inode blocks per group: 32
+Flex block group size: 16
+Mount count: 0
+Check interval: 0 (<none>)
+Reserved blocks uid: 0
+Reserved blocks gid: 0
+First inode: 11
+Inode size: 256
+Required extra isize: 32
+Desired extra isize: 32
+Journal inode: 8
+Default directory hash: half_md4
+Journal backup: inode blocks
+Checksum type: crc32c
+Journal features: (none)
+Journal size: 4096k
+Journal length: 1024
+Journal sequence: 0x00000001
+Journal start: 0
+Journal number of users: 9999
+Journal users: <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+ <none>
+
+
+Group 0: (Blocks 0-2047)
+ Primary superblock at 0, Group descriptors at 1-1
+ Block bitmap at 2 (+2)
+ Inode bitmap at 18 (+18)
+ Inode table at 34-65 (+34)
+ 982 free blocks, 501 free inodes, 2 directories, 501 unused inodes
+ Free blocks: 1066-2047
+ Free inodes: 12-512
diff --git a/tests/d_corrupt_journal_nr_users/image.gz b/tests/d_corrupt_journal_nr_users/image.gz
new file mode 100644
index 00000000..1fc32edd
--- /dev/null
+++ b/tests/d_corrupt_journal_nr_users/image.gz
Binary files differ
diff --git a/tests/d_corrupt_journal_nr_users/name b/tests/d_corrupt_journal_nr_users/name
new file mode 100644
index 00000000..8b33a273
--- /dev/null
+++ b/tests/d_corrupt_journal_nr_users/name
@@ -0,0 +1 @@
+Journal superblock corrupted, nr_users too high
diff --git a/tests/d_corrupt_journal_nr_users/script b/tests/d_corrupt_journal_nr_users/script
new file mode 100644
index 00000000..683cd487
--- /dev/null
+++ b/tests/d_corrupt_journal_nr_users/script
@@ -0,0 +1,25 @@
+if ! test -x $DEBUGFS_EXE; then
+ echo "$test_name: $test_description: skipped (no debugfs)"
+ return 0
+fi
+
+IMAGE=$test_dir/image.gz
+EXP=$test_dir/expect
+OUT=$test_name.log
+gunzip < $IMAGE > $TMPFILE
+
+$DUMPE2FS $TMPFILE >> $OUT.new 2>&1
+sed -f $cmd_dir/filter.sed $OUT.new > $OUT
+rm -f $TMPFILE $OUT.new
+
+cmp -s $OUT $EXP
+status=$?
+
+if [ "$status" = 0 ] ; then
+ echo "$test_name: $test_description: ok"
+ touch $test_name.ok
+else
+ echo "$test_name: $test_description: failed"
+ diff $DIFF_OPTS $EXP $OUT > $test_name.failed
+ rm -f $test_name.tmp
+fi
diff --git a/tests/f_bad_local_jnl/image b/tests/f_bad_local_jnl/image
new file mode 100644
index 00000000..6f2b550a
--- /dev/null
+++ b/tests/f_bad_local_jnl/image
Binary files differ