From 59655077c5bf176f01d8d277665ebb92263704ed Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Mar 2012 16:23:50 +0100 Subject: preparatory cleanups for seamless uncompression improvements unpack_gz_stream_with_info: fix buggy error check man: fix possible accesses past the end of a string move seamless uncompression helpers from read_printf.c to open_transformer.c function old new delta show_manpage 153 212 +59 unpack_gz_stream_with_info 520 539 +19 Signed-off-by: Denys Vlasenko --- miscutils/man.c | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) (limited to 'miscutils') diff --git a/miscutils/man.c b/miscutils/man.c index 3bf7e84b6..611466349 100644 --- a/miscutils/man.c +++ b/miscutils/man.c @@ -30,16 +30,6 @@ echo ".pl \n(nlu+10" */ -#if ENABLE_FEATURE_SEAMLESS_LZMA -#define Z_SUFFIX ".lzma" -#elif ENABLE_FEATURE_SEAMLESS_BZ2 -#define Z_SUFFIX ".bz2" -#elif ENABLE_FEATURE_SEAMLESS_GZ -#define Z_SUFFIX ".gz" -#else -#define Z_SUFFIX "" -#endif - static int show_manpage(const char *pager, char *man_filename, int man, int level); static int run_pipe(const char *pager, char *man_filename, int man, int level) @@ -102,7 +92,7 @@ static int run_pipe(const char *pager, char *man_filename, int man, int level) /* Links do not have .gz extensions, even if manpage * is compressed */ - man_filename = xasprintf("%s/%s" Z_SUFFIX, man_filename, linkname); + man_filename = xasprintf("%s/%s", man_filename, linkname); free(line); /* Note: we leak "new" man_filename string as well... */ if (show_manpage(pager, man_filename, man, level + 1)) @@ -124,32 +114,37 @@ static int run_pipe(const char *pager, char *man_filename, int man, int level) return 1; } -/* man_filename is of the form "/dir/dir/dir/name.s" Z_SUFFIX */ +/* man_filename is of the form "/dir/dir/dir/name.s" */ static int show_manpage(const char *pager, char *man_filename, int man, int level) { +#if SEAMLESS_COMPRESSION + /* We leak this allocation... */ + char *filename_with_zext = xasprintf("%s.lzma", man_filename); + char *ext = strrchr(filename_with_zext, '.') + 1; +#endif + #if ENABLE_FEATURE_SEAMLESS_LZMA + if (run_pipe(pager, filename_with_zext, man, level)) + return 1; +#endif +#if ENABLE_FEATURE_SEAMLESS_XZ + strcpy(ext, "xz"); if (run_pipe(pager, man_filename, man, level)) return 1; #endif - #if ENABLE_FEATURE_SEAMLESS_BZ2 -#if ENABLE_FEATURE_SEAMLESS_LZMA - strcpy(strrchr(man_filename, '.') + 1, "bz2"); -#endif + strcpy(ext, "bz2"); if (run_pipe(pager, man_filename, man, level)) return 1; #endif - #if ENABLE_FEATURE_SEAMLESS_GZ -#if ENABLE_FEATURE_SEAMLESS_LZMA || ENABLE_FEATURE_SEAMLESS_BZ2 - strcpy(strrchr(man_filename, '.') + 1, "gz"); -#endif + strcpy(ext, "gz"); if (run_pipe(pager, man_filename, man, level)) return 1; #endif -#if ENABLE_FEATURE_SEAMLESS_LZMA || ENABLE_FEATURE_SEAMLESS_BZ2 || ENABLE_FEATURE_SEAMLESS_GZ - *strrchr(man_filename, '.') = '\0'; +#if SEAMLESS_COMPRESSION + ext[-1] = '\0'; #endif if (run_pipe(pager, man_filename, man, level)) return 1; @@ -262,7 +257,7 @@ int man_main(int argc UNUSED_PARAM, char **argv) /* Search for cat, then man page */ while (cat0man1 < 2) { int found_here; - man_filename = xasprintf("%s/%s%.*s/%s.%.*s" Z_SUFFIX, + man_filename = xasprintf("%s/%s%.*s/%s.%.*s", cur_path, "cat\0man" + (cat0man1 * 4), sect_len, cur_sect, -- cgit v1.2.3