media: dvb_ringbuffer: Fix bug in DVB's ringbuffer logic

Message ID eeb06501-2119-1e22-8fb9-c19a691b24a3@selasky.org (mailing list archive)
State Superseded
Headers
Series media: dvb_ringbuffer: Fix bug in DVB's ringbuffer logic |

Commit Message

Hans Petter Selasky Sept. 27, 2022, 7:32 a.m. UTC
  Properly account for negative values when computing the consumed
value for DVB ringbuffers, by adding the size of the ring-buffer.
The modulus is unsigned so no out of bounds is possible, but
dvb_ringbuffer_pkt_next() may fail for CA's at least when the
default buffer size of 65535 bytes is used.

The current logic only works for buffer sizes that are power of two.

Signed-off-by: Yong Su Yoo <yongsuyoo0215@gmail.com>
Signed-off-by: Hans Petter Selasky <hps@selasky.org>
---
  drivers/media/dvb-core/dvb_ringbuffer.c | 4 +++-
  1 file changed, 3 insertions(+), 1 deletion(-)

DVB_RINGBUFFER_PKTHDRSIZE) {
  

Patch

diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c 
b/drivers/media/dvb-core/dvb_ringbuffer.c
index d1d471af0636..7d4558de8e83 100644
--- a/drivers/media/dvb-core/dvb_ringbuffer.c
+++ b/drivers/media/dvb-core/dvb_ringbuffer.c
@@ -335,7 +335,9 @@  ssize_t dvb_ringbuffer_pkt_next(struct 
dvb_ringbuffer *rbuf, size_t idx, size_t*
  		idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
  	}

-	consumed = (idx - rbuf->pread) % rbuf->size;
+	consumed = (idx - rbuf->pread);
+	if (consumed < 0)
+		consumed += rbuf->size;

  	while((dvb_ringbuffer_avail(rbuf) - consumed) >