On Tue, Jan 04, 2022 at 10:28:51PM +0100, Steinar H. Gunderson wrote: > I made a straw man to test whether this was really true, and it turns it is. > See the attached patch,
Now actually attached. /* Steinar */ -- Homepage: https://www.sesse.net/
--- man-db-2.9.4.orig/lib/sandbox.c +++ man-db-2.9.4/lib/sandbox.c @@ -52,6 +52,7 @@ #include <fcntl.h> #include <unistd.h> +#undef HAVE_LIBSECCOMP #ifdef HAVE_LIBSECCOMP # include <sys/ioctl.h> # include <sys/ipc.h> --- man-db-2.9.4.orig/src/lexgrog.c +++ man-db-2.9.4/src/lexgrog.c @@ -2,6 +2,8 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include "zlib.h" + #include "manconfig.h" /* Flex emits several functions which might reasonably have various @@ -13,7 +15,7 @@ #pragma GCC diagnostic ignored "-Wsuggest-attribute=pure" #pragma GCC diagnostic ignored "-Wunused-macros" -#line 17 "lexgrog.c" +#line 19 "lexgrog.c" #define YY_INT_ALIGNED short int @@ -2646,7 +2648,7 @@ int yy_flex_debug = 0; char *yytext; #line 1 "lexgrog.l" -#line 19 "lexgrog.l" +#line 21 "lexgrog.l" /* * lexgrog.l: extract 'whatis' info from nroff man / formatted cat pages. @@ -2861,22 +2863,25 @@ static char filters[MAX_FILTERS]; static int fill_mode; static int waiting_for_quote; -static pipeline *decomp; +//static pipeline *decomp; +const char *decomp, *decomp_end; #define YY_INPUT(buf,result,max_size) { \ size_t size = max_size; \ - const char *block = pipeline_read (decomp, &size); \ - if (block && size != 0) { \ - memcpy (buf, block, size); \ - buf[size] = '\0'; \ + if (max_size > decomp_end - decomp) { \ + size = decomp_end - decomp; \ + } \ + if (size > 0) { \ + memcpy (buf, decomp, size); \ + decomp += size; \ result = size; \ } else \ result = YY_NULL; \ } #define YY_NO_INPUT -#line 2878 "lexgrog.c" +#line 2883 "lexgrog.c" -#line 292 "lexgrog.l" +#line 297 "lexgrog.l" /* Please add to this list if you know how. */ /* Note that, since flex only supports UTF-8 by accident, character classes * including non-ASCII characters must be written out as (a|b|c|d) rather @@ -2884,7 +2889,7 @@ static pipeline *decomp; */ /* NOME also works for gl, pt */ /* eptgrv : eqn, pic, tbl, grap, refer, vgrind */ -#line 2888 "lexgrog.c" +#line 2893 "lexgrog.c" #define INITIAL 0 #define MAN_PRENAME 1 @@ -3116,11 +3121,11 @@ YY_DECL } { -#line 340 "lexgrog.l" +#line 345 "lexgrog.l" /* begin NAME section processing */ -#line 3124 "lexgrog.c" +#line 3129 "lexgrog.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -3176,42 +3181,42 @@ do_action: /* This label is used only to case 1: /* rule 1 can match eol */ YY_RULE_SETUP -#line 343 "lexgrog.l" +#line 348 "lexgrog.l" BEGIN (MAN_PRENAME); YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP -#line 344 "lexgrog.l" +#line 349 "lexgrog.l" BEGIN (CAT_NAME); YY_BREAK /* general text matching */ case 3: -#line 349 "lexgrog.l" +#line 354 "lexgrog.l" case 4: -#line 350 "lexgrog.l" +#line 355 "lexgrog.l" case 5: -#line 351 "lexgrog.l" +#line 356 "lexgrog.l" case 6: /* rule 6 can match eol */ YY_RULE_SETUP -#line 351 "lexgrog.l" +#line 356 "lexgrog.l" YY_BREAK case 7: -#line 356 "lexgrog.l" +#line 361 "lexgrog.l" case 8: -#line 357 "lexgrog.l" +#line 362 "lexgrog.l" case 9: /* rule 9 can match eol */ -#line 358 "lexgrog.l" +#line 363 "lexgrog.l" case 10: /* rule 10 can match eol */ YY_RULE_SETUP -#line 358 "lexgrog.l" +#line 363 "lexgrog.l" YY_BREAK @@ -3219,45 +3224,45 @@ YY_RULE_SETUP case 11: /* rule 11 can match eol */ YY_RULE_SETUP -#line 362 "lexgrog.l" +#line 367 "lexgrog.l" filters[TBL_FILTER] = 't'; YY_BREAK case 12: /* rule 12 can match eol */ YY_RULE_SETUP -#line 363 "lexgrog.l" +#line 368 "lexgrog.l" filters[EQN_FILTER] = 'e'; YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP -#line 364 "lexgrog.l" +#line 369 "lexgrog.l" filters[PIC_FILTER] = 'p'; YY_BREAK case 14: /* rule 14 can match eol */ YY_RULE_SETUP -#line 365 "lexgrog.l" +#line 370 "lexgrog.l" filters[GRAP_FILTER] = 'g'; YY_BREAK case 15: /* rule 15 can match eol */ -#line 367 "lexgrog.l" +#line 372 "lexgrog.l" case 16: /* rule 16 can match eol */ YY_RULE_SETUP -#line 367 "lexgrog.l" +#line 372 "lexgrog.l" filters[REF_FILTER] = 'r'; YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP -#line 368 "lexgrog.l" +#line 373 "lexgrog.l" filters[VGRIND_FILTER] = 'v'; YY_BREAK case YY_STATE_EOF(MAN_REST): -#line 370 "lexgrog.l" +#line 375 "lexgrog.l" { /* exit */ *p_name = '\0'; /* terminate the string */ yyterminate (); @@ -3266,14 +3271,14 @@ case YY_STATE_EOF(MAN_REST): case 18: /* rule 18 can match eol */ YY_RULE_SETUP -#line 374 "lexgrog.l" +#line 379 "lexgrog.l" YY_BREAK /* rules to end NAME section processing */ case 19: /* rule 19 can match eol */ YY_RULE_SETUP -#line 377 "lexgrog.l" +#line 382 "lexgrog.l" { /* forced exit */ *p_name = '\0'; /* terminate the string */ yyterminate (); @@ -3281,10 +3286,10 @@ YY_RULE_SETUP YY_BREAK case 20: /* rule 20 can match eol */ -#line 383 "lexgrog.l" +#line 388 "lexgrog.l" YY_RULE_SETUP case YY_STATE_EOF(MAN_PRENAME): -#line 383 "lexgrog.l" +#line 388 "lexgrog.l" { /* no NAME at all */ *p_name = '\0'; BEGIN (MAN_REST); @@ -3295,23 +3300,23 @@ case YY_STATE_EOF(MAN_PRENAME): case 21: /* rule 21 can match eol */ -#line 392 "lexgrog.l" +#line 397 "lexgrog.l" case 22: /* rule 22 can match eol */ -#line 393 "lexgrog.l" +#line 398 "lexgrog.l" case 23: /* rule 23 can match eol */ -#line 394 "lexgrog.l" +#line 399 "lexgrog.l" case 24: /* rule 24 can match eol */ -#line 395 "lexgrog.l" +#line 400 "lexgrog.l" case 25: /* rule 25 can match eol */ -#line 396 "lexgrog.l" +#line 401 "lexgrog.l" case 26: /* rule 26 can match eol */ YY_RULE_SETUP -#line 396 "lexgrog.l" +#line 401 "lexgrog.l" { yyless (0); BEGIN (MAN_NAME); @@ -3323,19 +3328,19 @@ YY_RULE_SETUP case 27: /* rule 27 can match eol */ YY_RULE_SETUP -#line 404 "lexgrog.l" +#line 409 "lexgrog.l" YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP -#line 406 "lexgrog.l" +#line 411 "lexgrog.l" yyless (1); YY_BREAK case 29: /* rule 29 can match eol */ YY_RULE_SETUP -#line 408 "lexgrog.l" +#line 413 "lexgrog.l" { yyless (0); BEGIN (MAN_NAME); @@ -3344,30 +3349,30 @@ YY_RULE_SETUP case 30: /* rule 30 can match eol */ -#line 415 "lexgrog.l" +#line 420 "lexgrog.l" case 31: /* rule 31 can match eol */ -#line 416 "lexgrog.l" +#line 421 "lexgrog.l" case 32: /* rule 32 can match eol */ -#line 417 "lexgrog.l" +#line 422 "lexgrog.l" case 33: /* rule 33 can match eol */ -#line 418 "lexgrog.l" +#line 423 "lexgrog.l" case 34: /* rule 34 can match eol */ -#line 419 "lexgrog.l" +#line 424 "lexgrog.l" case 35: /* rule 35 can match eol */ -#line 420 "lexgrog.l" +#line 425 "lexgrog.l" case 36: /* rule 36 can match eol */ -#line 421 "lexgrog.l" +#line 426 "lexgrog.l" YY_RULE_SETUP case YY_STATE_EOF(MAN_NAME): YY_RULE_SETUP case YY_STATE_EOF(MAN_DESC): -#line 421 "lexgrog.l" +#line 426 "lexgrog.l" { /* terminate the string */ *p_name = '\0'; BEGIN (MAN_REST); @@ -3377,14 +3382,14 @@ case YY_STATE_EOF(MAN_DESC): case 37: /* rule 37 can match eol */ -#line 429 "lexgrog.l" +#line 434 "lexgrog.l" case 38: /* rule 38 can match eol */ -#line 430 "lexgrog.l" +#line 435 "lexgrog.l" case 39: /* rule 39 can match eol */ YY_RULE_SETUP -#line 430 "lexgrog.l" +#line 435 "lexgrog.l" { /* terminate the string */ *p_name = '\0'; BEGIN (CAT_REST); @@ -3398,7 +3403,7 @@ YY_RULE_SETUP case 40: /* rule 40 can match eol */ YY_RULE_SETUP -#line 440 "lexgrog.l" +#line 445 "lexgrog.l" { newline_found (); waiting_for_quote = 1; @@ -3406,32 +3411,32 @@ YY_RULE_SETUP YY_BREAK case 41: /* rule 41 can match eol */ -#line 446 "lexgrog.l" +#line 451 "lexgrog.l" case 42: /* rule 42 can match eol */ -#line 447 "lexgrog.l" +#line 452 "lexgrog.l" case 43: /* rule 43 can match eol */ -#line 448 "lexgrog.l" +#line 453 "lexgrog.l" case 44: /* rule 44 can match eol */ -#line 449 "lexgrog.l" +#line 454 "lexgrog.l" case 45: /* rule 45 can match eol */ -#line 450 "lexgrog.l" +#line 455 "lexgrog.l" case 46: /* rule 46 can match eol */ -#line 451 "lexgrog.l" +#line 456 "lexgrog.l" case 47: /* rule 47 can match eol */ -#line 452 "lexgrog.l" +#line 457 "lexgrog.l" case 48: /* rule 48 can match eol */ -#line 453 "lexgrog.l" +#line 458 "lexgrog.l" case 49: /* rule 49 can match eol */ YY_RULE_SETUP -#line 453 "lexgrog.l" +#line 458 "lexgrog.l" { /* per line comments */ newline_found (); } @@ -3446,7 +3451,7 @@ YY_LINENO_REWIND_TO(yy_cp - 1); (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 460 "lexgrog.l" +#line 465 "lexgrog.l" newline_found (); YY_BREAK case 51: @@ -3456,7 +3461,7 @@ YY_LINENO_REWIND_TO(yy_cp - 1); (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 461 "lexgrog.l" +#line 466 "lexgrog.l" newline_found (); YY_BREAK @@ -3465,40 +3470,40 @@ newline_found (); case 52: /* rule 52 can match eol */ YY_RULE_SETUP -#line 466 "lexgrog.l" +#line 471 "lexgrog.l" fill_mode = 0; YY_BREAK case 53: /* rule 53 can match eol */ YY_RULE_SETUP -#line 467 "lexgrog.l" +#line 472 "lexgrog.l" fill_mode = 1; YY_BREAK case 54: /* rule 54 can match eol */ YY_RULE_SETUP -#line 470 "lexgrog.l" +#line 475 "lexgrog.l" /* strip continuations */ YY_BREAK /* convert to DASH */ case 55: /* rule 55 can match eol */ -#line 475 "lexgrog.l" +#line 480 "lexgrog.l" case 56: /* rule 56 can match eol */ -#line 476 "lexgrog.l" +#line 481 "lexgrog.l" case 57: /* rule 57 can match eol */ -#line 477 "lexgrog.l" +#line 482 "lexgrog.l" case 58: /* rule 58 can match eol */ -#line 478 "lexgrog.l" +#line 483 "lexgrog.l" case 59: /* rule 59 can match eol */ YY_RULE_SETUP -#line 478 "lexgrog.l" +#line 483 "lexgrog.l" { add_separator_to_whatis (); BEGIN (MAN_DESC); @@ -3508,7 +3513,7 @@ YY_RULE_SETUP case 60: /* rule 60 can match eol */ YY_RULE_SETUP -#line 483 "lexgrog.l" +#line 488 "lexgrog.l" add_separator_to_whatis (); YY_BREAK /* escape sequences and special characters */ @@ -3516,147 +3521,147 @@ add_separator_to_whatis (); case 61: /* rule 61 can match eol */ YY_RULE_SETUP -#line 487 "lexgrog.l" +#line 492 "lexgrog.l" add_char_to_whatis ('\\'); YY_BREAK case 62: /* rule 62 can match eol */ YY_RULE_SETUP -#line 488 "lexgrog.l" +#line 493 "lexgrog.l" add_char_to_whatis ('\''); YY_BREAK case 63: /* rule 63 can match eol */ YY_RULE_SETUP -#line 489 "lexgrog.l" +#line 494 "lexgrog.l" add_char_to_whatis ('`'); YY_BREAK case 64: /* rule 64 can match eol */ YY_RULE_SETUP -#line 490 "lexgrog.l" +#line 495 "lexgrog.l" add_char_to_whatis ('-'); YY_BREAK case 65: /* rule 65 can match eol */ YY_RULE_SETUP -#line 491 "lexgrog.l" +#line 496 "lexgrog.l" add_char_to_whatis ('-'); YY_BREAK case 66: /* rule 66 can match eol */ YY_RULE_SETUP -#line 492 "lexgrog.l" +#line 497 "lexgrog.l" add_char_to_whatis ('.'); YY_BREAK case 67: /* rule 67 can match eol */ YY_RULE_SETUP -#line 493 "lexgrog.l" +#line 498 "lexgrog.l" add_char_to_whatis (' '); YY_BREAK case 68: /* rule 68 can match eol */ YY_RULE_SETUP -#line 494 "lexgrog.l" +#line 499 "lexgrog.l" add_char_to_whatis ('_'); YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP -#line 495 "lexgrog.l" +#line 500 "lexgrog.l" add_char_to_whatis ('\t'); YY_BREAK case 70: /* rule 70 can match eol */ YY_RULE_SETUP -#line 497 "lexgrog.l" +#line 502 "lexgrog.l" /* various useless control chars */ YY_BREAK case 71: /* rule 71 can match eol */ YY_RULE_SETUP -#line 498 "lexgrog.l" +#line 503 "lexgrog.l" /* various inline functions */ YY_BREAK case 72: /* rule 72 can match eol */ YY_RULE_SETUP -#line 500 "lexgrog.l" +#line 505 "lexgrog.l" /* interpolate arg */ YY_BREAK /* roff named glyphs */ case 73: /* rule 73 can match eol */ YY_RULE_SETUP -#line 503 "lexgrog.l" +#line 508 "lexgrog.l" add_glyph_to_whatis (yytext + 2, 2); YY_BREAK /* perldoc strings */ case 74: /* rule 74 can match eol */ YY_RULE_SETUP -#line 505 "lexgrog.l" +#line 510 "lexgrog.l" add_perldoc_to_whatis (yytext + 3, 2); YY_BREAK case 75: /* rule 75 can match eol */ YY_RULE_SETUP -#line 506 "lexgrog.l" +#line 511 "lexgrog.l" add_perldoc_to_whatis (yytext + 2, 1); YY_BREAK case 76: /* rule 76 can match eol */ YY_RULE_SETUP -#line 508 "lexgrog.l" +#line 513 "lexgrog.l" /* comment */ YY_BREAK case 77: /* rule 77 can match eol */ YY_RULE_SETUP -#line 510 "lexgrog.l" +#line 515 "lexgrog.l" /* font changes */ YY_BREAK case 78: /* rule 78 can match eol */ YY_RULE_SETUP -#line 511 "lexgrog.l" +#line 516 "lexgrog.l" /* mark input place in register */ YY_BREAK case 79: /* rule 79 can match eol */ YY_RULE_SETUP -#line 513 "lexgrog.l" +#line 518 "lexgrog.l" /* interpolate number register */ YY_BREAK case 80: /* rule 80 can match eol */ YY_RULE_SETUP -#line 514 "lexgrog.l" +#line 519 "lexgrog.l" /* overstrike chars */ YY_BREAK case 81: /* rule 81 can match eol */ YY_RULE_SETUP -#line 516 "lexgrog.l" +#line 521 "lexgrog.l" /* size changes */ YY_BREAK case 82: /* rule 82 can match eol */ YY_RULE_SETUP -#line 517 "lexgrog.l" +#line 522 "lexgrog.l" /* width of string */ YY_BREAK case 83: /* rule 83 can match eol */ YY_RULE_SETUP -#line 519 "lexgrog.l" +#line 524 "lexgrog.l" /* catch all */ YY_BREAK case 84: /* rule 84 can match eol */ YY_RULE_SETUP -#line 521 "lexgrog.l" +#line 526 "lexgrog.l" /* function() in hpux */ YY_BREAK @@ -3667,49 +3672,49 @@ YY_RULE_SETUP case 85: /* rule 85 can match eol */ YY_RULE_SETUP -#line 528 "lexgrog.l" +#line 533 "lexgrog.l" BEGIN (MAN_DESC_AT); YY_BREAK case 86: /* rule 86 can match eol */ YY_RULE_SETUP -#line 529 "lexgrog.l" +#line 534 "lexgrog.l" BEGIN (MAN_DESC_BSX); YY_BREAK case 87: /* rule 87 can match eol */ YY_RULE_SETUP -#line 530 "lexgrog.l" +#line 535 "lexgrog.l" BEGIN (MAN_DESC_BX); YY_BREAK case 88: /* rule 88 can match eol */ YY_RULE_SETUP -#line 531 "lexgrog.l" +#line 536 "lexgrog.l" BEGIN (MAN_DESC_FX); YY_BREAK case 89: /* rule 89 can match eol */ YY_RULE_SETUP -#line 532 "lexgrog.l" +#line 537 "lexgrog.l" BEGIN (MAN_DESC_NX); YY_BREAK case 90: /* rule 90 can match eol */ YY_RULE_SETUP -#line 533 "lexgrog.l" +#line 538 "lexgrog.l" BEGIN (MAN_DESC_OX); YY_BREAK case 91: /* rule 91 can match eol */ YY_RULE_SETUP -#line 534 "lexgrog.l" +#line 539 "lexgrog.l" add_word_to_whatis ("UNIX"); YY_BREAK case 92: /* rule 92 can match eol */ YY_RULE_SETUP -#line 536 "lexgrog.l" +#line 541 "lexgrog.l" { add_word_to_whatis ("\""); BEGIN (MAN_DESC_DQ); @@ -3719,73 +3724,73 @@ YY_RULE_SETUP case 93: YY_RULE_SETUP -#line 543 "lexgrog.l" +#line 548 "lexgrog.l" mdoc_text ("Version 32V AT&T UNIX"); YY_BREAK case 94: YY_RULE_SETUP -#line 544 "lexgrog.l" +#line 549 "lexgrog.l" mdoc_text ("Version 1 AT&T UNIX"); YY_BREAK case 95: YY_RULE_SETUP -#line 545 "lexgrog.l" +#line 550 "lexgrog.l" mdoc_text ("Version 2 AT&T UNIX"); YY_BREAK case 96: YY_RULE_SETUP -#line 546 "lexgrog.l" +#line 551 "lexgrog.l" mdoc_text ("Version 3 AT&T UNIX"); YY_BREAK case 97: YY_RULE_SETUP -#line 547 "lexgrog.l" +#line 552 "lexgrog.l" mdoc_text ("Version 4 AT&T UNIX"); YY_BREAK case 98: YY_RULE_SETUP -#line 548 "lexgrog.l" +#line 553 "lexgrog.l" mdoc_text ("Version 5 AT&T UNIX"); YY_BREAK case 99: YY_RULE_SETUP -#line 549 "lexgrog.l" +#line 554 "lexgrog.l" mdoc_text ("Version 6 AT&T UNIX"); YY_BREAK case 100: YY_RULE_SETUP -#line 550 "lexgrog.l" +#line 555 "lexgrog.l" mdoc_text ("Version 7 AT&T UNIX"); YY_BREAK case 101: YY_RULE_SETUP -#line 551 "lexgrog.l" +#line 556 "lexgrog.l" mdoc_text ("AT&T System V UNIX"); YY_BREAK case 102: YY_RULE_SETUP -#line 552 "lexgrog.l" +#line 557 "lexgrog.l" mdoc_text ("AT&T System V.1 UNIX"); YY_BREAK case 103: YY_RULE_SETUP -#line 553 "lexgrog.l" +#line 558 "lexgrog.l" mdoc_text ("AT&T System V.2 UNIX"); YY_BREAK case 104: YY_RULE_SETUP -#line 554 "lexgrog.l" +#line 559 "lexgrog.l" mdoc_text ("AT&T System V.3 UNIX"); YY_BREAK case 105: YY_RULE_SETUP -#line 555 "lexgrog.l" +#line 560 "lexgrog.l" mdoc_text ("AT&T System V.4 UNIX"); YY_BREAK case 106: /* rule 106 can match eol */ YY_RULE_SETUP -#line 556 "lexgrog.l" +#line 561 "lexgrog.l" { yyless (0); mdoc_text ("AT&T UNIX"); @@ -3795,7 +3800,7 @@ YY_RULE_SETUP case 107: YY_RULE_SETUP -#line 563 "lexgrog.l" +#line 568 "lexgrog.l" { add_word_to_whatis ("BSD/OS"); add_wordn_to_whatis (yytext, yyleng); @@ -3805,7 +3810,7 @@ YY_RULE_SETUP case 108: /* rule 108 can match eol */ YY_RULE_SETUP -#line 568 "lexgrog.l" +#line 573 "lexgrog.l" { yyless (0); mdoc_text ("BSD/OS"); @@ -3815,22 +3820,22 @@ YY_RULE_SETUP case 109: YY_RULE_SETUP -#line 575 "lexgrog.l" +#line 580 "lexgrog.l" mdoc_text ("BSD (currently in alpha test)"); YY_BREAK case 110: YY_RULE_SETUP -#line 576 "lexgrog.l" +#line 581 "lexgrog.l" mdoc_text ("BSD (currently in beta test)"); YY_BREAK case 111: YY_RULE_SETUP -#line 577 "lexgrog.l" +#line 582 "lexgrog.l" mdoc_text ("BSD (currently under development"); YY_BREAK case 112: YY_RULE_SETUP -#line 578 "lexgrog.l" +#line 583 "lexgrog.l" { add_wordn_to_whatis (yytext, yyleng); add_str_to_whatis ("BSD", 3); @@ -3840,7 +3845,7 @@ YY_RULE_SETUP case 113: /* rule 113 can match eol */ YY_RULE_SETUP -#line 583 "lexgrog.l" +#line 588 "lexgrog.l" { yyless (0); mdoc_text ("BSD"); @@ -3850,7 +3855,7 @@ YY_RULE_SETUP case 114: YY_RULE_SETUP -#line 590 "lexgrog.l" +#line 595 "lexgrog.l" { add_str_to_whatis ("-Reno", 5); BEGIN (MAN_DESC); @@ -3858,7 +3863,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 594 "lexgrog.l" +#line 599 "lexgrog.l" { add_str_to_whatis ("-Tahoe", 6); BEGIN (MAN_DESC); @@ -3866,7 +3871,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 598 "lexgrog.l" +#line 603 "lexgrog.l" { add_str_to_whatis ("-Lite", 5); BEGIN (MAN_DESC); @@ -3874,7 +3879,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 602 "lexgrog.l" +#line 607 "lexgrog.l" { add_str_to_whatis ("-Lite2", 6); BEGIN (MAN_DESC); @@ -3883,7 +3888,7 @@ YY_RULE_SETUP case 118: /* rule 118 can match eol */ YY_RULE_SETUP -#line 606 "lexgrog.l" +#line 611 "lexgrog.l" { yyless (0); BEGIN (MAN_DESC); @@ -3892,7 +3897,7 @@ YY_RULE_SETUP case 119: YY_RULE_SETUP -#line 612 "lexgrog.l" +#line 617 "lexgrog.l" { add_str_to_whatis (yytext, yyleng); add_char_to_whatis ('"'); @@ -3902,7 +3907,7 @@ YY_RULE_SETUP case 120: YY_RULE_SETUP -#line 619 "lexgrog.l" +#line 624 "lexgrog.l" { add_word_to_whatis ("FreeBSD"); add_wordn_to_whatis (yytext, yyleng); @@ -3912,7 +3917,7 @@ YY_RULE_SETUP case 121: /* rule 121 can match eol */ YY_RULE_SETUP -#line 624 "lexgrog.l" +#line 629 "lexgrog.l" { yyless (0); mdoc_text ("FreeBSD"); @@ -3922,7 +3927,7 @@ YY_RULE_SETUP case 122: YY_RULE_SETUP -#line 631 "lexgrog.l" +#line 636 "lexgrog.l" { add_word_to_whatis ("NetBSD"); add_wordn_to_whatis (yytext, yyleng); @@ -3932,7 +3937,7 @@ YY_RULE_SETUP case 123: /* rule 123 can match eol */ YY_RULE_SETUP -#line 636 "lexgrog.l" +#line 641 "lexgrog.l" { yyless (0); mdoc_text ("NetBSD"); @@ -3942,7 +3947,7 @@ YY_RULE_SETUP case 124: YY_RULE_SETUP -#line 643 "lexgrog.l" +#line 648 "lexgrog.l" { add_word_to_whatis ("OpenBSD"); add_wordn_to_whatis (yytext, yyleng); @@ -3952,7 +3957,7 @@ YY_RULE_SETUP case 125: /* rule 125 can match eol */ YY_RULE_SETUP -#line 648 "lexgrog.l" +#line 653 "lexgrog.l" { yyless (0); mdoc_text ("OpenBSD"); @@ -3963,7 +3968,7 @@ YY_RULE_SETUP case 126: /* rule 126 can match eol */ YY_RULE_SETUP -#line 655 "lexgrog.l" +#line 660 "lexgrog.l" add_char_to_whatis (' '); YY_BREAK /* a ROFF break request, a paragraph request, or an indentation change @@ -3972,29 +3977,29 @@ add_char_to_whatis (' '); case 127: /* rule 127 can match eol */ -#line 662 "lexgrog.l" +#line 667 "lexgrog.l" case 128: /* rule 128 can match eol */ -#line 663 "lexgrog.l" +#line 668 "lexgrog.l" case 129: /* rule 129 can match eol */ -#line 664 "lexgrog.l" +#line 669 "lexgrog.l" case 130: /* rule 130 can match eol */ -#line 665 "lexgrog.l" +#line 670 "lexgrog.l" case 131: /* rule 131 can match eol */ -#line 666 "lexgrog.l" +#line 671 "lexgrog.l" case 132: /* rule 132 can match eol */ -#line 667 "lexgrog.l" +#line 672 "lexgrog.l" case 133: /* rule 133 can match eol */ -#line 668 "lexgrog.l" +#line 673 "lexgrog.l" case 134: /* rule 134 can match eol */ YY_RULE_SETUP -#line 668 "lexgrog.l" +#line 673 "lexgrog.l" { add_char_to_whatis ((char) 0x11); BEGIN (MAN_NAME); @@ -4005,7 +4010,7 @@ YY_RULE_SETUP case 135: /* rule 135 can match eol */ YY_RULE_SETUP -#line 675 "lexgrog.l" +#line 680 "lexgrog.l" { *p_name = '\0'; BEGIN (MAN_REST); @@ -4014,23 +4019,23 @@ YY_RULE_SETUP /* pass words as a chunk. speed optimization */ case 136: YY_RULE_SETUP -#line 681 "lexgrog.l" +#line 686 "lexgrog.l" add_str_to_whatis (yytext, yyleng); YY_BREAK /* normalise the comma (,) separators */ case 137: /* rule 137 can match eol */ -#line 685 "lexgrog.l" +#line 690 "lexgrog.l" case 138: /* rule 138 can match eol */ YY_RULE_SETUP -#line 685 "lexgrog.l" +#line 690 "lexgrog.l" add_str_to_whatis (", ", 2); YY_BREAK case 139: /* rule 139 can match eol */ YY_RULE_SETUP -#line 687 "lexgrog.l" +#line 692 "lexgrog.l" { newline_found (); add_char_to_whatis (yytext[yyleng - 1]); @@ -4038,7 +4043,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 692 "lexgrog.l" +#line 697 "lexgrog.l" add_char_to_whatis (*yytext); YY_BREAK /* default EOF rule */ @@ -4056,15 +4061,15 @@ case YY_STATE_EOF(CAT_FILE): case YY_STATE_EOF(MAN_FILE): case YY_STATE_EOF(CAT_REST): case YY_STATE_EOF(FORCE_EXIT): -#line 695 "lexgrog.l" +#line 700 "lexgrog.l" return 1; YY_BREAK case 141: YY_RULE_SETUP -#line 697 "lexgrog.l" +#line 702 "lexgrog.l" ECHO; YY_BREAK -#line 4068 "lexgrog.c" +#line 4073 "lexgrog.c" case YY_END_OF_BUFFER: { @@ -5031,7 +5036,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 697 "lexgrog.l" +#line 702 "lexgrog.l" /* print warning and force scanner to terminate */ @@ -5169,6 +5174,8 @@ static void newline_found (void) waiting_for_quote = 0; } +char tmpbuf[1048576]; + int find_name (const char *file, const char *filename, lexgrog *p_lg, const char *encoding) { @@ -5176,6 +5183,33 @@ int find_name (const char *file, const c pipeline *p; char *page_encoding = NULL; +#if 1 + gzFile fp = gzopen(file, "r"); + if (fp == NULL) { + error (0, errno, "%s", file); + return 0; + } + + int num_bytes = gzread(fp, tmpbuf, sizeof(tmpbuf)); + gzclose(fp); + if (num_bytes < 0) { + return 0; + } + + decomp = tmpbuf; + decomp_end = tmpbuf + num_bytes; + + // TODO: encoding + // if (!page_encoding && encoding) + // page_encoding = xstrdup (encoding); + // if (page_encoding) + // add_manconv (p, page_encoding, "UTF-8"); + + ret = find_name_decompressed (p, filename, p_lg); + + + return ret; +#else if (strcmp (file, "-") == 0) { p = decompress_fdopen (dup (STDIN_FILENO)); } else { @@ -5224,14 +5258,13 @@ int find_name (const char *file, const c ret = find_name_decompressed (p, filename, p_lg); pipeline_free (p); return ret; +#endif } int find_name_decompressed (pipeline *p, const char *filename, lexgrog *p_lg) { int ret; - decomp = p; - fname = filename; *(p_name = newname) = '\0'; memset (filters, '_', sizeof (filters)); @@ -5244,15 +5277,9 @@ int find_name_decompressed (pipeline *p, else BEGIN (MAN_FILE); - drop_effective_privs (); - yyrestart (NULL); ret = yylex (); - regain_effective_privs (); - - pipeline_wait (decomp); - if (ret) return 0; else { --- man-db-2.9.4.orig/src/lexgrog.l +++ man-db-2.9.4/src/lexgrog.l @@ -3,6 +3,8 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include "zlib.h" + #include "manconfig.h" /* Flex emits several functions which might reasonably have various @@ -230,14 +232,17 @@ static char filters[MAX_FILTERS]; static int fill_mode; static int waiting_for_quote; -static pipeline *decomp; +//static pipeline *decomp; +const char *decomp, *decomp_end; #define YY_INPUT(buf,result,max_size) { \ size_t size = max_size; \ - const char *block = pipeline_read (decomp, &size); \ - if (block && size != 0) { \ - memcpy (buf, block, size); \ - buf[size] = '\0'; \ + if (max_size > decomp_end - decomp) { \ + size = decomp_end - decomp; \ + } \ + if (size > 0) { \ + memcpy (buf, decomp, size); \ + decomp += size; \ result = size; \ } else \ result = YY_NULL; \ @@ -830,6 +835,8 @@ static void newline_found (void) waiting_for_quote = 0; } +char tmpbuf[1048576]; + int find_name (const char *file, const char *filename, lexgrog *p_lg, const char *encoding) { @@ -837,6 +844,33 @@ int find_name (const char *file, const c pipeline *p; char *page_encoding = NULL; +#if 1 + gzFile fp = gzopen(file, "r"); + if (fp == NULL) { + error (0, errno, "%s", file); + return 0; + } + + int num_bytes = gzread(fp, tmpbuf, sizeof(tmpbuf)); + gzclose(fp); + if (num_bytes < 0) { + return 0; + } + + decomp = tmpbuf; + decomp_end = tmpbuf + num_bytes; + + // TODO: encoding + // if (!page_encoding && encoding) + // page_encoding = xstrdup (encoding); + // if (page_encoding) + // add_manconv (p, page_encoding, "UTF-8"); + + ret = find_name_decompressed (p, filename, p_lg); + + + return ret; +#else if (strcmp (file, "-") == 0) { p = decompress_fdopen (dup (STDIN_FILENO)); } else { @@ -885,14 +919,13 @@ int find_name (const char *file, const c ret = find_name_decompressed (p, filename, p_lg); pipeline_free (p); return ret; +#endif } int find_name_decompressed (pipeline *p, const char *filename, lexgrog *p_lg) { int ret; - decomp = p; - fname = filename; *(p_name = newname) = '\0'; memset (filters, '_', sizeof (filters)); @@ -905,15 +938,9 @@ int find_name_decompressed (pipeline *p, else BEGIN (MAN_FILE); - drop_effective_privs (); - yyrestart (NULL); ret = yylex (); - regain_effective_privs (); - - pipeline_wait (decomp); - if (ret) return 0; else { --- man-db-2.9.4.orig/src/ult_src.c +++ man-db-2.9.4/src/ult_src.c @@ -42,6 +42,7 @@ #include <assert.h> #include <dirent.h> #include <unistd.h> +#include <zlib.h> #include "canonicalize.h" #include "dirname.h" @@ -327,19 +328,31 @@ const char *ult_src (const char *name, c * decompress_open doesn't keep its own copy. */ decomp_base = xstrdup (base); - decomp = decompress_open (decomp_base); - if (!decomp) { + + char tmpbuf[4096]; + gzFile fp = gzopen(decomp_base, "r"); + if (fp == NULL) { if (quiet < 2) error (0, errno, _("can't open %s"), base); free (decomp_base); return NULL; } - pipeline_start (decomp); + + int num_bytes = gzread(fp, tmpbuf, sizeof(tmpbuf)); + gzclose(fp); + if (num_bytes < 0) { + // FIXME: throw an error + return NULL; + } + + FILE *memfp = fmemopen(tmpbuf, num_bytes, "r"); /* make sure that we skip over any comments */ + char linebuf[4096]; do { - buffer = pipeline_readline (decomp); + buffer = fgets(linebuf, sizeof(linebuf), memfp); } while (buffer && STRNEQ (buffer, ".\\\"", 3)); + fclose(memfp); include = test_for_include (buffer); if (include) { @@ -361,14 +374,10 @@ const char *ult_src (const char *name, c free (new_name); recurse--; - pipeline_wait (decomp); - pipeline_free (decomp); free (decomp_base); return ult; } - pipeline_wait (decomp); - pipeline_free (decomp); free (decomp_base); }