OK, I discovered the cause of the segfault in dvdbackup[1]. It's been strangely fun :)
The manifestation: Program received signal SIGSEGV, Segmentation fault. 0x10004cf8 in DVDGetFileSet (_dvd=0x1001cab8) at dvdbackup.c:1669 The cause: DVDFileStatVOBUDF() keeps track of the file sizes in the local variable "off_t parts_size[9]". It's part of libdvdread which is compiled so that off_t is 64-bits. On line 1050 of libdvdread's dvd_reader.c, these 64-bit parts_size values are copied one at a time to the dvd_stat_t (statbuf)'s "off_t parts_size[9]", which was allocated and passed in by dvdbackup. dvdbackup is compiled with a 32-bit off_t (the default), so this copying overflows and trashes the "int nr_parts" member of the dvd_stat_t struct. Later on the nr_parts value is used to control a for loop, but because it's been trashed and now contains a value greater than 9 (the size of the array being copied to), the loop overruns the array, trashing the stack then overrunning the memory space and causing a SIGSEGV. The solution: Compile dvdbackup with -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 A patch adding this to src/Makefile is attached. [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=366092
diff -ruN dvdbackup-0.1.1-orig/src/Makefile dvdbackup-0.1.1/src/Makefile --- dvdbackup-0.1.1-orig/src/Makefile 2006-05-13 14:32:21.000000000 +1000 +++ dvdbackup-0.1.1/src/Makefile 2006-05-13 14:38:23.000000000 +1000 @@ -1,6 +1,6 @@ #!/usr/bin/make -f -COPTS = -O2 -g +COPTS = -O2 -g -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 CFLAGS = -Wall $(COPTS)
signature.asc
Description: OpenPGP digital signature