--- /dev/null
+diff -Nur xfig.3.2.3c.orig/f_read.c xfig.3.2.3c/f_read.c
+--- xfig.3.2.3c/f_read.c.orig Mon Jul 3 23:36:56 2000
++++ xfig.3.2.3c/f_read.c Thu Nov 9 18:12:53 2000
+@@ -73,8 +73,6 @@
+
+ /* max number of comments that can be stored with each object */
+ #define MAXCOMMENTS 50
+-/* max length of any comment */
+-#define MAXCOMMLEN 200
+ /* input buffer length */
+ #define BUF_SIZE 1024
+
+@@ -455,12 +453,11 @@
+ if (num_object) {
+ file_msg("Color definitions must come before other objects (line %d).",
+ line_no);
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
+ }
+ break;
+ case O_POLYLINE:
+ if ((l = read_lineobject(fp)) == NULL)
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
++ continue;
+ if (ll)
+ ll = (ll->next = l);
+ else
+@@ -469,7 +466,7 @@
+ break;
+ case O_SPLINE:
+ if ((s = read_splineobject(fp)) == NULL)
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
++ continue;
+ if (ls)
+ ls = (ls->next = s);
+ else
+@@ -478,7 +475,7 @@
+ break;
+ case O_ELLIPSE:
+ if ((e = read_ellipseobject()) == NULL)
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
++ continue;
+ if (le)
+ le = (le->next = e);
+ else
+@@ -487,7 +484,7 @@
+ break;
+ case O_ARC:
+ if ((a = read_arcobject(fp)) == NULL)
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
++ continue;
+ if (la)
+ la = (la->next = a);
+ else
+@@ -496,7 +493,7 @@
+ break;
+ case O_TEXT:
+ if ((t = read_textobject(fp)) == NULL)
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
++ continue;
+ if (lt)
+ lt = (lt->next = t);
+ else
+@@ -505,7 +502,7 @@
+ break;
+ case O_COMPOUND:
+ if ((c = read_compoundobject(fp)) == NULL)
+- return (num_object != 0? 0: BAD_FORMAT); /* ok if any objects have been read */
++ continue;
+ if (lc)
+ lc = (lc->next = c);
+ else
+@@ -625,13 +622,15 @@
+ check_color(&a->fill_color);
+ fix_fillstyle(a); /* make sure that black/white have legal fill styles */
+
++ a->comments = attach_comments(); /* attach any comments */
++
+ /* forward arrow */
+ if (fa) {
+ if (read_line(fp) == -1)
+- return NULL;
++ return a;
+ if (sscanf(buf, "%d%d%f%f%f", &type, &style, &thickness, &wd, &ht) != 5) {
+ file_msg(Err_incomp, "arc", line_no);
+- return NULL;
++ return a;
+ }
+ /* throw away any arrow heads on pie-wedge arcs */
+ if (a->type == T_OPEN_ARC) {
+@@ -643,10 +642,10 @@
+ /* backward arrow */
+ if (ba) {
+ if (read_line(fp) == -1)
+- return NULL;
++ return a;
+ if (sscanf(buf, "%d%d%f%f%f", &type, &style, &thickness, &wd, &ht) != 5) {
+ file_msg(Err_incomp, "arc", line_no);
+- return NULL;
++ return a;
+ }
+ /* throw away any arrow heads on pie-wedge arcs */
+ if (a->type == T_OPEN_ARC) {
+@@ -654,7 +653,6 @@
+ a->back_arrow = new_arrow(type, style, thickness, wd, ht);
+ }
+ }
+- a->comments = attach_comments(); /* attach any comments */
+ return a;
+ }
+
+@@ -693,65 +691,53 @@
+ while (read_line(fp) > 0) {
+ if (sscanf(buf, "%d", &object) != 1) {
+ file_msg(Err_incomp, "compound", line_no);
+- free_compound(&com);
++ free((char *) com);
+ return NULL;
+ }
+ switch (object) {
+ case O_POLYLINE:
+- if ((l = read_lineobject(fp)) == NULL) {
+- free_line(&l);
+- return NULL;
+- }
++ if ((l = read_lineobject(fp)) == NULL)
++ continue;
+ if (ll)
+ ll = (ll->next = l);
+ else
+ ll = com->lines = l;
+ break;
+ case O_SPLINE:
+- if ((s = read_splineobject(fp)) == NULL) {
+- free_spline(&s);
+- return NULL;
+- }
++ if ((s = read_splineobject(fp)) == NULL)
++ continue;
+ if (ls)
+ ls = (ls->next = s);
+ else
+ ls = com->splines = s;
+ break;
+ case O_ELLIPSE:
+- if ((e = read_ellipseobject()) == NULL) {
+- free_ellipse(&e);
+- return NULL;
+- }
++ if ((e = read_ellipseobject()) == NULL)
++ continue;
+ if (le)
+ le = (le->next = e);
+ else
+ le = com->ellipses = e;
+ break;
+ case O_ARC:
+- if ((a = read_arcobject(fp)) == NULL) {
+- free_arc(&a);
+- return NULL;
+- }
++ if ((a = read_arcobject(fp)) == NULL)
++ continue;
+ if (la)
+ la = (la->next = a);
+ else
+ la = com->arcs = a;
+ break;
+ case O_TEXT:
+- if ((t = read_textobject(fp)) == NULL) {
+- free_text(&t);
+- return NULL;
+- }
++ if ((t = read_textobject(fp)) == NULL)
++ continue;
+ if (lt)
+ lt = (lt->next = t);
+ else
+ lt = com->texts = t;
+ break;
+ case O_COMPOUND:
+- if ((c = read_compoundobject(fp)) == NULL) {
+- free_compound(&c);
+- return NULL;
+- }
++ if ((c = read_compoundobject(fp)) == NULL)
++ continue;
+ if (lc)
+ lc = (lc->next = c);
+ else
+@@ -761,9 +747,10 @@
+ return com;
+ default:
+ file_msg("Incorrect object code at line %d.", line_no);
+- return NULL;
++ continue;
+ } /* switch */
+- }
++ } /* while (read_line(fp) > 0) */
++
+ if (feof(fp))
+ return com;
+ else
+@@ -902,14 +889,17 @@
+ if (l->type == T_PICTURE) {
+ char s1[PATH_MAX];
+
+- if (read_line(fp) == -1)
++ if (read_line(fp) == -1) {
++ free((char *) l);
+ return NULL;
++ }
+ if ((l->pic = create_pic()) == NULL) {
+ free((char *) l);
+ return NULL;
+ }
+ if (sscanf(buf, "%d %s", &l->pic->flipped, s1) != 2) {
+ file_msg(Err_incomp, "Picture Object", line_no);
++ free((char *) l);
+ return NULL;
+ }
+ /* if path is relative, convert it to absolute path */
+@@ -928,8 +918,10 @@
+ } else
+ l->pic = NULL;
+
+- if ((p = create_point()) == NULL)
++ if ((p = create_point()) == NULL) {
++ free((char *) l);
+ return NULL;
++ }
+
+ l->points = p;
+ p->next = NULL;
+@@ -1117,6 +1109,7 @@
+ count_lines_correctly(fp);
+ if (fscanf(fp, "%f%f%f%f", &lx, &ly, &rx, &ry) != 4) {
+ file_msg(Err_incomp, "spline", line_no);
++ free_splinestorage(s);
+ return NULL;
+ }
+ }
+@@ -1336,6 +1329,7 @@
+ /* allow exactly 3 digits following the \ for the octal value */
+ if (sscanf(&s[l+1],"%3o",&num)!=1) {
+ file_msg("Error in parsing text string on line.",line_no);
++ free((char *) t);
+ return NULL;
+ }
+ buf[n++]= (unsigned char) num; /* put char in */
+@@ -1357,10 +1351,9 @@
+ t->type = T_LEFT_JUSTIFIED;
+ }
+
+- if (strlen(s) <= 1)
+- {
++ if (strlen(s) <= 1) {
+ s[0]=' ';s[1]=0;
+- }
++ }
+ /* skip first blank from input file by starting at s[1] */
+ if ((t->cstring = new_string(strlen(&s[1]))) == NULL) {
+ free((char *) t);
+@@ -1457,11 +1450,12 @@
+ {
+ int i;
+
++ i=strlen(buf);
+ /* see if we've allocated space for this comment */
+- if (comments[numcom] == 0)
+- if ((comments[numcom] = (char*) new_string(MAXCOMMLEN)) == NULL)
++ if (comments[numcom])
++ free(comments[numcom]);
++ if ((comments[numcom] = (char*) new_string(i+1)) == NULL)
+ return -1;
+- i=strlen(buf);
+ /* remove any newline */
+ if (buf[i-1] == '\n')
+ buf[i-1] = '\0';