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

Commit 8ea061bc authored by Bryan Mawhinney's avatar Bryan Mawhinney
Browse files

Prevent message overrun in LocklessCommandFifo.

The previous logic in makeSpace and makeSpaceNonBlocking
was incorrect (probably a typo).  We shouldn't loop if
looping will overwrite unread messages, or if we would
make the buffer appear empty (mPut == mGet).

Change-Id: Iabc82ca94a585a7041069db97cbed7709f2d388f
parent bcdf40b4
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ bool LocklessCommandFifo::makeSpaceNonBlocking(uint32_t bytes) {
    //dumpState("make space non-blocking");
    if ((mPut+bytes) > mEnd) {
        // Need to loop regardless of where get is.
        if ((mGet > mPut) && (mBuffer+4 >= mGet)) {
        if ((mGet > mPut) || (mBuffer+4 >= mGet)) {
            return false;
        }

@@ -189,7 +189,7 @@ void LocklessCommandFifo::makeSpace(uint32_t bytes) {
    //dumpState("make space");
    if ((mPut+bytes) > mEnd) {
        // Need to loop regardless of where get is.
        while ((mGet > mPut) && (mBuffer+4 >= mGet)) {
        while ((mGet > mPut) || (mBuffer+4 >= mGet)) {
            usleep(100);
        }

@@ -210,4 +210,3 @@ void LocklessCommandFifo::makeSpace(uint32_t bytes) {
void LocklessCommandFifo::dumpState(const char *s) const {
    LOGV("%s %p  put %p, get %p,  buf %p,  end %p", s, this, mPut, mGet, mBuffer, mEnd);
}