[hamradio-commits] [dump1090] 35/373: Better error handling for network clients.

Matthew Ernisse mernisse-guest at moszumanska.debian.org
Thu Oct 23 14:58:02 UTC 2014


This is an automated email from the git hooks/post-receive script.

mernisse-guest pushed a commit to branch backport
in repository dump1090.

commit 0bf65d86464c87e53da1e5e9a2c93558f3e50c30
Author: antirez <antirez at gmail.com>
Date:   Tue Jan 15 00:35:21 2013 +0100

    Better error handling for network clients.
---
 dump1090.c | 57 +++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 41 insertions(+), 16 deletions(-)

diff --git a/dump1090.c b/dump1090.c
index 1bac907..2433b00 100644
--- a/dump1090.c
+++ b/dump1090.c
@@ -1737,8 +1737,12 @@ int hexDigitVal(int c) {
  * The message is passed to the higher level layers, so it feeds
  * the selected screen output, the network output and so forth.
  * 
- * If the message looks invalid is silently discarded. */
-void decodeHexMessage(struct client *c) {
+ * If the message looks invalid is silently discarded.
+ *
+ * The function always returns 0 (success) to the caller as there is
+ * no case where we want broken messages here to close the client
+ * connection. */
+int decodeHexMessage(struct client *c) {
     char *hex = c->buf;
     int l = strlen(hex), j;
     unsigned char msg[MODES_LONG_MSG_BYTES];
@@ -1755,18 +1759,19 @@ void decodeHexMessage(struct client *c) {
     }
 
     /* Turn the message into binary. */
-    if (l < 2 || hex[0] != '*' || hex[l-1] != ';') return;
+    if (l < 2 || hex[0] != '*' || hex[l-1] != ';') return 0;
     hex++; l-=2; /* Skip * and ; */
-    if (l > MODES_LONG_MSG_BYTES*2) return; /* Too long message... broken. */
+    if (l > MODES_LONG_MSG_BYTES*2) return 0; /* Too long message... broken. */
     for (j = 0; j < l; j += 2) {
         int high = hexDigitVal(hex[j]);
         int low = hexDigitVal(hex[j+1]);
 
-        if (high == -1 || low == -1) return;
+        if (high == -1 || low == -1) return 0;
         msg[j/2] = (high<<4) | low;
     }
     decodeModesMessage(&mm,msg);
     useModesMessage(&mm);
+    return 0;
 }
 
 /* Return a description of planes in json. */
@@ -1820,8 +1825,11 @@ char *aircraftsToJson(int *len) {
 
 /* Get an HTTP request header and write the response to the client.
  * Again here we assume that the socket buffer is enough without doing
- * any kind of userspace buffering. */
-void handleHTTPRequest(struct client *c) {
+ * any kind of userspace buffering.
+ *
+ * Returns 1 on error to signal the caller the client connection should
+ * be closed. */
+int handleHTTPRequest(struct client *c) {
     char hdr[512];
     int clen, hdrlen;
     int keepalive;
@@ -1833,10 +1841,10 @@ void handleHTTPRequest(struct client *c) {
     /* Minimally parse the request. */
     keepalive = strstr(c->buf, "keep-alive") != NULL;
     p = strchr(c->buf,' ');
-    if (!p) return; /* There should be the method and a space... */
+    if (!p) return 1; /* There should be the method and a space... */
     url = ++p; /* Now this should point to the requested URL. */
     p = strchr(p, ' ');
-    if (!p) return; /* There should be a space before HTTP/... */
+    if (!p) return 1; /* There should be a space before HTTP/... */
     *p = '\0';
     /* printf("URL: %s\n", url); */
 
@@ -1854,7 +1862,10 @@ void handleHTTPRequest(struct client *c) {
             (fd = open("gmap.html",O_RDONLY)) != -1)
         {
             content = malloc(sbuf.st_size);
-            read(fd,content,sbuf.st_size);
+            if (read(fd,content,sbuf.st_size) == -1) {
+                snprintf(content,sbuf.st_size,"Error reading from file: %s",
+                    strerror(errno));
+            }
             clen = sbuf.st_size;
         } else {
             char buf[128];
@@ -1878,12 +1889,17 @@ void handleHTTPRequest(struct client *c) {
         ctype,
         keepalive ? "keep-alive" : "close",
         clen);
-    write(c->fd, hdr, hdrlen);
 
-    /* Send the actual content. */
-    write(c->fd, content, clen);
+    /* Send header and content. */
+    if (write(c->fd, hdr, hdrlen) == -1 ||
+        write(c->fd, content, clen) == -1)
+    {
+        free(content);
+        return 1;
+    }
     free(content);
     Modes.stat_http_requests++;
+    return 0;
 }
 
 /* This function polls the clients using read() in order to receive new
@@ -1893,9 +1909,13 @@ void handleHTTPRequest(struct client *c) {
  * separator 'sep', that is a null-terminated C string.
  *
  * Every full message received is decoded and passed to the higher layers
- * calling the function 'handler'. */
+ * calling the function 'handler'.
+ *
+ * The handelr returns 0 on success, or 1 to signal this function we
+ * should close the connection with the client in case of non-recoverable
+ * errors. */
 void modesReadFromClient(struct client *c, char *sep,
-                         void(*handler)(struct client *))
+                         int(*handler)(struct client *))
 {
     while(1) {
         int left = sizeof(c->buf) - c->buflen;
@@ -1919,7 +1939,12 @@ void modesReadFromClient(struct client *c, char *sep,
         if ((p = strstr(c->buf, sep)) != NULL) {
             i = p - c->buf; /* Turn it as an index inside the buffer. */
             c->buf[i] = '\0'; /* Te handler expects null terminated strings. */
-            handler(c); /* Call the function to process the message. */
+            /* Call the function to process the message. It returns 1
+             * on error to signal we should close the client connection. */
+            if (handler(c)) {
+                modesFreeClient(c->fd);
+                return;
+            }
             /* Move what's left at the start of the buffer. */
             i += strlen(sep); /* The separator is part of the previous msg. */
             memmove(c->buf,c->buf+i,c->buflen-i);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/dump1090.git



More information about the pkg-hamradio-commits mailing list