Don't abort() willy-nilly in SPTPS code.
authorEtienne Dechamps <etienne@edechamps.fr>
Sun, 8 Mar 2015 17:32:39 +0000 (17:32 +0000)
committerEtienne Dechamps <etienne@edechamps.fr>
Sun, 8 Mar 2015 17:35:06 +0000 (17:35 +0000)
If receive_handshake() or the receive_record() user callback returns an
error, sptps_receive_data_datagram() crashes the entire process. This is
heavy-handed, makes tinc very brittle to certain failures (i.e.
unexpected packets), and is inconsistent with the rest of SPTPS code.

src/sptps.c

index a598768..4a9683f 100644 (file)
@@ -483,10 +483,10 @@ static bool sptps_receive_data_datagram(sptps_t *s, const char *data, size_t len
                if(!s->instate)
                        return error(s, EIO, "Application record received before handshake finished");
                if(!s->receive_record(s->handle, type, buffer + 1, len - 21))
                if(!s->instate)
                        return error(s, EIO, "Application record received before handshake finished");
                if(!s->receive_record(s->handle, type, buffer + 1, len - 21))
-                       abort();
+                       return false;
        } else if(type == SPTPS_HANDSHAKE) {
                if(!receive_handshake(s, buffer + 1, len - 21))
        } else if(type == SPTPS_HANDSHAKE) {
                if(!receive_handshake(s, buffer + 1, len - 21))
-                       abort();
+                       return false;
        } else {
                return error(s, EIO, "Invalid record type %d", type);
        }
        } else {
                return error(s, EIO, "Invalid record type %d", type);
        }