[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[mgp-users-jp 00798] too long line will segfault
- To: mgp-users-jp@mew.org
- Subject: [mgp-users-jp 00798] too long line will segfault
- From: Fumitoshi UKAI <ukai@debian.or.jp>
- Date: Wed, 14 Feb 2001 18:42:31 +0900
- Organization: Debian JP Project
- Posted: Wed, 14 Feb 2001 18:43:32 +0900
- Reply-to: mgp-users-jp@mew.org
- User-agent: Wanderlust/2.4.0 (Rio) SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.3 Emacs/20.7 (i386-debian-linux-gnu) MULE/4.0 (HANANOEN)
すごく長いアルファベットだけの行を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);
--
鵜飼文敏