? out.x Index: Makefile =================================================================== RCS file: /var/cvsroot/gentoo-projects/pax-utils/Makefile,v retrieving revision 1.22 diff -u -b -B -w -p -r1.22 Makefile --- Makefile 27 May 2005 02:53:14 -0000 1.22 +++ Makefile 28 May 2005 21:27:28 -0000 @@ -19,7 +19,7 @@ #################################################################### #################################################### -CFLAGS := -Wall -O2 +CFLAGS := -Wall -Wformat=2 -O2 #CFLAGS += -DEBUG -g #LDFLAGS :=-pie DESTDIR = Index: paxelf.c =================================================================== RCS file: /var/cvsroot/gentoo-projects/pax-utils/paxelf.c,v retrieving revision 1.21 diff -u -b -B -w -p -r1.21 paxelf.c --- paxelf.c 25 May 2005 21:58:03 -0000 1.21 +++ paxelf.c 28 May 2005 21:27:28 -0000 @@ -385,6 +384,7 @@ elfobj *readelf(const char *filename) } READELF_HEADER(32) READELF_HEADER(64) + { char *p; strncpy(elf->basename, (p = strrchr(filename, '/')) == NULL ? "?" : p+1 , sizeof(elf->basename)); } return elf; @@ -405,10 +405,6 @@ void unreadelf(elfobj *elf) free(elf); } -/* the display logic is: - * lower case: explicitly disabled - * upper case: explicitly enabled - * - : default */ char *pax_short_hf_flags(unsigned long flags) { static char buffer[7]; @@ -423,23 +419,35 @@ char *pax_short_hf_flags(unsigned long f return buffer; } + +/* the display logic is: + * lower case: explicitly disabled + * upper case: explicitly enabled + * - : default */ char *pax_short_pf_flags(unsigned long flags) { static char buffer[13]; + /* PT_PAX_FLAGS are tristate */ 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[5]); + + buffer[5] = (flags & PF_RANDMMAP ? 'R' : '-'); + buffer[5] = (flags & PF_NORANDMMAP ? 'r' : buffer[5]); + + buffer[6] = 0; return buffer; } Index: paxelf.h =================================================================== RCS file: /var/cvsroot/gentoo-projects/pax-utils/paxelf.h,v retrieving revision 1.25 diff -u -b -B -w -p -r1.25 paxelf.h --- paxelf.h 27 May 2005 02:58:11 -0000 1.25 +++ paxelf.h 28 May 2005 21:27:28 -0000 @@ -44,6 +44,7 @@ typedef struct { char elf_class; off_t len; int fd; + char basename[32]; } elfobj; #define EHDR32(ptr) ((Elf32_Ehdr *)(ptr)) #define EHDR64(ptr) ((Elf64_Ehdr *)(ptr)) @@ -89,15 +90,15 @@ extern void *elf_findsecbyname(elfobj *e #define HF_PAX_SEGMEXEC 32 /* 0: Segmentation based non-exec pages */ #define EI_PAX 14 /* Index in e_ident[] where to read flags */ -#define __PAX_FLAGS(B, elf) \ +#define __EI_PAX_FLAGS(B, elf) \ ((EHDR ## B (elf->ehdr)->e_ident[EI_PAX + 1] << 8) + EHDR ## B (elf->ehdr)->e_ident[EI_PAX]) -#define PAX_FLAGS(elf) \ +#define EI_PAX_FLAGS(elf) \ (__extension__ ({ \ unsigned long __res; \ if (elf->elf_class == ELFCLASS32) \ - __res = __PAX_FLAGS(32, elf); \ + __res = __EI_PAX_FLAGS(32, elf); \ else \ - __res = __PAX_FLAGS(64, elf); \ + __res = __EI_PAX_FLAGS(64, elf); \ __res; \ })) Index: scanelf.c =================================================================== RCS file: /var/cvsroot/gentoo-projects/pax-utils/scanelf.c,v retrieving revision 1.60 diff -u -b -B -w -p -r1.60 scanelf.c --- scanelf.c 27 May 2005 02:58:39 -0000 1.60 +++ scanelf.c 28 May 2005 21:27:28 -0000 @@ -80,16 +78,48 @@ static char *out_format = NULL; static char *scanelf_file_pax(elfobj *elf, char *found_pax) { static char *paxflags; + static char ret[8]; + unsigned long i, shown=0; if (!show_pax) return NULL; + // *ret = 0; + memset(&ret, 0, sizeof(ret)); + + if (elf->phdr) { +#define SHOW_PAX(B) \ + if (elf->elf_class == ELFCLASS ## B) { \ + Elf ## B ## _Ehdr *ehdr = EHDR ## B (elf->ehdr); \ + Elf ## B ## _Phdr *phdr = PHDR ## B (elf->phdr); \ + for (i = 0; i < EGET(ehdr->e_phnum); i++) { \ + if (EGET(phdr[i].p_type) != PT_PAX_FLAGS) \ + continue; \ + if (be_quiet && (EGET(phdr[i].p_flags) == 10240)) \ + continue; \ + memcpy(ret, pax_short_pf_flags(EGET(phdr[i].p_flags)), 6); \ + *found_pax = 1; \ + ++shown; \ + } \ + } + SHOW_PAX(32) + SHOW_PAX(64) + } - paxflags = pax_short_hf_flags(PAX_FLAGS(elf)); - if (!be_quiet || (be_quiet && strncmp(paxflags, "PeMRxS", 6))) { + paxflags = pax_short_hf_flags(EI_PAX_FLAGS(elf)); + /* fall back to EI_PAX if no PT_PAX was found */ + if (!*ret) { + // fprintf(stderr, "%s %lu\n", elf->basename, EI_PAX_FLAGS(elf)); + if (!be_quiet || (be_quiet && EI_PAX_FLAGS(elf))) { *found_pax = 1; return paxflags; } + strncpy(ret, paxflags, sizeof(ret)); + // ++shown; + } + if (be_quiet && !shown) return NULL; + return ret; + } static char *scanelf_file_stack(elfobj *elf, char *found_stack, char *found_relro) {