Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.
Hi,
while playing around with migration (and recovery) of metadata from v07 to v08
I encountered an SIGSEGV while restoring dumped meta data.
After a quick look at the source it looks like some bad generated parser-code.
My Setup:
I have an drbd (previous 0.7.23) running on-top of LVM (2.0.22), kernel 2.6.20;
(SLES9 based, flex 2.5.4, gcc 3.3.3).
I stopped drbd, upgraded to 8.0.1 and dumped meta data with:
### drbdmeta /dev/drbd0 v07 /dev/VG/LV1 internal dump-md > LV1-v07-meta
after trying to convert this to v08 I did
### drbdmeta /dev/drbd0 v07 /dev/VG/LV1 internal wipe-md
followed by:
### ./drbdmeta /dev/drbd0 v07 /dev/VG/LV1 internal restore-md /root/LV1-v07-meta
v07 Magic number not found
SIGSEGV!
This feels like a bug.
debug hint: last memset: md_disk_07_to_cpu:426: @0x50b048 104
Sorry.
### gdb ./drbdmeta
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".
(gdb) run /dev/drbd0 v07 /dev/VG/LV1 internal restore-md /root/LV1-v07-meta
Starting program: /usr/src/drbd-8.0.1/user/drbdmeta /dev/drbd0 v07 /dev/VG/LV1 internal restore-md /root/LV1-v07-meta
v07 Magic number not found
Program received signal SIGSEGV, Segmentation fault.
meta_restore_md (cfg=0x50b010, argv=<value optimized out>, argc=<value optimized out>) at drbdmeta.c:1819
1819 bm[i].le = cpu_to_le64(yylval.u64);
(gdb) print yylval.u64
There is no member named u64.
(gdb) print yylval
$1 = {txt = 0x0, uint64_t = 0}
(gdb) list
1814 bm = (le_u64 *)cfg->on_disk.bm;
1815 i = 0;
1816 while(1) {
1817 switch(yylex()) {
1818 case TK_U64:
1819 bm[i].le = cpu_to_le64(yylval.u64);
1820 i++;
1821 EXP(';');
1822 break;
1823 case TK_NUM:
(gdb) The program is running. Exit anyway? (y or n) y
Jens
PS: Thanks for this great product! :-)
--
Dr. Jens Beyer
IT-Systemarchitekt
1&1 Internet AG IT-Portal
Brauerstrasse 48 - D-76135 Karlsruhe
Tel. +49-721-91374-4245
jens.beyer at webde.de - http://web.de