Ilya Zakharevich on Fri, 30 Aug 2024 02:54:45 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
[PATCH 2.16.2-beta] compressed input |
This patch • allows newer types of compression of input; • protects against poison pills in the decompression command line. Enjoy, Ilya --- src/language/es.c~ 2024-06-29 10:15:06.000000000 -0700 +++ src/language/es.c 2024-08-29 17:47:31.545426919 -0700 @@ -3869,27 +3869,49 @@ strftime_expand(const char *s, char *buf { strcpy(buf,s); } #endif +typedef struct +{ + char *ext; + char *cmd; +} decompress_tbl; +decompress_tbl decompress[] = { +#ifdef ZCAT + {".Z", ZCAT}, +#ifdef GZCAT + {".gz", ZCAT}, +#endif /* defined GZCAT */ +#endif /* defined ZCAT */ + {".bz2", "bzip2 -dc"}, + {".xz", "xz -dc"}, + {".zstd", "zstd -dc"}, + {".7z", "7za -so e"}, + {".zip", "unzip -p"}, + {NULL, NULL} +}; + /* name is a malloc'ed (existing) filename. Accept it as new pari_infile * (unzip if needed). */ static pariFILE * pari_get_infile(const char *name, FILE *file) { -#ifdef ZCAT + decompress_tbl *t = decompress; long l = strlen(name); - const char *end = name + l-1; + const char *end = name + l; + while (t->ext) { + long ll = strlen(t->ext); - if (l > 2 && (!strncmp(end-1,".Z",2) -#ifdef GNUZCAT - || !strncmp(end-2,".gz",3) -#endif - )) - { /* compressed file (compress or gzip) */ - char *cmd = stack_malloc(strlen(ZCAT) + l + 4); - sprintf(cmd,"%s \"%s\"",ZCAT,name); - fclose(file); - return try_pipe(cmd, mf_IN); + if (end >= name && !strncmp(end-ll, t->ext, ll)) + { /* compressed file (compress or gzip etc.) */ + char *cmd = stack_malloc(strlen(t->cmd) + l + 4), *badchrs = " \"`$"; + while (*++badchrs) + if (strchr(name, *badchrs)) + pari_err(e_MISC, "Compressed input file name contains the unsupported character %c", *badchrs); + sprintf(cmd,"%s \"%s\"",t->cmd,name); + fclose(file); + return try_pipe(cmd, mf_IN); + } + t++; } -#endif return newfile(file, name, mf_IN); }