Skip to contentSkip to conversation

btrfs-progs v3.14 mkfs.btrfs bug: --features long-option segfaults, -O short-option OK

DISCUSSION Duncan 2 participants 3 messages Apr 16, 2014 Btrfs file system

lore
Share & tools
lore

Duncan

author
#0 lore raw

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
#1 lore raw
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

#2 lore raw
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: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.

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