Переглянути джерело

*** empty log message ***

eihrul 17 роки тому
батько
коміт
ea03f96881
3 змінених файлів з 24 додано та 10 видалено
  1. 2 2
      configure.in
  2. 13 0
      peer.c
  3. 9 8
      protocol.c

+ 2 - 2
configure.in

@@ -1,5 +1,5 @@
-AC_INIT(libenet, 10-11-2007)
-AM_INIT_AUTOMAKE(libenet.a, 10-11-2007)
+AC_INIT(libenet, 10-12-2007)
+AM_INIT_AUTOMAKE(libenet.a, 10-12-2007)
 
 AC_PROG_CC
 AC_PROG_RANLIB

+ 13 - 0
peer.c

@@ -473,6 +473,19 @@ enet_peer_queue_acknowledgement (ENetPeer * peer, const ENetProtocol * command,
 {
     ENetAcknowledgement * acknowledgement;
 
+    if (command -> header.channelID < peer -> channelCount)
+    {
+        ENetChannel * channel = & peer -> channels [command -> header.channelID];
+        enet_uint16 reliableWindow = command -> header.reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE,
+                    currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;
+
+        if (reliableWindow < currentWindow)
+          reliableWindow += ENET_PEER_RELIABLE_WINDOWS;
+
+        if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS)
+          return NULL;
+    }
+
     peer -> outgoingDataTotal += sizeof (ENetProtocolAcknowledge);
 
     acknowledgement = (ENetAcknowledgement *) enet_malloc (sizeof (ENetAcknowledgement));

+ 9 - 8
protocol.c

@@ -163,8 +163,6 @@ enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliabl
     ENetOutgoingCommand * outgoingCommand;
     ENetListIterator currentCommand;
     ENetProtocolCommand commandNumber;
-    ENetChannel * channel;
-    enet_uint16 reliableWindow;
 
     for (currentCommand = enet_list_begin (& peer -> sentReliableCommands);
          currentCommand != enet_list_end (& peer -> sentReliableCommands);
@@ -180,13 +178,16 @@ enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliabl
     if (currentCommand == enet_list_end (& peer -> sentReliableCommands))
       return ENET_PROTOCOL_COMMAND_NONE;
 
-    reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;
-    channel = & peer -> channels [channelID];
-    if (channel -> reliableWindows [reliableWindow] > 0)
+    if (channelID < peer -> channelCount)
     {
-       -- channel -> reliableWindows [reliableWindow];
-       if (! channel -> reliableWindows [reliableWindow])
-         channel -> usedReliableWindows &= ~ (1 << reliableWindow);
+       ENetChannel * channel = & peer -> channels [channelID];
+       enet_uint16 reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;
+       if (channel -> reliableWindows [reliableWindow] > 0)
+       {
+          -- channel -> reliableWindows [reliableWindow];
+          if (! channel -> reliableWindows [reliableWindow])
+            channel -> usedReliableWindows &= ~ (1 << reliableWindow);
+       }
     }
 
     commandNumber = outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK;