Skip to content

Commit

Permalink
log: handle LOG_*() before calling to log_init()
Browse files Browse the repository at this point in the history
There are cases where LOG_*() functions are called before the logs
are initialized with log_init().
E.g. in transport_register() that is executed in gcc constructors,
thus called even before main().
With debug_level set to LOG_LVL_USER=-1 all the LOG_ERROR() get
dropped.
Properly initializing debug_level cause segmentation fault due to
log_output still not initialized.

Initialize debug_level to LOG_LVL_INFO so errors get printed.
Handle separately the case of log_output still NULL, meaning that
log_init() is not called yet.

Change-Id: I2ea32c87a4955fb44e79b38131c456e25dfbc327
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5602
Tested-by: jenkins
  • Loading branch information
borneoa committed Aug 16, 2020
1 parent 4010861 commit d88765a
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/helper/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
#endif
#endif

int debug_level = -1;
int debug_level = LOG_LVL_INFO;

static FILE *log_output;
static struct log_callback *log_callbacks;
Expand Down Expand Up @@ -91,6 +91,14 @@ static void log_puts(enum log_levels level,
const char *string)
{
char *f;

if (!log_output) {
/* log_init() not called yet; print on stderr */
fputs(string, stderr);
fflush(stderr);
return;
}

if (level == LOG_LVL_OUTPUT) {
/* do not prepend any headers, just print out what we were given and return */
fputs(string, log_output);
Expand Down Expand Up @@ -277,9 +285,6 @@ void log_init(void)
{
/* set defaults for daemon configuration,
* if not set by cmdline or cfgfile */
if (debug_level == -1)
debug_level = LOG_LVL_INFO;

char *debug_env = getenv("OPENOCD_DEBUG_LEVEL");
if (NULL != debug_env) {
int value;
Expand Down

0 comments on commit d88765a

Please sign in to comment.