Skip to content
Snippets Groups Projects
Commit 1ea66f5b authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Don't store pointer to stack variable in sbbs_t::event_code

sbbs_t::gettimeleft() was storing a pointer to a stack (temporary/local)
variable containing a copy of the next exclusive event cfg (including its
internal code). This variable, including the internal code, is invalid when
it goes out of scope. This change makes the sbbs_t::event_code point to the
sbbs_t::cfg.event[]->code (on the heap) instead.

The only use of this event_code (outside of the event_thread), appears to be
in the JS bbs.event_code property string. So this fixes issue #705. No other
observed side effect from this bug.

Constified getnexteventtime() while here. No functional impact.
parent 1321d7f5
No related branches found
No related tags found
No related merge requests found
Pipeline #5421 passed
...@@ -100,7 +100,7 @@ uint sbbs_t::finduser(const char* name, bool silent_failure) ...@@ -100,7 +100,7 @@ uint sbbs_t::finduser(const char* name, bool silent_failure)
/****************************************************************************/ /****************************************************************************/
/* Return date/time that the specified event should run next */ /* Return date/time that the specified event should run next */
/****************************************************************************/ /****************************************************************************/
extern "C" time_t getnexteventtime(event_t* event) extern "C" time_t getnexteventtime(const event_t* event)
{ {
struct tm tm; struct tm tm;
time_t t = time(NULL); time_t t = time(NULL);
...@@ -143,7 +143,7 @@ extern "C" time_t getnexteventtime(event_t* event) ...@@ -143,7 +143,7 @@ extern "C" time_t getnexteventtime(event_t* event)
/* Return time of next forced timed event */ /* Return time of next forced timed event */
/* 'event' may be NULL */ /* 'event' may be NULL */
/****************************************************************************/ /****************************************************************************/
extern "C" time_t getnextevent(scfg_t* cfg, event_t* event) extern "C" time_t getnextevent(scfg_t* cfg, event_t** event)
{ {
int i; int i;
time_t event_time=0; time_t event_time=0;
...@@ -164,7 +164,7 @@ extern "C" time_t getnextevent(scfg_t* cfg, event_t* event) ...@@ -164,7 +164,7 @@ extern "C" time_t getnextevent(scfg_t* cfg, event_t* event)
if(!event_time || thisevent<event_time) { if(!event_time || thisevent<event_time) {
event_time=thisevent; event_time=thisevent;
if(event!=NULL) if(event!=NULL)
*event=*cfg->event[i]; *event = cfg->event[i];
} }
} }
...@@ -180,7 +180,7 @@ uint sbbs_t::gettimeleft(bool handle_out_of_time) ...@@ -180,7 +180,7 @@ uint sbbs_t::gettimeleft(bool handle_out_of_time)
{ {
char str[128]; char str[128];
char tmp[512]; char tmp[512];
event_t nextevent; event_t* nextevent{nullptr};
now=time(NULL); now=time(NULL);
...@@ -188,8 +188,8 @@ uint sbbs_t::gettimeleft(bool handle_out_of_time) ...@@ -188,8 +188,8 @@ uint sbbs_t::gettimeleft(bool handle_out_of_time)
/* Timed event time reduction handler */ /* Timed event time reduction handler */
event_time=getnextevent(&cfg, &nextevent); event_time=getnextevent(&cfg, &nextevent);
if(event_time) if(event_time && nextevent != nullptr)
event_code=nextevent.code; event_code=nextevent->code;
if(event_time && now+(time_t)timeleft>event_time) { /* less time, set flag */ if(event_time && now+(time_t)timeleft>event_time) { /* less time, set flag */
if(event_time<now) if(event_time<now)
......
...@@ -1319,8 +1319,8 @@ extern "C" { ...@@ -1319,8 +1319,8 @@ extern "C" {
DLLEXPORT void fcloselog(FILE*); DLLEXPORT void fcloselog(FILE*);
/* data.cpp */ /* data.cpp */
DLLEXPORT time_t getnextevent(scfg_t* cfg, event_t* event); DLLEXPORT time_t getnextevent(scfg_t* cfg, event_t**);
DLLEXPORT time_t getnexteventtime(event_t* event); DLLEXPORT time_t getnexteventtime(const event_t*);
/* sockopt.c */ /* sockopt.c */
DLLEXPORT int set_socket_options(scfg_t* cfg, SOCKET sock, const char* section DLLEXPORT int set_socket_options(scfg_t* cfg, SOCKET sock, const char* section
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment