Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df9e6aaf authored by Robert Shih's avatar Robert Shih
Browse files

ARTPSource: avoid over/underflow in seq # recovery

Bug: 25801317
Change-Id: Id9a5ad2d6c27f64b502c78f06174b29edb486134
parent 436ae0b8
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -116,8 +116,15 @@ bool ARTPSource::queuePacket(const sp<ABuffer> &buffer) {
    // to the highest sequence number (extended to 32 bits) received so far.

    uint32_t seq1 = seqNum | (mHighestSeqNumber & 0xffff0000);
    uint32_t seq2 = seqNum | ((mHighestSeqNumber & 0xffff0000) + 0x10000);
    uint32_t seq3 = seqNum | ((mHighestSeqNumber & 0xffff0000) - 0x10000);

    // non-overflowing version of:
    // uint32_t seq2 = seqNum | ((mHighestSeqNumber & 0xffff0000) + 0x10000);
    uint32_t seq2 = seqNum | (((mHighestSeqNumber >> 16) + 1) << 16);

    // non-underflowing version of:
    // uint32_t seq2 = seqNum | ((mHighestSeqNumber & 0xffff0000) - 0x10000);
    uint32_t seq3 = seqNum | ((((mHighestSeqNumber >> 16) | 0x10000) - 1) << 16);

    uint32_t diff1 = AbsDiff(seq1, mHighestSeqNumber);
    uint32_t diff2 = AbsDiff(seq2, mHighestSeqNumber);
    uint32_t diff3 = AbsDiff(seq3, mHighestSeqNumber);