← index #16560Issue #17847
Off-topic · high · value 0.212
QUERY · ISSUE

RingIO is limited to 64kB

openby ma261065opened 2025-01-09updated 2025-01-29
enhancement

Description

Discussion: https://github.com/micropython/micropython/pull/9458#issuecomment-2581252345

Currently RingIO is limited to creating ring buffers of 64kB by the use of the following uint16_t variables in ringbuf.h:

typedef struct _ringbuf_t {
    uint8_t *buf;
    uint16_t size;
    uint16_t iget;
    uint16_t iput;
} ringbuf_t;

The suggestion is to change these to uint32_t to allow for >64kB ringbuffers. This would only be useful in ports with more than 64kB of heap available, so it may be worthwhile having different versions for different ports.

Or maybe the extra 6 bytes is acceptable across all ports for the sake of simplicity/consistency?

I note that other structures (like bytearray) don't have a 64kB limit, so this would seem to be some sort of precedent for changing the limit.

Code Size

This change would add 6 bytes to RAM usage whenever RingIO is invoked

Implementation

I hope the MicroPython maintainers or community will implement this feature

Code of Conduct

Yes, I agree

CANDIDATE · ISSUE

ringbuf: Zero-length ringbuf creation allowed, causes crash

closedby jepleropened 2025-08-06updated 2025-08-14
bug

Port, board and/or hardware

unix port, coverage variant, x86_64 linux

MicroPython version

MicroPython v1.26.0-preview.524.g255d74b5a8 on 2025-08-06; linux [GCC 12.2.0] version

Reproduction

Run the following script:

import micropython
rb = micropython.RingIO(bytearray(0))
rb.write(b'\1')

Expected behaviour

An exception is thown on line 2, because a zero-byte ring buffer is nonsense.

Observed behaviour

Division by zero (reported by Linux as SIGFPE) occurs on line 3:

>>> micropython.RingIO(bytearray(0)).write(b'\1')

Program received signal SIGFPE, Arithmetic exception.
0x0000555555605f33 in ringbuf_free (r=0x7ffff7c318a8) at ../../py/ringbuf.h:86
86	    return (r->size + r->iget - r->iput - 1) % r->size;

Additional Information

Found via fuzzing, manually minimized.

Code of Conduct

Yes, I agree

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied