Packet engine: prevent divide by 0
[silc.git] / lib / silccore / silcpacket.c
index b67156758dab069682343e44f8f4739288a36d06..030291a09e83256bc389e02d32e85c48ed53d70c 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2008 Pekka Riikonen
+  Copyright (C) 1997 - 2009 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -710,6 +710,7 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine,
   /* Initialize packet procesors list */
   ps->process = silc_dlist_init();
   if (!ps->process) {
+    ps->stream = NULL;
     silc_packet_stream_destroy(ps);
     return NULL;
   }
@@ -722,6 +723,7 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine,
     ps->sc = silc_calloc(1, sizeof(*ps->sc));
     if (!ps->sc) {
       silc_mutex_unlock(engine->lock);
+      ps->stream = NULL;
       silc_packet_stream_destroy(ps);
       return NULL;
     }
@@ -734,6 +736,7 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine,
       silc_free(ps->sc);
       ps->sc = NULL;
       silc_mutex_unlock(engine->lock);
+      ps->stream = NULL;
       silc_packet_stream_destroy(ps);
       return NULL;
     }
@@ -745,6 +748,7 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine,
       silc_free(ps->sc);
       ps->sc = NULL;
       silc_mutex_unlock(engine->lock);
+      ps->stream = NULL;
       silc_packet_stream_destroy(ps);
       return NULL;
     }
@@ -757,6 +761,7 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine,
       silc_free(ps->sc);
       ps->sc = NULL;
       silc_mutex_unlock(engine->lock);
+      ps->stream = NULL;
       silc_packet_stream_destroy(ps);
       return NULL;
     }
@@ -779,6 +784,7 @@ SilcPacketStream silc_packet_stream_create(SilcPacketEngine engine,
   if (!silc_stream_set_notifier(ps->stream, schedule,
                                silc_packet_stream_io, ps)) {
     SILC_LOG_DEBUG(("Cannot set stream notifier for packet stream"));
+    ps->stream = NULL;
     silc_packet_stream_destroy(ps);
     return NULL;
   }
@@ -2225,8 +2231,9 @@ static void silc_packet_read_process(SilcPacketStream stream)
 
     /* Padding sanity checks */
     if (cipher && silc_cipher_get_mode(cipher) != SILC_CIPHER_MODE_CTR &&
-       ((normal && paddedlen % block_len != 0) ||
-        (!normal && silc_packet_special_len(header) % block_len != 0))) {
+       ((normal && block_len && paddedlen % block_len != 0) ||
+        (!normal && block_len &&
+          silc_packet_special_len(header) % block_len != 0))) {
       SILC_LOG_DEBUG(("Packet length %d not multiple by cipher block length",
                      paddedlen));
       silc_mutex_unlock(stream->lock);