VDR-1.3.46 Segmentation fault

Message ID 4E152609ED%linux@youmustbejoking.demon.co.uk
State New
Headers

Commit Message

Darren Salt April 10, 2006, 1:50 a.m. UTC
  I demand that I definitely did write...

> I demand that Thomas Günther may or may not have written...
>> If I try to set the time transponder the vdr crashes. :-(
>> Program received signal SIGSEGV, Segmentation fault.

>> (gdb) bt
>> #0  0x401f4cff in strlen () from /lib/libc.so.6
>> #1  0x401f4a55 in strdup () from /lib/libc.so.6
>> #2  0x080e0b2f in cMenuEditItem::SetValue (this=0xa268768, Value=0x0) at menuitems.c:39

> I suggest replacing that line with
>   value = Value ? strdup(Value) : NULL;
[snip]

Full patch attached. On enabling the "set time from broadcast" function,
default to the first available channel.
  

Comments

Dr. Werner Fink April 10, 2006, 9:19 a.m. UTC | #1
On Mon, Apr 10, 2006 at 02:50:35AM +0100, Darren Salt wrote:
> I demand that I definitely did write...
> 
> > I demand that Thomas Günther may or may not have written...
> >> If I try to set the time transponder the vdr crashes. :-(
> >> Program received signal SIGSEGV, Segmentation fault.
> 
> >> (gdb) bt
> >> #0  0x401f4cff in strlen () from /lib/libc.so.6
> >> #1  0x401f4a55 in strdup () from /lib/libc.so.6
> >> #2  0x080e0b2f in cMenuEditItem::SetValue (this=0xa268768, Value=0x0) at menuitems.c:39
> 
> > I suggest replacing that line with
> >   value = Value ? strdup(Value) : NULL;
> [snip]
> 
> Full patch attached. On enabling the "set time from broadcast" function,
> default to the first available channel.

Hmmm ... strdup() can return NULL if the system is
low at or out of memory.


> -  value = strdup(Value);
> +  value = Value ? strdup(Value) : NULL;


        Werner
  
Darren Salt April 10, 2006, 5:56 p.m. UTC | #2
I demand that Dr. Werner Fink may or may not have written...

> On Mon, Apr 10, 2006 at 02:50:35AM +0100, Darren Salt wrote:
>> I demand that I definitely did write...

>>> I demand that Thomas Günther may or may not have written...
>>>> If I try to set the time transponder the vdr crashes. :-( Program
>>>> received signal SIGSEGV, Segmentation fault.

>>>> (gdb) bt
>>>> #0  0x401f4cff in strlen () from /lib/libc.so.6
>>>> #1  0x401f4a55 in strdup () from /lib/libc.so.6
>>>> #2  0x080e0b2f in cMenuEditItem::SetValue (this=0xa268768, Value=0x0) at menuitems.c:39

>>> I suggest replacing that line with
>>>   value = Value ? strdup(Value) : NULL;
>> [snip]
>> Full patch attached. On enabling the "set time from broadcast" function,
>> default to the first available channel.

> Hmmm... strdup() can return NULL if the system is low at or out of memory.

True, but that probably doesn't matter here: something's going to fail anyway
if that happens. Perhaps a wrapper is needed?
  

Patch

--- vdr-1.3.46~/menuitems.c
+++ vdr-1.3.46/menuitems.c
@@ -36,7 +36,7 @@ 
 void cMenuEditItem::SetValue(const char *Value)
 {
   free(value);
-  value = strdup(Value);
+  value = Value ? strdup(Value) : NULL;
   char *buffer = NULL;
   asprintf(&buffer, "%s:\t%s", name, value);
   SetText(buffer, false);
@@ -615,61 +615,18 @@ 
            }
         channel = (cChannel *)channel->Next();
         }
+  if (!number) {
+     // couldn't find the selected channel, or one hasn't yet been chosen;
+     // default to the first available channel
+     channel = Channels.First();
+     while (channel) {
+           if (!channel->GroupSep()) {
+              number = channel->Number();
+              break;
+              }
+           channel = (cChannel *)channel->Next();
+           }
+     }
   Set();
 }