don't fail to map library/executable with zero-length segment maps
authorRich Felker <dalias@aerifal.cx>
Fri, 5 Mar 2021 16:09:32 +0000 (11:09 -0500)
committerRich Felker <dalias@aerifal.cx>
Fri, 5 Mar 2021 16:13:02 +0000 (11:13 -0500)
reportedly the GNU linker can emit such segments, causing spurious
failure to load due to mmap with a length of zero producing EINVAL.
no action is required for such a load map (it's effectively a nop in
the program headers table) so just treat it as always successful.

ldso/dynlink.c

index 6b868c8..aaadcce 100644 (file)
@@ -579,6 +579,7 @@ static void *mmap_fixed(void *p, size_t n, int prot, int flags, int fd, off_t of
 {
        static int no_map_fixed;
        char *q;
+       if (!n) return p;
        if (!no_map_fixed) {
                q = mmap(p, n, prot, flags|MAP_FIXED, fd, off);
                if (!DL_NOMMU_SUPPORT || q != MAP_FAILED || errno != EINVAL)