box-drawing: LIGHT ARC: check for sqrt() failures

Closes #914
This commit is contained in:
Daniel Eklöf 2022-02-03 22:17:10 +01:00
parent a5f8ed1b78
commit e97e873b9e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 14 additions and 0 deletions

View file

@ -123,6 +123,8 @@
* Sixel: large image resizes (triggered by e.g. large repeat counts in
`DECGRI`) are now truncated instead of ignored.
* Sixel: a repeat count of 0 in `DECGRI` now emits a single sixel.
* LIGHT ARC box drawing characters incorrectly rendered
platforms (https://codeberg.org/dnkl/foot/issues/914).
### Security

View file

@ -1,6 +1,8 @@
#include "box-drawing.h"
#include <stdio.h>
#include <math.h>
#include <fenv.h>
#include <errno.h>
#define LOG_MODULE "box-drawing"
@ -1282,9 +1284,19 @@ draw_box_drawings_light_arc(struct buf *buf, wchar_t wc)
const int num_samples = height * 16;
for (int i = 0; i < num_samples; i++) {
errno = 0;
feclearexcept(FE_ALL_EXCEPT);
double y = i / 16.;
double x = sqrt(a2 * (1. - y * y / b2));
/* See math_error(7) */
if (errno != 0 ||
fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW))
{
continue;
}
const int row = round(y);
const int col = round(x);