|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 26 Oct 2006 22:22:36 To : Valentin Davydov Subject : Re: syslog protocol -------------------------------------------------------------------------------- 26 окт 2006, четверг, в 17:19 KRAST, Valentin Davydov написал(а): >>Вопрос: допустимы ли в syslog-сообщениях нулевые коды? VD> RTFS! Я тут надысь читал и офигевал. >>Если нет, есть смысл пинать девелоперов свича, благо они русскоязычные >>(да, свич на 'L'). Если да, то придется чинить syslog и PR рисовать. VD> Перепиши его на авке ;-) Да пропатчить syslogd чтобы его printline() принимал длину буфера лишним аргументом, смотрел конец строки не по нулю и на месте нуля рисовал ^@ это минутное дело, полтора килобайта diff. Оно уже у меня работает в тестовом режиме, а вообще надо конечно чинить коммутатор... - --- syslogd.c.orig Thu Oct 26 16:19:39 2006 +++ syslogd.c Thu Oct 26 19:13:26 2006 @@ -311,7 +311,7 @@ static void log_deadchild(pid_t, int, const char *); static void markit(void); static int skip_message(const char *, const char *, int); -static void printline(const char *, char *); +static void printline(const char *, char *, int); static void printsys(char *); static int p_open(const char *, pid_t *); static void readklog(void); @@ -580,7 +580,7 @@ hname = cvthname((struct sockaddr *)&frominet); unmapped((struct sockaddr *)&frominet); if (validate((struct sockaddr *)&frominet, hname)) - printline(hname, line); + printline(hname, line, l); } else if (l < 0 && errno != EINTR) logerror("recvfrom inet"); } @@ -593,7 +593,7 @@ (struct sockaddr *)&fromunix, &len); if (l > 0) { line[l] = '\0'; - printline(LocalHostName, line); + printline(LocalHostName, line, l); } else if (l < 0 && errno != EINTR) logerror("recvfrom unix"); } @@ -645,7 +645,7 @@ * on the appropriate log files. */ static void -printline(const char *hname, char *msg) +printline(const char *hname, char *msg, int l) { char *p, *q; long n; @@ -676,14 +676,14 @@ q = line; - while ((c = (unsigned char)*p++) != '\0' && + while (((c = (unsigned char)*p++), p < msg + l) && q < &line[sizeof(line) - 4]) { if ((c & 0x80) && c < 0xA0) { c &= 0x7F; *q++ = 'M'; *q++ = '-'; } - if (isascii(c) && iscntrl(c)) { + if ((isascii(c) && iscntrl(c)) || c == '\0') { if (c == '\n') { *q++ = ' '; } else if (c == '\t') { Eugene -- Hароду - чтоб не вздумал бунтовать! - Мы тоже разрешили воровать. Пусть лучше сам ворует потихоньку, Чем с воровскою властью враждовать!.. --- slrn/0.9.8.0 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/26093b0fcc4af.html, оценка из 5, голосов 10
|