httpd: fix buglet in hex conversion. Remove alloca NULL checks
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 21 Aug 2007 11:18:25 +0000 (11:18 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 21 Aug 2007 11:18:25 +0000 (11:18 -0000)
(never happens, app just crashes if stack overflows)
svlogd: cosmetic messages and style fixes

networking/httpd.c
runit/svlogd.c

index 7e60fc2..a888c24 100644 (file)
@@ -163,7 +163,7 @@ enum {
 #endif
 };
 
-static const uint16_t http_response_type[] = {
+static const uint16_t http_response_type[] ALIGN2 = {
        HTTP_OK,
        HTTP_MOVED_TEMPORARILY,
        HTTP_REQUEST_TIMEOUT,
@@ -287,8 +287,6 @@ struct globals {
 } while (0)
 
 
-
-
 #define STRNCASECMP(a, str) strncasecmp((a), (str), sizeof(str)-1)
 
 /* Prototypes */
@@ -467,11 +465,6 @@ static void parse_conf(const char *path, int flag)
 
        if (flag == SUBDIR_PARSE || cf == NULL) {
                cf = alloca(strlen(path) + sizeof(httpd_conf) + 2);
-               if (cf == NULL) {
-                       if (flag == FIRST_PARSE)
-                               bb_error_msg_and_die(bb_msg_memory_exhausted);
-                       return;
-               }
                sprintf((char *)cf, "%s/%s", path, httpd_conf);
        }
 
@@ -554,7 +547,7 @@ static void parse_conf(const char *path, int flag)
                        /* error status code */
                        int status = atoi(++p0);
                        /* c already points at the character following ':' in parse loop */
-                       // c = strchr(p0, ':'); c++;
+                       /* c = strchr(p0, ':'); c++; */
                        if (status < HTTP_CONTINUE) {
                                bb_error_msg("config error '%s' in '%s'", buf, cf);
                                continue;
@@ -575,9 +568,7 @@ static void parse_conf(const char *path, int flag)
                if (*p0 == '/') {
                        /* make full path from httpd root / current_path / config_line_path */
                        cf = (flag == SUBDIR_PARSE ? path : "");
-                       p0 = malloc(strlen(cf) + (c - buf) + 2 + strlen(c));
-                       if (p0 == NULL)
-                               continue;
+                       p0 = xmalloc(strlen(cf) + (c - buf) + 2 + strlen(c));
                        c[-1] = '\0';
                        sprintf(p0, "/%s%s", cf, buf);
 
@@ -694,9 +685,11 @@ static char *encodeString(const char *string)
        char ch;
 
        while ((ch = *string++)) {
-               // very simple check for what to encode
-               if (isalnum(ch)) *p++ = ch;
-               else p += sprintf(p, "&#%d;", (unsigned char) ch);
+               /* very simple check for what to encode */
+               if (isalnum(ch))
+                       *p++ = ch;
+               else
+                       p += sprintf(p, "&#%d;", (unsigned char) ch);
        }
        *p = '\0';
        return out;
@@ -717,18 +710,21 @@ static char *encodeString(const char *string)
  */
 static unsigned hex_to_bin(unsigned char c)
 {
-       unsigned v = c | 0x20; /* lowercase */
-       v = v - '0';
+       unsigned v;
+
+       v = c - '0';
        if (v <= 9)
                return v;
-       v = v + ('0' - 'a');
+       /* c | 0x20: letters to lower case, non-letters
+        * to (potentially different) non-letters */
+       v = (unsigned)(c | 0x20) - 'a';
        if (v <= 5)
                return v + 10;
        return ~0;
 }
 /* For testing:
-void t(char c) { printf("'%c' %u\n", c, hex_to_bin(c)); }
-int main() { t('0'); t('9'); t('A'); t('F'); t('a'); t('f');
+void t(char c) { printf("'%c'(%u) %u\n", c, c, hex_to_bin(c)); }
+int main() { t(0x10); t(0x20); t('0'); t('9'); t('A'); t('F'); t('a'); t('f');
 t('0'-1); t('9'+1); t('A'-1); t('F'+1); t('a'-1); t('f'+1); return 0; }
 */
 static char *decodeString(char *orig, int option_d)
index b8fa564..6c8747e 100644 (file)
@@ -513,22 +513,25 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
        /* read config */
        i = open_read_close("config", buf, sizeof(buf));
        if (i < 0 && errno != ENOENT)
-               bb_perror_msg(WARNING"%s/config", ld->name);
+               bb_perror_msg(WARNING"%s/config", ld->name);
        if (i > 0) {
                if (verbose)
                        bb_error_msg(INFO"read: %s/config", ld->name);
                s = buf;
                while (s) {
                        np = strchr(s, '\n');
-                       if (np) *np++ = '\0';
+                       if (np)
+                               *np++ = '\0';
                        switch (s[0]) {
                        case '+':
                        case '-':
                        case 'e':
                        case 'E':
+                               /* Add '\n'-terminated line to ld->inst */
                                while (1) {
-                                       int l = asprintf(&new, "%s%s\n", ld->inst?:"", s);
-                                       if (l >= 0 && new) break;
+                                       int l = asprintf(&new, "%s%s\n", ld->inst ? : "", s);
+                                       if (l >= 0 && new)
+                                               break;
                                        pause_nomem();
                                }
                                free(ld->inst);
@@ -578,7 +581,8 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
                s = ld->inst;
                while (s) {
                        np = strchr(s, '\n');
-                       if (np) *np++ = '\0';
+                       if (np)
+                               *np++ = '\0';
                        s = np;
                }
        }
@@ -586,7 +590,7 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
        /* open current */
        i = stat("current", &st);
        if (i != -1) {
-               if (st.st_size && ! (st.st_mode & S_IXUSR)) {
+               if (st.st_size && !(st.st_mode & S_IXUSR)) {
                        ld->fnsave[25] = '.';
                        ld->fnsave[26] = 'u';
                        ld->fnsave[27] = '\0';
@@ -600,8 +604,9 @@ static unsigned logdir_open(struct logdir *ld, const char *fn)
                        rmoldest(ld);
                        i = -1;
                } else {
-                       /* Be paranoid: st.st_size can be not just bigger, but WIDER! */
-                       /* (bug in original svlogd. remove this comment when fixed there) */
+                       /* st.st_size can be not just bigger, but WIDER!
+                        * This code is safe: if st.st_size > 4GB, we select
+                        * ld->sizemax (because it's "unsigned") */
                        ld->size = (st.st_size > ld->sizemax) ? ld->sizemax : st.st_size;
                }
        } else {
@@ -667,7 +672,7 @@ static int buffer_pread(int fd, char *s, unsigned len)
        int i;
 
        input.fd = 0;
-        input.events = POLLIN|POLLHUP|POLLERR;
+       input.events = POLLIN;
 
        do {
                if (rotateasap) {
@@ -744,7 +749,6 @@ static int buffer_pread(int fd, char *s, unsigned len)
        return i;
 }
 
-
 static void sig_term_handler(int sig_no)
 {
        if (verbose)