-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mdocml: fix hang when rendering stress-ng(1)
- Loading branch information
1 parent
f4491a3
commit 5c8af5e
Showing
2 changed files
with
76 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
fixes hang from rendering stress-ng(1) | ||
|
||
from https://inbox.vuxu.org/mandoc-discuss/ZIIbRuk+yJtoAJhv@asta-kit.de/ | ||
|
||
=================================================================== | ||
RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/out.c,v | ||
retrieving revision 1.54 | ||
retrieving revision 1.55 | ||
diff -u -r1.54 -r1.55 | ||
--- a/out.c 2021/09/07 17:05:30 1.54 | ||
+++ b/out.c 2021/09/28 17:06:17 1.55 | ||
@@ -121,6 +121,7 @@ | ||
const struct tbl_dat *dp; | ||
struct roffcol *col; | ||
struct tbl_colgroup *first_group, **gp, *g; | ||
+ size_t *colwidth; | ||
size_t ewidth, min1, min2, wanted, width, xwidth; | ||
int done, icol, maxcol, necol, nxcol, quirkcol; | ||
|
||
@@ -254,16 +255,28 @@ | ||
gp = &(*gp)->next; | ||
} | ||
|
||
+ colwidth = mandoc_reallocarray(NULL, maxcol + 1, sizeof(*colwidth)); | ||
while (first_group != NULL) { | ||
|
||
/* | ||
+ * Rebuild the array of the widths of all columns | ||
+ * participating in spans that require expansion. | ||
+ */ | ||
+ | ||
+ for (icol = 0; icol <= maxcol; icol++) | ||
+ colwidth[icol] = SIZE_MAX; | ||
+ for (g = first_group; g != NULL; g = g->next) | ||
+ for (icol = g->startcol; icol <= g->endcol; icol++) | ||
+ colwidth[icol] = tbl->cols[icol].width; | ||
+ | ||
+ /* | ||
* Find the smallest and second smallest column width | ||
* among the columns which may need expamsion. | ||
*/ | ||
|
||
min1 = min2 = SIZE_MAX; | ||
for (icol = 0; icol <= maxcol; icol++) { | ||
- width = tbl->cols[icol].width; | ||
+ width = colwidth[icol]; | ||
if (min1 > width) { | ||
min2 = min1; | ||
min1 = width; | ||
@@ -281,7 +294,7 @@ | ||
for (g = first_group; g != NULL; g = g->next) { | ||
necol = 0; | ||
for (icol = g->startcol; icol <= g->endcol; icol++) | ||
- if (tbl->cols[icol].width == min1) | ||
+ if (colwidth[icol] == min1) | ||
necol++; | ||
if (necol == 0) | ||
continue; | ||
@@ -298,7 +311,7 @@ | ||
while ((g = *gp) != NULL) { | ||
done = 0; | ||
for (icol = g->startcol; icol <= g->endcol; icol++) { | ||
- if (tbl->cols[icol].width != min1) | ||
+ if (colwidth[icol] != min1) | ||
continue; | ||
if (g->wanted <= wanted - min1) { | ||
tbl->cols[icol].width += g->wanted; | ||
@@ -315,6 +328,7 @@ | ||
gp = &(*gp)->next; | ||
} | ||
} | ||
+ free(colwidth); | ||
|
||
/* | ||
* Align numbers with text. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters