File 187.patch of Package transfig.38710

commit c4465e0d9af89d9738aad31c2d0873ac1fa03c96
Author: Thomas Loimer <thomas.loimer@tuwien.ac.at>
Date:   Sat Jan 25 21:06:59 2025 +0100

    Reject arcs with an radius smaller than 3, #187
    
    This also reverts the previous commit, 1e5515. An arc with too
    small radius caused a crash in pict2e output. Instead of dealing
    with such arcs in the pict2e driver, reject them already when
    reading.

---
 fig2dev/object.h  |    8 +++++++-
 fig2dev/read1_3.c |    6 ++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

--- fig2dev/object.h
+++ fig2dev/object.h	2025-05-16 09:12:26.915755184 +0000
@@ -92,11 +92,14 @@ typedef struct f_ellipse {
 	struct f_ellipse	*next;
 } F_ellipse;
 
+#define RADIUS2_MIN	9
 #define INVALID_ELLIPSE(e)						\
 	e->type < T_ELLIPSE_BY_RAD || e->type > T_CIRCLE_BY_DIA ||	\
 	COMMON_PROPERTIES(e) || (e->direction != 1 && e->direction != 0) ||  \
 	e->radiuses.x == 0 || e->radiuses.y == 0 ||			\
+	e->radiuses.x + e->radiuses.y < RADIUS2_MIN ||			\
 	e->angle < -7. || e->angle > 7.
+	/* radiuses are set to positive in read.c */
 
 typedef struct f_arc {
 	int			type;
@@ -131,7 +134,10 @@ typedef struct f_arc {
 	(a->direction != 0 && a->direction != 1) ||			\
 	COINCIDENT(a->point[0], a->point[1]) ||				\
 	COINCIDENT(a->point[0], a->point[2]) ||				\
-	COINCIDENT(a->point[1], a->point[2])
+	COINCIDENT(a->point[1], a->point[2]) ||				\
+	(a->point[0].x - a->center.x) * (a->point[0].x - a->center.x) +	\
+	(a->point[0].y - a->center.y) * (a->point[0].y - a->center.y) <	\
+	RADIUS2_MIN
 
 typedef struct f_line {
 	int			type;
--- fig2dev/read1_3.c
+++ fig2dev/read1_3.c	2025-05-16 09:12:26.915755184 +0000
@@ -157,8 +157,10 @@ read_arcobject(FILE *fp)
 	a->pen_color = a->fill_color = BLACK_COLOR;
 	a->depth = 0;
 	a->pen = 0;
+	a->fill_style = 0;
 	a->for_arrow = NULL;
 	a->back_arrow = NULL;
+	a->cap_style = 0;
 	a->comments = NULL;
 	a->next = NULL;
 	n = fscanf(fp,
@@ -329,6 +331,10 @@ read_ellipseobject(FILE *fp)
 		e->type = T_CIRCLE_BY_RAD;
 	else
 		e->type = T_CIRCLE_BY_DIA;
+	if (e->radiuses.x < 0)
+		e->radiuses.x *= -1;
+	if (e->radiuses.y < 0)
+		e->radiuses.y *= -1;
 	if (INVALID_ELLIPSE(e)) {
 		put_msg(Err_invalid, "ellipse");
 		free(e);
openSUSE Build Service is sponsored by