[vdr] vdr 1.3.25 thread problems

Rainer Zocholl UseNet-Posting-Nospam-74308- at zocki.toppoint.de
Wed Jun 1 22:56:00 CEST 2005


linux at youmustbejoking.demon.co.uk(Darren Salt)  01.06.05 20:28


>I demand that Rainer Zocholl may or may not have written...

>> Again:
>> The most beloved problem: Reentrancy...

>> This C-Function in tools.c looks suspicious:

>> cString TimeToString(time_t t)
>> {
>>   char buffer[32];
>>   if (ctime_r(&t, buffer)) {
>>      buffer[strlen(buffer) - 1] = 0; // strip trailing newline
>>      return buffer;
>>      }
>>   return "???";
>> }

>That's harmless.

On the first view it does not look so ;-)

>Those return statements are effectively 'return cString (<string>,
>false)', and the cString constructor will call strdup() if its second
>parameter is false (and note that that parameter is declared as having
>a default value).

Ah, ok, 
but's not vey effective to copy reach string serveral times IMHO.


Pardon my stupid question:
And who is freeing that malloced memory later?
for example:

cTDT::cTDT(const u_char *Data)
:SI::TDT(Data, false)
{
  CheckParse();

  time_t sattim = getTime();
  time_t loctim = time(NULL);

  if (abs(sattim - loctim) > 2) {
     mutex.Lock();
     isyslog("System Time = %s (%ld)\n", *TimeToString(loctim),loctim);
     isyslog("Local Time  = %s (%ld)\n", *TimeToString(sattim),sattim);
     if (stime(&sattim) < 0)
        esyslog("ERROR while setting system time: %m");
     mutex.Unlock();
     }
}

The pointer is not stored anywhere.
(At least not obviously)





cString strescape(const char *s, const char *chars)
{
  char *buffer;
  const char *p = s;
  char *t = NULL;
  while (*p) {
        if (strchr(chars, *p)) {
           if (!t) {
              buffer = MALLOC(char, 2 * strlen(s) + 1);
              t = buffer + (p - s);
              s = strcpy(buffer, s);
              }
           *t++ = '\\';
           }
        if (t)
           *t++ = *p;
        p++;
        }
  if (t)
     *t = 0;
  return cString(s, t != NULL);
}



What happens if the malloc fails?
VDR will coredump because of the "*t++" by intention?

Pardon again the stupid question: where/how is that memory freed?
recording.c:     

void cRecordingUserCommand::InvokeCommand(const char *State, const char *RecordingFileName)
{
  if (command) {
     char *cmd;
     asprintf(&cmd, "%s %s \"%s\"", command, State, *strescape(RecordingFileName, "\"$"));
     isyslog("executing '%s'", cmd);
     SystemExec(cmd);
     free(cmd);
     }
}

Does asprintf know it can release the memory?
How?


Rainer




More information about the vdr mailing list