mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-10-12 23:03:52 -04:00
Annotate() clamped the label position to [0, width - text_width] in unsigned arithmetic. A label wider (or taller) than the frame wrapped that bound to about four billion, so the requested LabelX/LabelY was used unchanged and glyph rows were written past the end of the frame buffer on every captured frame. The label text, position and size are monitor settings any editor of that monitor can change. Compute the bounds in signed arithmetic and floor them at zero. Draw a glyph only when its whole cell fits in the row and a line only when it fits in the frame, rather than checking after the glyph is already drawn, and skip foreground pixels that fall outside the row (the shipped font reaches one column past the cell). LabelSize indexed the font variants with size - 1 through at(), so 0 or anything above 4 threw out_of_range in the capture thread. Clamp it to the valid sizes in Annotate() and centreCoord(). Add tests that draw into a buffer followed by a guard region, covering oversized, overlong, overtall and out-of-range label sizes in each pixel format. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>