[vdr] get a segmentation fault when starting vdr (backtrace included)

Dr. Werner Fink werner at suse.de
Fri Nov 30 12:51:35 CET 2012


On Fri, Nov 30, 2012 at 12:08:53PM +0100, Dieter Bloms wrote:
> Hi Werner,
> 
> --snip--
>   25 cString tComponent::ToString(void)
>   26 {
>   27   char buffer[256];
>   28   snprintf(buffer, sizeof(buffer), "%X %02X %s %s", stream, type, language, description ? description : "");
>   29   return buffer;
>   30 }
>   31 
>   32 bool tComponent::FromString(const char *s)
>   33 {
>   34   unsigned int Stream, Type;
>   35   description = NULL;
>   36   int n = sscanf(s, "%X %02X %7s %as[^\n]", &Stream, &Type, language, &description); // 7 = MAXLANGCODE2 - 1
>   37   esyslog("dbloms: \"%X\" \"%02X\" \"%7s\" \"%s\"", Stream, Type, language, description);
>   38 
>   39   if (n != 4 || isempty(description)) {
>   40      free(description);
>   41      description = NULL;
>   42      }
>   43   stream = Stream;
>   44   type = Type;
>   45   return n >= 3;
>   46 }
> --snip--
> 
> 
> and get a core dump with this:
> 
> --snip--
> vdrservernew:/tmp# gdb --core /tmp/core /usr/local/bin/vdr
> GNU gdb (GDB) 7.5
> Copyright (C) 2012 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-unknown-linux-gnu".
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>...
> Reading symbols from /usr/local/bin/vdr...done.
> [New LWP 8986]
> [New LWP 8985]
> [New LWP 8987]
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/libthread_db.so.1".
> Core was generated by `/usr/local/bin/vdr --config=/etc/vdr --epgfile=/tmp/epg.data --grab=/dev/shm --'.
> Program terminated with signal 11, Segmentation fault.
> #0  0x00006b2476b263b3 in strnlen () from /lib/libc.so.0.9.32
> (gdb) bt
> #0  0x00006b2476b263b3 in strnlen () from /lib/libc.so.0.9.32
> #1  0x00006b2476b1ff56 in ?? () from /lib/libc.so.0.9.32
> #2  0x00006b2476b1d5dc in vsnprintf () from /lib/libc.so.0.9.32
> #3  0x00006b2476b14c29 in vsyslog () from /lib/libc.so.0.9.32
> #4  0x000000000052e510 in syslog_with_tid (priority=3, format=0x551ab8 "dbloms: \"%X\" \"%02X\" \"%7s\" \"%s\"") at tools.c:40
> #5  0x00000000004a1e4e in FromString (s=<optimized out>, this=0x3dabc20) at epg.c:37
> #6  cComponents::SetComponent (this=<optimized out>, Index=<optimized out>, s=s at entry=0x3daaaa2 "1 01 deu 4:3") at epg.c:84
> #7  0x00000000004a4163 in cEvent::Parse (this=0x3d9f4d0, s=<optimized out>) at epg.c:498
> #8  0x00000000004e9f16 in cRecordingInfo::Read (this=0x3da8640, f=f at entry=0x3d9f840) at recording.c:468
> #9  0x00000000004eb553 in cRecording::cRecording (this=0x3da05c0, FileName=0x3d8aa7c "Sex_and_the_City_2/2012-11-19.20.10.27-0.rec") at recording.c:723
> #10 0x00000000004ecf21 in cRecordings::ScanVideoDir (this=0x7fe880 <Recordings>, DirName=0x3d9d4c0 "/remote/vdr/Sex_and_the_City_2", Foreground=false, LinkLevel=0) at recording.c:1165
> #11 0x00000000004ed39c in cRecordings::ScanVideoDir (this=0x7fe880 <Recordings>, DirName=0x3d83a20 "/remote/vdr", Foreground=false, LinkLevel=0) at recording.c:1180
> #12 0x00000000005269be in cThread::StartThread (Thread=0x7fe8a0 <Recordings+32>) at thread.c:262
> #13 0x00006b247844a406 in start_thread () from /lib/libpthread.so.0.9.32
> #14 0x00006b2478442885 in clone () from /lib/libpthread.so.0.9.32
> #15 0x0000000000000000 in ?? ()
> (gdb) 
> --snip--

Maybe some more checks are required as if n != 4 this could be that one of the
variables are not used and therefore not initialized.

Before sscanf() this could be a `memset(language, 0, sizeof(language));' or more
simple a `*language = 0;' depending on the type of language.  Also the code

   if (n != 4 || isempty(description)) {
      free(description);
      description = NULL;
   }

could become

   if (n != 4 || isempty(description)) {
      if (description)
         free(description);
      description = NULL;
   }

as well as the line

   esyslog("dbloms: \"%X\" \"%02X\" \"%7s\" \"%s\"", Stream, Type, language, description);   

may look like

   esyslog("dbloms: \"%X\" \"%02X\" \"%7s\" \"%s\"", Stream, Type, language, description ? description : "");


Werner

-- 
  "Having a smoking section in a restaurant is like having
          a peeing section in a swimming pool." -- Edward Burr



More information about the vdr mailing list