btrfs-progs/common
Qu Wenruo d8f1bd519f btrfs-progs: mkfs: fix a stack over-flow when features string are too long
[BUG]
Even with chunk_objectid bug fixed, mkfs.btrfs can still caused stack
overflow when enabling extent-tree-v2 feature (need experimental
features enabled):

  # ./mkfs.btrfs  -f -O extent-tree-v2 ~/test.img
  btrfs-progs v5.19.1
  See http://btrfs.wiki.kernel.org for more information.

  ERROR: superblock magic doesn't match
  NOTE: several default settings have changed in version 5.15, please make sure
        this does not affect your deployments:
        - DUP for metadata (-m dup)
        - enabled no-holes (-O no-holes)
        - enabled free-space-tree (-R free-space-tree)

  Label:              (null)
  UUID:               205c61e7-f58e-4e8f-9dc2-38724f5c554b
  Node size:          16384
  Sector size:        4096
  Filesystem size:    512.00MiB
  Block group profiles:
    Data:             single            8.00MiB
    Metadata:         DUP              32.00MiB
    System:           DUP               8.00MiB
  SSD detected:       no
  Zoned device:       no
  =================================================================
  [... Skip full ASAN output ...]
  ==65655==ABORTING

[CAUSE]
For experimental build, we have unified feature output, but the old
buffer size is only 64 bytes, which is too small to cover the new full
feature string:

  extref, skinny-metadata, no-holes, free-space-tree, block-group-tree, extent-tree-v2

Above feature string is already 84 bytes, over the 64 on-stack memory
size.

This can also be proved by the ASAN output:

  ==65655==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc4e03b1d0 at pc 0x7ff0fc05fafe bp 0x7ffc4e03ac60 sp 0x7ffc4e03a408
  WRITE of size 17 at 0x7ffc4e03b1d0 thread T0
      #0 0x7ff0fc05fafd in __interceptor_strcat /usr/src/debug/gcc/libsanitizer/asan/asan_interceptors.cpp:377
      #1 0x55cdb7b06ca5 in parse_features_to_string common/fsfeatures.c:316
      #2 0x55cdb7b06ce1 in btrfs_parse_fs_features_to_string common/fsfeatures.c:324
      #3 0x55cdb7a37226 in main mkfs/main.c:1783
      #4 0x7ff0fbe3c28f  (/usr/lib/libc.so.6+0x2328f)
      #5 0x7ff0fbe3c349 in __libc_start_main (/usr/lib/libc.so.6+0x23349)
      #6 0x55cdb7a2cb34 in _start ../sysdeps/x86_64/start.S:115

[FIX]
Introduce a new macro, BTRFS_FEATURE_STRING_BUF_SIZE, along with a new
sanity check helper, btrfs_assert_feature_buf_size().

The problem is I can not find a build time method to verify
BTRFS_FEATURE_STRING_BUF_SIZE is large enough to contain all feature
names, thus have to go the runtime function to do the BUG_ON() to verify
the macro size.

Now the minimal buffer size for experimental build is 138 bytes, just
bump it to 160 for future expansion.

And if further features go beyond that number, mkfs.btrfs/btrfs-convert
will immediately crash at that BUG_ON(), so we can definitely detect it.

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Tested-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-10-11 09:08:12 +02:00
..
box.h btrfs-progs: build most common tools into one binary (busybox style) 2019-07-04 15:30:40 +02:00
defs.h btrfs-progs: move common-defs to common/ 2020-03-31 18:37:35 +02:00
device-scan.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
device-scan.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
device-utils.c btrfs-progs: device-utils: rename btrfs_device_size 2022-10-11 09:08:10 +02:00
device-utils.h btrfs-progs: device-utils: rename btrfs_device_size 2022-10-11 09:08:10 +02:00
extent-cache.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
extent-cache.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
filesystem-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
filesystem-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
format-output.c btrfs-progs: factor out common message helper for internal errors 2022-10-11 09:08:09 +02:00
format-output.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
fsfeatures.c btrfs-progs: mkfs: fix a stack over-flow when features string are too long 2022-10-11 09:08:12 +02:00
fsfeatures.h btrfs-progs: mkfs: fix a stack over-flow when features string are too long 2022-10-11 09:08:12 +02:00
help.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
help.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
internal.h btrfs-progs: move internal.h to common/ 2019-07-03 20:49:03 +02:00
messages.c btrfs-progs: add helper to print messages to stderr 2022-10-11 09:08:11 +02:00
messages.h btrfs-progs: add helper to print messages to stderr 2022-10-11 09:08:11 +02:00
open-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
open-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
parse-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
parse-utils.h btrfs-progs: move parse_qgroupid_or_path to parse-utils 2022-10-11 09:06:13 +02:00
path-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
path-utils.h btrfs-progs: remove unnecessary linux/*.h includes 2021-05-06 16:41:47 +02:00
rbtree-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
rbtree-utils.h btrfs-progs: remove c++ protection from internal headers 2021-10-08 20:47:04 +02:00
send-stream.c btrfs-progs: use template for out of memory error messages 2022-10-11 09:08:09 +02:00
send-stream.h btrfs-progs: receive: add support for fs-verity 2022-10-11 09:08:08 +02:00
send-utils.c btrfs-progs: use error helper for messages in non-kernel code 2022-10-11 09:08:07 +02:00
send-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
string-table.c btrfs-progs: common: reorder includes 2022-10-11 09:06:12 +02:00
string-table.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
string-utils.c btrfs-progs: use error helper for messages in non-kernel code 2022-10-11 09:08:07 +02:00
string-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
task-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
task-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
units.c btrfs-progs: use our ASSERT macro everywhere 2022-10-11 09:08:10 +02:00
units.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
utils.c btrfs-progs: use warning helper for multiple profile messages 2022-10-11 09:08:07 +02:00
utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00