sch_ident may be copied to a different location by GC,

and openlog doesn't copy the input string, at least not
on every system.  That's just great.

So copy the ident to a local static string before calling openlog.
This commit is contained in:
sperber 2001-07-10 12:56:25 +00:00
parent a7227450ca
commit 0a1e5ab9bb
1 changed files with 20 additions and 1 deletions

View File

@ -272,16 +272,35 @@ s48_extract_syslog_mask(s48_value sch_syslog_mask)
* ### Must still prevent cores. * ### Must still prevent cores.
*/ */
#define MAX_SYSLOG_IDENT 256 /* should be ample */
static int syslog_open = 0; static int syslog_open = 0;
static char syslog_ident[MAX_SYSLOG_IDENT];
static s48_value static s48_value
sch_openlog(s48_value sch_ident, sch_openlog(s48_value sch_ident,
s48_value sch_options, s48_value sch_options,
s48_value sch_facility) s48_value sch_facility)
{ {
int i;
char *syslog_ident_arg;
if (syslog_open) if (syslog_open)
s48_raise_string_os_error("syslog is already open"); s48_raise_string_os_error("syslog is already open");
openlog(s48_extract_string(sch_ident),
/* sch_ident may be copied to a different location by GC,
and openlog doesn't copy the input string, at least not
on every system. That's just great. */
/* strncpy doesn't really do what we want */
syslog_ident_arg = s48_extract_string(sch_ident);
for (i = 0;
(i < MAX_SYSLOG_IDENT-1) && (syslog_ident_arg[i] != '\0');
++i)
syslog_ident[i] = syslog_ident_arg[i];
syslog_ident[i] = '\0';
openlog(syslog_ident,
s48_extract_syslog_options(sch_options), s48_extract_syslog_options(sch_options),
s48_extract_syslog_facility(sch_facility)); s48_extract_syslog_facility(sch_facility));
syslog_open = 1; syslog_open = 1;