btrfs-progs v3.14 mkfs.btrfs bug: --features long-option segfaults, -O short-option OK
Using btrfs-progs v3.14:
mkfs.btrfs ... --features ...
segfaults.
mkfs.btrfs ... -O ...
works fine.
* I used other long options, so it's not simply a problem parsing long options.
* I tried the long option with various features; none worked, including --features list-all with no other options. That too segfaulted, tho -O list-all worked.
Segfault line as logged:
mkfs.btrfs[5231]: segfault at 0 ip 00007fb531c7ab1a sp 00007fffaf1a7a78 error 4 in libc-2.19.so[7fb531bf8000+19a000]
btrfs-progs v3.14 from git on kernel v3.14 from git, gentoo/~amd64, built with gcc-4.8.2, using glibc-2.19.
Signature · 3 lines
Duncan - List replies preferred. No HTML msgs. "Every nonfree program has a lord, a master -- and if you use the program, he is your master." Richard Stallman
Quoted 5 lines · Duncan
Using btrfs-progs v3.14:
mkfs.btrfs ... --features ...
segfaults.
Can reproduce (also with glibc 2.19 on Gentoo ;-) and building with debug found:
(gdb) bt
#0 0x00007ffff6f3aaea in strlen () from /lib64/libc.so.6 #1 0x00007ffff6f3a82e in strdup () from /lib64/libc.so.6 #2 0x00000000004213e8 in main (ac=2, av=0x7fffffffe308) at mkfs.c:1312
Sure enough that line is handling 'O', where '--features' is supposed to be handled. No idea why -O works, but debugging shows that optarg is null at that point, so strdup goes poof.
-h
Quoted 11 lines · Holger Hoffstätte
Quoted 5 lines · Duncan
Using btrfs-progs v3.14:
mkfs.btrfs ... --features ...
segfaults.
Can reproduce (also with glibc 2.19 on Gentoo ;-) and building with debug found:
Quoted 8 lines
(gdb) bt
#0 0x00007ffff6f3aaea in strlen () from /lib64/libc.so.6 #1 0x00007ffff6f3a82e in strdup () from /lib64/libc.so.6 #2 0x00000000004213e8 in main (ac=2, av=0x7fffffffe308) at mkfs.c:1312Sure enough that line is handling 'O', where '--features' is supposed to be handled. No idea why -O works, but debugging shows that optarg is null at that point, so strdup goes poof.
Well, duh! The long_options array does not declare that --features wants an argument, so getopt does not create one.
holger>diff -u mkfs.c\~ mkfs.c
mkfs.c renamed from mkfs.c~ +1 -1
@@ -350,7 +350,7 @@ { "version", 0, NULL, 'V' }, { "rootdir", 1, NULL, 'r' }, { "nodiscard", 0, NULL, 'K' }, - { "features", 0, NULL, 'O' }, + { "features", 1, NULL, 'O' }, { NULL, 0, NULL, 0} };
This fixes it.
-h