fixed an issue caused by a volatile identifier passsed to openlog()

This commit is contained in:
hyung-hwan 2019-01-16 09:25:17 +00:00
parent 4d78cd0a65
commit 59686d87a8

View File

@ -57,6 +57,12 @@
#include <stdlib.h> /* getenv, system */
#include <time.h>
struct mod_ctx_t
{
char* log_ident;
};
typedef struct mod_ctx_t mod_ctx_t;
static int fnc_fork (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_awk_int_t pid;
@ -878,9 +884,9 @@ static int fnc_openlog (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
int rx = -1;
qse_awk_int_t opt, fac;
qse_awk_val_t* retv;
qse_char_t* ident;
qse_char_t* ident = QSE_NULL;
qse_size_t ident_len;
mod_ctx_t* mctx = fi->mod->ctx;
#if defined(ENABLE_SYSLOG)
ident = qse_awk_rtx_getvalstr(rtx, qse_awk_rtx_getarg(rtx, 0), &ident_len);
@ -897,11 +903,15 @@ static int fnc_openlog (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
openlog(ident, opt, fac);
#else
{
qse_mchar_t* mbs;
mbs = qse_wcstombsdup(ident, QSE_NULL, qse_awk_rtx_getmmgr(rtx));
if (mbs == QSE_NULL) goto done;
if (!mbs) goto done;
if (mctx->log_ident) qse_awk_rtx_freemem (rtx, mctx->log_ident);
mctx->log_ident = mbs;
openlog (mbs, opt, fac);
qse_awk_rtx_freemem (rtx, mbs);
}
#endif
@ -909,6 +919,8 @@ static int fnc_openlog (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
#endif
done:
if (ident) qse_awk_rtx_freevalstr(rtx, qse_awk_rtx_getarg(rtx, 0), ident);
retv = qse_awk_rtx_makeintval(rtx, rx);
if (retv == QSE_NULL) return -1;
@ -920,8 +932,14 @@ static int fnc_closelog (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
int rx = -1;
qse_awk_val_t* retv;
mod_ctx_t* mctx = fi->mod->ctx;
#if defined(ENABLE_SYSLOG)
if (mctx->log_ident)
{
qse_awk_rtx_freemem (rtx, mctx->log_ident);
mctx->log_ident = QSE_NULL;
}
closelog ();
rx = 0;
#endif
@ -938,7 +956,7 @@ static int fnc_writelog (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
int rx = -1;
qse_awk_val_t* retv;
qse_awk_int_t pri;
qse_char_t* msg;
qse_char_t* msg = QSE_NULL;
qse_size_t msglen;
#if defined(ENABLE_SYSLOG)
@ -963,6 +981,8 @@ static int fnc_writelog (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
#endif
done:
if (msg) qse_awk_rtx_freevalstr(rtx, qse_awk_rtx_getarg(rtx, 1), msg);
retv = qse_awk_rtx_makeintval(rtx, rx);
if (retv == QSE_NULL) return -1;
@ -1157,7 +1177,7 @@ static void fini (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx)
static void unload (qse_awk_mod_t* mod, qse_awk_t* awk)
{
/* TODO: anything */
qse_awk_freemem (awk, mod->ctx);
}
int qse_awk_mod_sys (qse_awk_mod_t* mod, qse_awk_t* awk)
@ -1167,9 +1187,9 @@ int qse_awk_mod_sys (qse_awk_mod_t* mod, qse_awk_t* awk)
mod->init = init;
mod->fini = fini;
/*
mod->ctx...
*/
mod->ctx = qse_awk_callocmem(awk, QSE_SIZEOF(mod_ctx_t));
if (!mod->ctx) return -1;
return 0;
}