From 3ede2a57df6a1c2324b4b611bd5f2fd5a3c6567e Mon Sep 17 00:00:00 2001 From: michael Date: Mon, 26 Mar 2012 04:39:46 +0000 Subject: handle failing realloc() correctly (thanks to Mattia) git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@1184 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- timer.c | 25 +++++++------------------ timer_group.c | 47 +++++++++++++---------------------------------- 2 files changed, 20 insertions(+), 52 deletions(-) diff --git a/timer.c b/timer.c index 52b5dac..9be12b8 100644 --- a/timer.c +++ b/timer.c @@ -126,11 +126,8 @@ static void timer_inc(const int timer, struct timeval *now) struct timeval diff; timersub(now, &Timers[timer].when, &diff); - /* convert this time difference to fractional seconds */ - float time_difference = diff.tv_sec + diff.tv_usec / 1000000.0f; - - /* convert time difference to fractional milliseconds */ - time_difference = time_difference * 1000.0f; + /* convert this time difference to fractional milliseconds */ + float time_difference = (diff.tv_sec * 1000.0f) + (diff.tv_usec / 1000.0f); /* calculate the number of timer intervals that have passed since the last timer the given timer has been processed -- value is @@ -241,23 +238,15 @@ int timer_add(void (*callback) (void *data), void *data, const int interval, con /* no inactive timers (or none at all) found, so we have to add a new timer slot */ - if (timer >= nTimers) { - /* increment number of timers and (re-)allocate memory used for - storing the timer slots */ - nTimers++; - Timers = realloc(Timers, nTimers * sizeof(*Timers)); - - /* make sure "timer" points to valid memory */ - timer = nTimers - 1; - - /* realloc() has failed */ - if (Timers == NULL) { - /* restore old number of timers */ - nTimers--; + if (timer == nTimers) { + TIMER *tmp; + if ((tmp = realloc(Timers, (nTimers + 1) * sizeof(*Timers))) == NULL) { /* signal unsuccessful timer creation */ return -1; } + Timers = tmp; + nTimers++; } /* get current time so the timer triggers immediately */ diff --git a/timer_group.c b/timer_group.c index 3e04e56..fb4066f 100644 --- a/timer_group.c +++ b/timer_group.c @@ -191,30 +191,17 @@ int timer_add_group(const int interval) /* no inactive timer groups (or none at all) found, so we have to add a new timer group slot */ - if (group >= nTimerGroups) { - /* increment number of timer groups and (re-)allocate memory used - for storing the timer group slots */ - nTimerGroups++; - TimerGroups = realloc(TimerGroups, nTimerGroups * sizeof(*TimerGroups)); - - /* make sure "group" points to valid memory */ - group = nTimerGroups - 1; - - /* realloc() has failed */ - if (TimerGroups == NULL) { - /* restore old number of timer groups */ - nTimerGroups--; - + if (group == nTimerGroups) { + TIMER_GROUP *tmp; + + if ((tmp = realloc(TimerGroups, (nTimerGroups + 1) * sizeof(*TimerGroups))) == NULL) { /* signal unsuccessful timer group creation */ return -1; } + TimerGroups = tmp; + nTimerGroups++; - /* allocate memory for the underlying generic timer's callback - data (i.e. the group's triggering interval in milliseconds) */ - TimerGroups[group].interval = malloc(sizeof(int)); - - /* malloc() has failed */ - if (TimerGroups[group].interval == NULL) { + if ((TimerGroups[group].interval = malloc(sizeof(int))) == NULL) { /* signal unsuccessful timer group creation */ return -1; } @@ -434,23 +421,15 @@ int timer_add_widget(void (*callback) (void *data), void *data, const int interv /* no inactive widget slots (or none at all) found, so we have to add a new widget slot */ - if (widget >= nTimerGroupWidgets) { - /* increment number of widget slots and (re-)allocate memory used - for storing the widget slots */ - nTimerGroupWidgets++; - TimerGroupWidgets = realloc(TimerGroupWidgets, nTimerGroupWidgets * sizeof(*TimerGroupWidgets)); - - /* make sure "widget" points to valid memory */ - widget = nTimerGroupWidgets - 1; - - /* realloc() has failed */ - if (TimerGroupWidgets == NULL) { - /* restore old number of widget slots */ - nTimerGroupWidgets--; - + if (widget == nTimerGroupWidgets) { + TIMER_GROUP_WIDGET *tmp; + + if ((tmp = realloc(TimerGroupWidgets, (nTimerGroupWidgets + 1) * sizeof(*TimerGroupWidgets))) == NULL) { /* signal unsuccessful creation of widget slot */ return -1; } + TimerGroupWidgets = tmp; + nTimerGroupWidgets++; } /* initialize widget slot */ -- cgit v1.2.3