--- a/rpmoffset.c +++ b/rpmoffset.c @@ -104,6 +104,15 @@ int main(int argc, char *argv[]) if (read_cnt + left < MAGIC_SIZE_MIN) break; + if (!lzma_offset && read_cnt + left >= magic_lzma_len) { + for (i = 0; i <= read_cnt + left - magic_lzma_len; ++i) + if (is_magic_lzma(p + i)) { + lzma_offset = offset + i; + return magic_finish("lzma", lzma_offset); + } + } + + /* Scan for the rest ... */ for (i = 0; i < ARRAY_SIZE(magics); ++i) { const char *needle; @@ -115,15 +124,6 @@ int main(int argc, char *argv[]) return magic_finish(magics[i].type, offset + (needle - p)); } - /* Scan for LZMA magic, but don't return yet ... */ - if (!lzma_offset && read_cnt + left >= magic_lzma_len) { - for (i = 0; i <= read_cnt + left - magic_lzma_len; ++i) - if (is_magic_lzma(p + i)) { - lzma_offset = offset + i; - break; - } - } - memmove(p, p + left + read_cnt - MAGIC_SIZE_MIN + 1, MAGIC_SIZE_MIN - 1); offset += read_cnt; @@ -133,10 +133,6 @@ int main(int argc, char *argv[]) } } - /* Delay till the end for LZMA archives since it is too fuzzy */ - if (lzma_offset) - return magic_finish("lzma", lzma_offset); - if (ferror(stdin)) perror(argv[0]);