--- paxctl.c.orig 2005-05-28 19:33:58.000000000 -0400 +++ paxctl.c 2005-05-28 21:05:02.000000000 -0400 @@ -20,22 +20,23 @@ static void report_flags(const Elf64_Word flags, const struct pax_state * const state) { - char buffer[13]; + char buffer[7]; /* the logic is: lower case: explicitly disabled, upper case: explicitly enabled, - : default */ buffer[0] = (flags & PF_PAGEEXEC ? 'P' : '-'); - buffer[1] = (flags & PF_NOPAGEEXEC ? 'p' : '-'); - buffer[2] = (flags & PF_SEGMEXEC ? 'S' : '-'); - buffer[3] = (flags & PF_NOSEGMEXEC ? 's' : '-'); - buffer[4] = (flags & PF_MPROTECT ? 'M' : '-'); - buffer[5] = (flags & PF_NOMPROTECT ? 'm' : '-'); - buffer[6] = (flags & PF_RANDEXEC ? 'X' : '-'); - buffer[7] = (flags & PF_NORANDEXEC ? 'x' : '-'); - buffer[8] = (flags & PF_EMUTRAMP ? 'E' : '-'); - buffer[9] = (flags & PF_NOEMUTRAMP ? 'e' : '-'); - buffer[10] = (flags & PF_RANDMMAP ? 'R' : '-'); - buffer[11] = (flags & PF_NORANDMMAP ? 'r' : '-'); - buffer[12] = 0; + buffer[0] = (flags & PF_NOPAGEEXEC ? 'p' : buffer[0]); + buffer[1] = (flags & PF_SEGMEXEC ? 'S' : '-'); + buffer[1] = (flags & PF_NOSEGMEXEC ? 's' : buffer[1]); + buffer[2] = (flags & PF_MPROTECT ? 'M' : '-'); + buffer[2] = (flags & PF_NOMPROTECT ? 'm' : buffer[2]); + buffer[3] = (flags & PF_RANDEXEC ? 'X' : '-'); + buffer[3] = (flags & PF_NORANDEXEC ? 'x' : buffer[3]); + buffer[4] = (flags & PF_EMUTRAMP ? 'E' : '-'); + buffer[4] = (flags & PF_NOEMUTRAMP ? 'e' : buffer[2]); + buffer[5] = (flags & PF_RANDMMAP ? 'R' : '-'); + buffer[5] = (flags & PF_NORANDMMAP ? 'r' : buffer[5]); + + buffer[6] = 0; fprintf(stdout, "- PaX flags: %s [%s]\n", buffer, state->argv[state->files]); @@ -54,6 +55,15 @@ if (flags & PF_NOEMUTRAMP) fprintf(stdout, "\tEMUTRAMP is disabled\n"); if (flags & PF_RANDMMAP) fprintf(stdout, "\tRANDMMAP is enabled\n"); if (flags & PF_NORANDMMAP) fprintf(stdout, "\tRANDMMAP is disabled\n"); + + if (((flags & PF_PAGEEXEC) && (flags & PF_NOPAGEEXEC)) + || ((flags & PF_SEGMEXEC) && (flags & PF_NOSEGMEXEC)) + || ((flags & PF_RANDMMAP) && (flags & PF_NORANDMMAP)) + || ((flags & PF_RANDEXEC) && (flags & PF_NORANDEXEC)) + || ((flags & PF_EMUTRAMP) && (flags & PF_NOEMUTRAMP)) + || ((flags & PF_RANDMMAP) && (flags & PF_NORANDMMAP))) + fprintf(stderr, "\n\tInconsistent state detected in %s flags=%u\n", state->argv[state->files], flags); + } static void * elf32_map_phdr(const int fd, const struct pax_state * const state)