Fix sequence number crash

This commit is contained in:
Atlante45 2015-07-31 15:09:58 -07:00
parent 06bbb7c4f1
commit fcec53bdce
2 changed files with 6 additions and 3 deletions

View file

@ -86,7 +86,7 @@ void SendQueue::ack(SequenceNumber ack) {
{ // remove any sequence numbers equal to or lower than this ACK in the loss list { // remove any sequence numbers equal to or lower than this ACK in the loss list
QWriteLocker nakLocker(&_naksLock); QWriteLocker nakLocker(&_naksLock);
if (_naks.getLength() > 0) { if (_naks.getLength() > 0 && _naks.getFirstSequenceNumber() <= ack) {
_naks.remove(_naks.getFirstSequenceNumber(), ack); _naks.remove(_naks.getFirstSequenceNumber(), ack);
} }
} }

View file

@ -21,7 +21,8 @@ namespace udt {
class SequenceNumber { class SequenceNumber {
public: public:
// Base type of sequence numbers // Base type of sequence numbers
using Type = uint32_t; using Type = int32_t;
using UType = uint32_t;
// Values are for 29 bit SequenceNumber // Values are for 29 bit SequenceNumber
static const Type THRESHOLD = 0x0FFFFFFF; // threshold for comparing sequence numbers static const Type THRESHOLD = 0x0FFFFFFF; // threshold for comparing sequence numbers
@ -32,8 +33,10 @@ public:
// Only explicit conversions // Only explicit conversions
explicit SequenceNumber(char* value) { _value = (*reinterpret_cast<int32_t*>(value)) & MAX; } explicit SequenceNumber(char* value) { _value = (*reinterpret_cast<int32_t*>(value)) & MAX; }
explicit SequenceNumber(Type value) { _value = (value <= MAX) ? value : MAX; } explicit SequenceNumber(Type value) { _value = (value <= MAX) ? ((value >= 0) ? value : 0) : MAX; }
explicit SequenceNumber(UType value) { _value = (value <= MAX) ? value : MAX; }
explicit operator Type() { return _value; } explicit operator Type() { return _value; }
explicit operator UType() { return static_cast<UType>(_value); }
inline SequenceNumber& operator++() { inline SequenceNumber& operator++() {
_value = (_value == MAX) ? 0 : ++_value; _value = (_value == MAX) ? 0 : ++_value;