modprobe: fix a bug where we were entering endless loop

syslogd: strip trailing '\n' too, not only NULs
This commit is contained in:
Denis Vlasenko 2007-11-06 11:34:03 +00:00
parent 5281630229
commit cb12cb2407
2 changed files with 12 additions and 2 deletions

View File

@ -791,7 +791,7 @@ static void check_dep(char *mod, struct mod_list_t **head, struct mod_list_t **t
if (*tail)
(*tail)->m_next = find;
find->m_prev = *tail;
/*find->m_next = NULL; - xzalloc did it */
find->m_next = NULL; /* possibly NOT done by xzalloc! */
if (!*head)
*head = find;

View File

@ -536,10 +536,20 @@ static void do_syslogd(void)
while (1) {
if (sz == 0)
goto read_again;
if (G.recvbuf[sz-1])
/* man 3 syslog says: "A trailing newline is added when needed".
* However, neither glibc nor uclibc do this:
* syslog(prio, "test") sends "test\0" to /dev/log,
* syslog(prio, "test\n") sends "test\n\0",
* IOW: newline is passed verbatim!
* I take it to mean that it's syslogd's job
* to make those look identical in the log files */
if (G.recvbuf[sz-1] && G.recvbuf[sz-1] != '\n')
break;
sz--;
}
/* Maybe we need to add '\n' here, not later?
* It looks like stock syslogd does send '\n' over network,
* but we do not (see sendto below) */
G.recvbuf[sz] = '\0'; /* make sure it *is* NUL terminated */
/* TODO: maybe suppress duplicates? */