Replace localtime() with localtime_r()

Since the result of localtime() is stored in a statically allocated
structure, data was overwritten when a context switch occurred during
(or shortly after) the execution of localtime(), potentially resulting
in critical data corruption. BUG#7 and BUG#8 are likely related.

This patch converts all usages of localtime() with localtime_r(), which
is thread-safe.

Reported-by: Baptiste Jonglez <baptiste@jonglez.org>
Reported-by: Erik Saule <esaule@bmi.osu.edu>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer
2012-11-22 22:23:58 +01:00
parent 6b6067a53b
commit e269f09438
10 changed files with 133 additions and 126 deletions

View File

@@ -310,18 +310,18 @@ static void *notify_main_thread(void *arg)
const unsigned check_app = MININSEC;
int elapse = 0;
int got_app;
struct tm *ntime;
struct tm ntime;
time_t ntimer;
elapse = 0;
for (;;) {
ntimer = time(NULL);
ntime = localtime(&ntimer);
localtime_r(&ntimer, &ntime);
pthread_mutex_lock(&notify.mutex);
pthread_mutex_lock(&nbar.mutex);
strftime(notify.time, NOTIFY_FIELD_LENGTH, nbar.timefmt, ntime);
strftime(notify.date, NOTIFY_FIELD_LENGTH, nbar.datefmt, ntime);
strftime(notify.time, NOTIFY_FIELD_LENGTH, nbar.timefmt, &ntime);
strftime(notify.date, NOTIFY_FIELD_LENGTH, nbar.datefmt, &ntime);
pthread_mutex_unlock(&nbar.mutex);
pthread_mutex_unlock(&notify.mutex);
notify_update_bar();