unsquashfs build with musl libc will segfault. The problem is:
void *inflator(void *arg) { char tmp[block_size];
where block size is set from the squshfs image.
On musl libc the default stack size is 80Kb which is a lot smaller than glibc who allocates 8MB by default. This is why this is not visible on glibc.
I am pretty sure you can trigger it with a crafted squashfs image on glibc too. Just say that the block size is bigger than 8Mb.
The following fixes it (the free(tmp) is not really needed):
--- ./squashfs-tools/unsquashfs.c.orig +++ ./squashfs-tools/unsquashfs.c @@ -2099,7 +2099,9 @@ */ void *inflator(void *arg) { - char tmp[block_size]; + char *tmp = malloc(block_size); + if(tmp == NULL) + EXIT_UNSQUASH("Out of memory allocating block buffer\n"); while(1) { struct cache_entry *entry = queue_get(to_inflate); @@ -2122,6 +2124,7 @@ */ cache_block_ready(entry, res == -1); } + free(tmp); }
Credits to dalias (musl libc maintainer) who found it and suggested the fix.