Packet engine: do not do the padding length check for CTR mode.
[silc.git] / lib / silccore / silcpacket.c
index f552ca6d1741aebf31648e1c694d34c302792ac3..767ec927a4712a9f24575571cea1a4a45de51724 100644 (file)
@@ -2197,10 +2197,11 @@ static void silc_packet_read_process(SilcPacketStream stream)
     /* Get packet length and full packet length with padding */
     SILC_PACKET_LENGTH(header, packetlen, paddedlen);
 
-    /* Sanity checks */
-    if (silc_unlikely(packetlen < SILC_PACKET_MIN_LEN)) {
-      if (!stream->udp && !silc_socket_stream_is_udp(stream->stream, NULL))
-       SILC_LOG_ERROR(("Received too short packet"));
+    /* Padding sanity checks */
+    if (cipher && silc_cipher_get_mode(cipher) != SILC_CIPHER_MODE_CTR &&
+       (paddedlen % block_len) != 0) {
+      SILC_LOG_DEBUG(("Packet length %d not multiple by cipher block length",
+                     paddedlen));
       silc_mutex_unlock(stream->lock);
       SILC_PACKET_CALLBACK_ERROR(stream, SILC_PACKET_ERR_MALFORMED);
       silc_mutex_lock(stream->lock);
@@ -2231,6 +2232,17 @@ static void silc_packet_read_process(SilcPacketStream stream)
       goto out;
     }
 
+    /* Sanity checks */
+    if (silc_unlikely(packetlen < SILC_PACKET_MIN_LEN)) {
+      if (!stream->udp && !silc_socket_stream_is_udp(stream->stream, NULL))
+       SILC_LOG_ERROR(("Received too short packet"));
+      silc_mutex_unlock(stream->lock);
+      SILC_PACKET_CALLBACK_ERROR(stream, SILC_PACKET_ERR_MALFORMED);
+      silc_mutex_lock(stream->lock);
+      memset(tmp, 0, sizeof(tmp));
+      goto out;
+    }
+
     /* Get packet */
     packet = silc_packet_alloc(stream->sc->engine);
     if (silc_unlikely(!packet)) {