Ticket #10435: syslog.2.patch

File syslog.2.patch, 4.0 KB (added by David Schueler <david.schueler@…>, 6 years ago)

Bugfix to previous patch.

  • sysklogd/syslogd.c

    old new  
    246246        IF_FEATURE_IPC_SYSLOG(    ,&opt_C) \ 
    247247        IF_FEATURE_SYSLOGD_CFG(   ,&opt_f) 
    248248 
     249int split_escape(char *tmpbuf, int len); 
    249250 
    250251#if ENABLE_FEATURE_SYSLOGD_CFG 
    251252static const CODE* find_by_name(char *name, const CODE* c_set) 
     
    732733        } 
    733734} 
    734735 
     736int split_escape(char *tmpbuf, int len) 
     737{ 
     738        char *p = tmpbuf; 
     739        int pri = 0; 
     740        tmpbuf += len; 
     741        while (p < tmpbuf) { 
     742                char c; 
     743                char *q = G.parsebuf; 
     744                pri = (LOG_USER | LOG_NOTICE); 
     745                if (*p == '<') { 
     746                        pri = bb_strtou(p + 1, &p, 10); 
     747                        if (*p == '>') p++; 
     748                        if (pri & ~(LOG_FACMASK | LOG_PRIMASK)) 
     749                                pri = (LOG_USER | LOG_NOTICE); 
     750                } 
     751                while ((c = *p++)) { 
     752                        if (c == '\n') c = ' '; 
     753                        if (!(c & ~0x1f) && c != '\t') { 
     754                                *q++ = '^'; 
     755                                c += '@'; /* ^@, ^A, ^B... */ 
     756                        } 
     757                        *q++ = c; 
     758                } 
     759                *q = '\0'; 
     760        } 
     761         
     762        return pri; 
     763} 
     764 
    735765#ifdef SYSLOGD_MARK 
    736766static void do_mark(int sig) 
    737767{ 
     
    778808#if ENABLE_FEATURE_REMOTE_LOG 
    779809static int try_to_resolve_remote(remoteHost_t *rh) 
    780810{ 
     811        int fd = 0; 
    781812        if (!rh->remoteAddr) { 
    782813                unsigned now = monotonic_sec(); 
    783814 
     
    789820                if (!rh->remoteAddr) 
    790821                        return -1; 
    791822        } 
    792         return xsocket(rh->remoteAddr->u.sa.sa_family, SOCK_DGRAM, 0); 
     823        /*return xsocket(rh->remoteAddr->u.sa.sa_family, SOCK_DGRAM, 0);*/ 
     824        fd = xsocket(rh->remoteAddr->u.sa.sa_family, SOCK_STREAM, 0); 
     825        if (connect(fd, &rh->remoteAddr->u.sa, rh->remoteAddr->len) < 0) { 
     826                close(fd); 
     827                fd = -1; 
     828                if (rh->remoteAddr->u.sa.sa_family == AF_INET) { 
     829                        char buf[255]; 
     830                        snprintf(buf,255,"%s %s","syslogd can't connect to remote loghost",inet_ntoa(rh->remoteAddr->u.sin.sin_addr)); 
     831                        timestamp_and_log_internal(buf); 
     832                } 
     833                timestamp_and_log_internal("connection to remote loghost failed"); 
     834        } 
     835        return fd; 
    793836} 
    794837#endif 
    795838 
     
    799842        int sock_fd; 
    800843#if ENABLE_FEATURE_REMOTE_LOG 
    801844        llist_t *item; 
     845        int pri = 0; 
     846        char *timestamp; 
     847        char *msg; 
     848        int len = 0; 
     849        time_t now; 
    802850#endif 
    803851#if ENABLE_FEATURE_SYSLOGD_DUP 
    804852        int last_sz = -1; 
     
    867915#if ENABLE_FEATURE_REMOTE_LOG 
    868916                /* Stock syslogd sends it '\n'-terminated 
    869917                 * over network, mimic that */ 
    870                 recvbuf[sz] = '\n'; 
    871  
    872                 /* We are not modifying log messages in any way before send */ 
    873                 /* Remote site cannot trust _us_ anyway and need to do validation again */ 
     918                recvbuf[sz] = '\0'; 
     919                 
     920                /*********************************************** 
     921                 * ADD by Evil: 
     922                 * Take the logmsg, split it in pieces and add 
     923                 * the hostname to it befor loggin it over the 
     924                 * network. 
     925                 * Additoinally use TCP to log, not UDP.   
     926                 **********************************************/ 
     927 
     928                memset(G.parsebuf, 0, sizeof(G.parsebuf)); 
     929                memset(G.printbuf, 0, sizeof(G.printbuf)); 
     930                 
     931                pri = split_escape(recvbuf,sz); 
     932                msg = G.parsebuf; 
     933                len = strlen(G.parsebuf); 
     934 
     935                if (len < 16 || msg[3] != ' ' || msg[6] != ' ' 
     936                         || msg[9] != ':' || msg[12] != ':' || msg[15] != ' ' 
     937                ) { 
     938                        time(&now); 
     939                        timestamp = ctime(&now) + 4; /* skip day of week */ 
     940                } else { 
     941                        now = 0; 
     942                        timestamp = msg; 
     943                        msg += 16; 
     944                } 
     945                timestamp[15] = '\0'; 
     946                if (option_mask32 & OPT_small) 
     947                        sprintf(G.printbuf, "%s %s\n", timestamp, msg); 
     948                else { 
     949                        char res[20]; 
     950                        parse_fac_prio_20(pri, res); 
     951                        sprintf(G.printbuf, "<%d>%s [%.64s] %s %s\n", pri, timestamp, G.hostname, res, msg); 
     952                } 
     953                len = strlen(G.printbuf); 
     954                 
    874955                for (item = G.remoteHosts; item != NULL; item = item->link) { 
    875956                        remoteHost_t *rh = (remoteHost_t *)item->data; 
    876957 
     
    884965                         * On some errors, close and set remoteFD to -1 
    885966                         * so that DNS resolution is retried. 
    886967                         */ 
    887                         if (sendto(rh->remoteFD, recvbuf, sz+1, 
     968                        if (send(rh->remoteFD, G.printbuf, len, 0) == -1 
     969                        /*if (sendto(rh->remoteFD, recvbuf, sz+1, 
    888970                                        MSG_DONTWAIT | MSG_NOSIGNAL, 
    889                                         &(rh->remoteAddr->u.sa), rh->remoteAddr->len) == -1 
     971                                        &(rh->remoteAddr->u.sa), rh->remoteAddr->len) == -1*/ 
    890972                        ) { 
    891973                                switch (errno) { 
    892974                                case ECONNRESET: