Просмотр исходного кода

Socket management : fix possible lose of packets when keepalive message is received

Signed-off-by: Thomas Guillem <thomas@gllm.fr>
Sylver Bruneau 9 лет назад
Родитель
Сommit
0d75e9452d
1 измененных файлов с 6 добавлено и 4 удалено
  1. 6 4
      src/netbios_session.c

+ 6 - 4
src/netbios_session.c

@@ -216,15 +216,17 @@ ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
 
     assert(s != NULL && s->packet != NULL && s->socket && s->state > 0);
 
-    res = recv(s->socket, (void *)(s->packet), s->packet_payload_size, 0);
+    // Only get packet header and analyze it to get only needed number of bytes
+    // needed for the packet. This will prevent losing a part of next packet
+    res = recv(s->socket, (void *)(s->packet), sizeof(netbios_session_packet), 0);
     if (res < 0)
     {
         BDSM_perror("netbios_session_packet_recv: ");
         return (-1);
     }
-    if ((size_t)res < sizeof(netbios_session_packet))
+    if ((size_t)res != sizeof(netbios_session_packet))
     {
-        BDSM_dbg("netbios_session_packet_recv: packet received too small: %ld bytes",
+        BDSM_dbg("netbios_session_packet_recv: incorrect size for received packet: %ld bytes",
                  res);
         if (data != NULL)
              *data = NULL;
@@ -233,7 +235,7 @@ ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
   
     total  = ntohs(s->packet->length);
     total |= (s->packet->flags & 0x01) << 16;
-    sofar  = res - sizeof(netbios_session_packet);
+    sofar  = 0;
 
     if (total + sizeof(netbios_session_packet) > s->packet_payload_size)
         if (!session_buffer_realloc(s, total + sizeof(netbios_session_packet)))