Skip to content

segfault in btrfs repair #296

@ralisi

Description

@ralisi

Hello everyone,

I compiled the tag v5.7 for a static binary and ran btrfs in repair mode. The filesystem is working fine with older kernels but was converted from ext4 ages ago and has issues with newer kernels.

Anyways, I am getting a segmentation fault with the following backtrace:

Program received signal SIGSEGV, Segmentation fault.
balance_level (level=1, path=0x33c7e430, root=, trans=) at ctree.c:930
930 root_sub_used(root, right->len);
(gdb) bt
#0 balance_level (level=1, path=0x33c7e430, root=, trans=) at ctree.c:930
#1 btrfs_search_slot (trans=trans@entry=0x63c50e40, root=root@entry=0x82bca0, key=key@entry=0x7fffffffd7c0, p=p@entry=0x33c7e430,
ins_len=ins_len@entry=-1, cow=cow@entry=1) at ctree.c:1320
#2 0x000000000045cfa8 in lookup_inline_extent_backref (trans=trans@entry=0x63c50e40, root=root@entry=0x82bca0, path=path@entry=0x33c7e430,
ref_ret=ref_ret@entry=0x7fffffffd958, bytenr=bytenr@entry=55829827584, num_bytes=num_bytes@entry=4096, parent=0, root_objectid=2, owner=0,
offset=0, insert=0) at extent-tree.c:885
#3 0x000000000045e8f1 in lookup_extent_backref (offset=0, owner=0, root_objectid=2, parent=0, num_bytes=4096, bytenr=55829827584,
ref_ret=0x7fffffffd958, path=0x33c7e430, root=0x82bca0, trans=0x63c50e40) at extent-tree.c:1085
#4 __free_extent (trans=trans@entry=0x63c50e40, bytenr=55829827584, num_bytes=, parent=0, root_objectid=2, owner_objectid=0,
owner_offset=, refs_to_drop=) at extent-tree.c:1938
#5 0x0000000000461937 in run_delayed_tree_ref (insert_reserved=, extent_op=0x0, node=0x328387f0, fs_info=0x82b830, trans=0x63c50e40)
at extent-tree.c:3758
#6 run_one_delayed_ref (insert_reserved=, extent_op=0x0, node=0x328387f0, fs_info=0x82b830, trans=0x63c50e40) at extent-tree.c:3778
#7 btrfs_run_delayed_refs (trans=trans@entry=0x63c50e40, nr=nr@entry=18446744073709551615) at extent-tree.c:3862
#8 0x000000000046d8bf in btrfs_commit_transaction (trans=trans@entry=0x63c50e40, root=root@entry=0x82bca0) at transaction.c:209
#9 0x0000000000425c3a in check_extent_refs (root=0x82bca0, root@entry=0xcc0500, extent_cache=extent_cache@entry=0x7fffffffded0) at check/main.c:8115
#10 0x000000000042dcdd in check_chunks_and_extents (fs_info=0x82b830) at check/main.c:8804
#11 do_check_chunks_and_extents (fs_info=0x82b830) at check/main.c:8860
#12 cmd_check (cmd=, argc=, argv=) at check/main.c:10353
#13 0x0000000000401493 in cmd_execute (argv=0x7fffffffe3f0, argc=3, cmd=0x811980 <cmd_struct_check>) at cmds/commands.h:125
#14 main (argc=3, argv=0x7fffffffe3f0) at btrfs.c:402

Just looking at the offending location, ctree.c:930 is insightful. right is being dereferenced but is was assigned NULL just five lines earlier. My guess is that blocksize was meant here, which contains a copy of the last value before the deletion of right.

Best regards

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions