[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mgp-users-jp 00798] too long line will segfault



すごく長いアルファベットだけの行をtruetypeで表示しようとすると
segfault します。(mgp-snap-20010212 でも)
# see also: http://bugs.debian.org/52449

どうも長いフラグメントになってそれが画面外の方へもがんがん書こうとして
死んでるようでしたので、こうしたのですが、これであってるでしょうか?

あと epstoimage()の fsync(fd)は fflush(fp)じゃないでしょうか?
ここだと fd = -1 のような…
# see also: http://bugs.debian.org/69063

Index: draw.c
===================================================================
RCS file: /var/cvs/debian/mgp/draw.c,v
retrieving revision 1.1.1.11
diff -u -u -r1.1.1.11 draw.c
--- draw.c	2001/02/14 05:09:41	1.1.1.11
+++ draw.c	2001/02/14 08:35:03
@@ -75,7 +75,7 @@
 #endif
 
 static void draw_string __P((struct render_state *, char *));
-static void draw_fragment __P((struct render_state *, u_char *, u_int, char *, int));
+static char *draw_fragment __P((struct render_state *, u_char *, u_int, char *, int));
 static int iskinsokuchar __P((u_int));
 static struct render_object *obj_alloc __P((struct render_state *state));
 static void obj_free __P((struct render_state *, struct render_object *));
@@ -1114,13 +1114,13 @@
 			}
 		}
 
-		draw_fragment(state, p, q - p, registry, charset16);
+		q = draw_fragment(state, p, q - p, registry, charset16);
 
 		p = q;
 	}
 }
 
-static void
+static char *
 draw_fragment(state, p, len, registry, charset16)
 	struct render_state *state;
 	u_char *p;
@@ -1285,6 +1285,10 @@
 		len -= (charset16 ? 2 : 1);
 
 		state->linewidth += HORIZ_STEP(char_size[caching], char_len);
+		/* ??? ukai */
+		if (state->linewidth + HORIZ_STEP(char_size[caching], char_len)
+		    > state->width)
+		    break;
 	}
 
 	if (state->width - state->leftfillpos / 2 < state->linewidth
@@ -1333,6 +1337,7 @@
 			draw_line_itemsize(state, tail->ascent, tail->descent);
 		}
 	}
+	return p;
 }
 
 static int
@@ -3655,7 +3660,7 @@
 	fprintf(fp, "(%s) run\n", epsfile);
 	fprintf(fp, "showpage\n");
 	fprintf(fp, "quit\n");
-	fsync(fd);
+	fflush(fp);	/* ??? was fsync(fd);, ukai */
 	fclose(fp);
 	signal(SIGPIPE, sigpipe_handler);
 

-- 
鵜飼文敏