Question

This is the code:

void i_log_ (int error, const char * file, int line, const char * fmt, ...)
{
     /* Get error description */
     char * str_err = get_str_error (errno);
     remove_trailing_newl (str_err);

     /* Format string and parameters */
     char message [1024];
     va_list ap;
     va_start (ap, fmt);
     vsprintf (message, fmt, ap);
     va_end (ap);

     /* Get time */
     time_t t = time (NULL);
     char stime [64];
     char * temp = ctime (&t);
     strncpy (stime, temp, sizeof stime - 1);
     remove_trailing_newl (stime);

     FILE * log;


#ifdef __WIN32__
#else
# ifdef P_LISTENER
     log = fopen (I_LOG_FILE, "a+b");
     flock (fileno (log), LOCK_EX);
# else /* shared file descriptor of log, lock before opening */
     pthread_mutex_lock (& mutex);
     log = fopen (I_LOG_FILE, "a+b");
# endif
#endif

     if (log) {
          if (error)
               fprintf (log, ERR_FORMAT, stime, file, line, str_err, message);
          else
               fprintf (log, ERR_FORMAT_NO_ERRNO, stime, file, line, message);
     }

#ifdef __WIN32__
     free (str_err);
#else
# ifdef P_LISTENER
     flock (fileno (log), LOCK_UN);
     fclose (log);
# else
     fclose (log);
     pthread_mutex_unlock (& mutex);
# endif
#endif
     return;
}

Although there is a lock mechanism, in this case the function is not called concurrently, so I think that's not the problem. However, the program receive a SIGABRT:

[...]
(gdb) c
Continuing.

Program received signal SIGHUP, Hangup. // It's OK, I sent this.
0x00dee416 in __kernel_vsyscall ()
(gdb) c
Continuing.

Program received signal SIGABRT, Aborted.
0x00dee416 in __kernel_vsyscall ()
(gdb) up
#1  0x0013ae71 in raise () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#2  0x0013e34e in abort () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#3  0x00171577 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#4  0x0017b961 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#5  0x0017d28b in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#6  0x0018041d in free () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#7  0x0019b0d2 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#8  0x0019b3c5 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#9  0x00199a9f in localtime () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#10 0x00199951 in ctime () from /lib/i386-linux-gnu/libc.so.6
(gdb) up
#11 0x08049634 in i_log_ (error=0, file=0x804b17d "src/group.c", line=53, fmt=0x804b128 "Setting up new configuration: listener type: %s, number: %d, http-log: %s, port: %d.") at src/error.c:42
42       char * temp = ctime (&t);
(gdb) print temp
$1 = 0x260000 ""
(gdb) print t
$2 = 1329935482
(gdb) print &t
$3 = (time_t *) 0xbff8a5b8
(gdb) 

I haven't a clue. ctime is returning an empty string, and the man page don't mention this case. And come to think of it, I don't understand why it would return an empty string, and what's wrong with that code.

Any help is appreciated.

Was it helpful?

Solution

ctime isn't returning an empty string. It hasn't returned at all yet, because it crashed while trying to do its thing.

The crash is inside free(), so you're probably corrupting memory at some point before you called ctime(). If you're running on a supported platform, try using a tool like Valgrind to check your memory accesses.

OTHER TIPS

Since the crash is happening down inside ctime() and the pointer you pass is valid, the problem is likely that you've already trampled out of bounds with memory (there's free() in the stack trace) somewhere else and the problem is only manifesting itself here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top