git: 986c96b54b9e - main - rtld-elf/map_object.c: apply clang-format
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 21 Jan 2025 01:51:02 UTC
The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=986c96b54b9ec1118d285b723f53c7451a4c0772 commit 986c96b54b9ec1118d285b723f53c7451a4c0772 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2025-01-18 02:45:45 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2025-01-21 01:44:35 +0000 rtld-elf/map_object.c: apply clang-format Discussed with: emaste, imp Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D48509 --- libexec/rtld-elf/map_object.c | 653 ++++++++++++++++++++++-------------------- 1 file changed, 339 insertions(+), 314 deletions(-) diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c index 7dbab26f2c63..148b6dc4ca6e 100644 --- a/libexec/rtld-elf/map_object.c +++ b/libexec/rtld-elf/map_object.c @@ -62,274 +62,296 @@ phdr_in_zero_page(const Elf_Ehdr *hdr) Obj_Entry * map_object(int fd, const char *path, const struct stat *sb) { - Obj_Entry *obj; - Elf_Ehdr *hdr; - int i; - Elf_Phdr *phdr; - Elf_Phdr *phlimit; - Elf_Phdr **segs; - int nsegs; - Elf_Phdr *phdyn; - Elf_Phdr *phinterp; - Elf_Phdr *phtls; - caddr_t mapbase; - size_t mapsize; - Elf_Addr base_vaddr; - Elf_Addr base_vlimit; - caddr_t base_addr; - int base_flags; - Elf_Off data_offset; - Elf_Addr data_vaddr; - Elf_Addr data_vlimit; - caddr_t data_addr; - int data_prot; - int data_flags; - Elf_Addr clear_vaddr; - caddr_t clear_addr; - caddr_t clear_page; - Elf_Addr phdr_vaddr; - size_t nclear, phsize; - Elf_Addr bss_vaddr; - Elf_Addr bss_vlimit; - caddr_t bss_addr; - Elf_Word stack_flags; - Elf_Addr note_start; - Elf_Addr note_end; - char *note_map; - size_t note_map_len; - Elf_Addr text_end; - - hdr = get_elf_header(fd, path, sb, &phdr); - if (hdr == NULL) - return (NULL); + Obj_Entry *obj; + Elf_Ehdr *hdr; + int i; + Elf_Phdr *phdr; + Elf_Phdr *phlimit; + Elf_Phdr **segs; + int nsegs; + Elf_Phdr *phdyn; + Elf_Phdr *phinterp; + Elf_Phdr *phtls; + caddr_t mapbase; + size_t mapsize; + Elf_Addr base_vaddr; + Elf_Addr base_vlimit; + caddr_t base_addr; + int base_flags; + Elf_Off data_offset; + Elf_Addr data_vaddr; + Elf_Addr data_vlimit; + caddr_t data_addr; + int data_prot; + int data_flags; + Elf_Addr clear_vaddr; + caddr_t clear_addr; + caddr_t clear_page; + Elf_Addr phdr_vaddr; + size_t nclear, phsize; + Elf_Addr bss_vaddr; + Elf_Addr bss_vlimit; + caddr_t bss_addr; + Elf_Word stack_flags; + Elf_Addr note_start; + Elf_Addr note_end; + char *note_map; + size_t note_map_len; + Elf_Addr text_end; + + hdr = get_elf_header(fd, path, sb, &phdr); + if (hdr == NULL) + return (NULL); - /* - * Scan the program header entries, and save key information. - * We expect that the loadable segments are ordered by load address. - */ - phsize = hdr->e_phnum * sizeof(phdr[0]); - phlimit = phdr + hdr->e_phnum; - nsegs = -1; - phdyn = phinterp = phtls = NULL; - phdr_vaddr = 0; - note_start = 0; - note_end = 0; - note_map = NULL; - note_map_len = 0; - segs = alloca(sizeof(segs[0]) * hdr->e_phnum); - stack_flags = PF_X | PF_R | PF_W; - text_end = 0; - while (phdr < phlimit) { - switch (phdr->p_type) { - - case PT_INTERP: - phinterp = phdr; - break; - - case PT_LOAD: - segs[++nsegs] = phdr; - if ((segs[nsegs]->p_align & (page_size - 1)) != 0) { - _rtld_error("%s: PT_LOAD segment %d not page-aligned", - path, nsegs); - goto error; - } - if ((segs[nsegs]->p_flags & PF_X) == PF_X) { - text_end = MAX(text_end, - rtld_round_page(segs[nsegs]->p_vaddr + - segs[nsegs]->p_memsz)); - } - break; - - case PT_PHDR: - phdr_vaddr = phdr->p_vaddr; - phsize = phdr->p_memsz; - break; - - case PT_DYNAMIC: - phdyn = phdr; - break; - - case PT_TLS: - phtls = phdr; - break; - - case PT_GNU_STACK: - stack_flags = phdr->p_flags; - break; - - case PT_NOTE: - if (phdr->p_offset > page_size || - phdr->p_offset + phdr->p_filesz > page_size) { - note_map_len = rtld_round_page(phdr->p_offset + - phdr->p_filesz) - rtld_trunc_page(phdr->p_offset); - note_map = mmap(NULL, note_map_len, PROT_READ, - MAP_PRIVATE, fd, rtld_trunc_page(phdr->p_offset)); - if (note_map == MAP_FAILED) { - _rtld_error("%s: error mapping PT_NOTE (%d)", path, errno); - goto error; + /* + * Scan the program header entries, and save key information. + * We expect that the loadable segments are ordered by load address. + */ + phsize = hdr->e_phnum * sizeof(phdr[0]); + phlimit = phdr + hdr->e_phnum; + nsegs = -1; + phdyn = phinterp = phtls = NULL; + phdr_vaddr = 0; + note_start = 0; + note_end = 0; + note_map = NULL; + note_map_len = 0; + segs = alloca(sizeof(segs[0]) * hdr->e_phnum); + stack_flags = PF_X | PF_R | PF_W; + text_end = 0; + while (phdr < phlimit) { + switch (phdr->p_type) { + case PT_INTERP: + phinterp = phdr; + break; + + case PT_LOAD: + segs[++nsegs] = phdr; + if ((segs[nsegs]->p_align & (page_size - 1)) != 0) { + _rtld_error( + "%s: PT_LOAD segment %d not page-aligned", + path, nsegs); + goto error; + } + if ((segs[nsegs]->p_flags & PF_X) == PF_X) { + text_end = MAX(text_end, + rtld_round_page(segs[nsegs]->p_vaddr + + segs[nsegs]->p_memsz)); + } + break; + + case PT_PHDR: + phdr_vaddr = phdr->p_vaddr; + phsize = phdr->p_memsz; + break; + + case PT_DYNAMIC: + phdyn = phdr; + break; + + case PT_TLS: + phtls = phdr; + break; + + case PT_GNU_STACK: + stack_flags = phdr->p_flags; + break; + + case PT_NOTE: + if (phdr->p_offset > page_size || + phdr->p_offset + phdr->p_filesz > page_size) { + note_map_len = rtld_round_page(phdr->p_offset + + phdr->p_filesz) - + rtld_trunc_page(phdr->p_offset); + note_map = mmap(NULL, note_map_len, PROT_READ, + MAP_PRIVATE, fd, + rtld_trunc_page(phdr->p_offset)); + if (note_map == MAP_FAILED) { + _rtld_error( + "%s: error mapping PT_NOTE (%d)", + path, errno); + goto error; + } + note_start = (Elf_Addr)(note_map + + phdr->p_offset - + rtld_trunc_page(phdr->p_offset)); + } else { + note_start = (Elf_Addr)(char *)hdr + + phdr->p_offset; + } + note_end = note_start + phdr->p_filesz; + break; } - note_start = (Elf_Addr)(note_map + phdr->p_offset - - rtld_trunc_page(phdr->p_offset)); - } else { - note_start = (Elf_Addr)(char *)hdr + phdr->p_offset; - } - note_end = note_start + phdr->p_filesz; - break; - } - ++phdr; - } - if (phdyn == NULL) { - _rtld_error("%s: object is not dynamically-linked", path); - goto error; - } - - if (nsegs < 0) { - _rtld_error("%s: too few PT_LOAD segments", path); - goto error; - } - - /* - * Map the entire address space of the object, to stake out our - * contiguous region, and to establish the base address for relocation. - */ - base_vaddr = rtld_trunc_page(segs[0]->p_vaddr); - base_vlimit = rtld_round_page(segs[nsegs]->p_vaddr + segs[nsegs]->p_memsz); - mapsize = base_vlimit - base_vaddr; - base_addr = (caddr_t) base_vaddr; - base_flags = __getosreldate() >= P_OSREL_MAP_GUARD ? MAP_GUARD : - MAP_PRIVATE | MAP_ANON | MAP_NOCORE; - if (npagesizes > 1 && rtld_round_page(segs[0]->p_filesz) >= pagesizes[1]) - base_flags |= MAP_ALIGNED_SUPER; - if (base_vaddr != 0) - base_flags |= MAP_FIXED | MAP_EXCL; - - mapbase = mmap(base_addr, mapsize, PROT_NONE, base_flags, -1, 0); - if (mapbase == MAP_FAILED) { - _rtld_error("%s: mmap of entire address space failed: %s", - path, rtld_strerror(errno)); - goto error; - } - if (base_addr != NULL && mapbase != base_addr) { - _rtld_error("%s: mmap returned wrong address: wanted %p, got %p", - path, base_addr, mapbase); - goto error1; - } - - for (i = 0; i <= nsegs; i++) { - /* Overlay the segment onto the proper region. */ - data_offset = rtld_trunc_page(segs[i]->p_offset); - data_vaddr = rtld_trunc_page(segs[i]->p_vaddr); - data_vlimit = rtld_round_page(segs[i]->p_vaddr + segs[i]->p_filesz); - data_addr = mapbase + (data_vaddr - base_vaddr); - data_prot = convert_prot(segs[i]->p_flags); - data_flags = convert_flags(segs[i]->p_flags) | MAP_FIXED; - if (data_vlimit != data_vaddr && - mmap(data_addr, data_vlimit - data_vaddr, data_prot, - data_flags | MAP_PREFAULT_READ, fd, data_offset) == MAP_FAILED) { - _rtld_error("%s: mmap of data failed: %s", path, - rtld_strerror(errno)); - goto error1; + ++phdr; + } + if (phdyn == NULL) { + _rtld_error("%s: object is not dynamically-linked", path); + goto error; } - /* Do BSS setup */ - if (segs[i]->p_filesz != segs[i]->p_memsz) { + if (nsegs < 0) { + _rtld_error("%s: too few PT_LOAD segments", path); + goto error; + } - /* Clear any BSS in the last page of the segment. */ - clear_vaddr = segs[i]->p_vaddr + segs[i]->p_filesz; - clear_addr = mapbase + (clear_vaddr - base_vaddr); - clear_page = mapbase + (rtld_trunc_page(clear_vaddr) - base_vaddr); + /* + * Map the entire address space of the object, to stake out our + * contiguous region, and to establish the base address for relocation. + */ + base_vaddr = rtld_trunc_page(segs[0]->p_vaddr); + base_vlimit = rtld_round_page(segs[nsegs]->p_vaddr + + segs[nsegs]->p_memsz); + mapsize = base_vlimit - base_vaddr; + base_addr = (caddr_t)base_vaddr; + base_flags = __getosreldate() >= P_OSREL_MAP_GUARD ? + MAP_GUARD : MAP_PRIVATE | MAP_ANON | MAP_NOCORE; + if (npagesizes > 1 && rtld_round_page(segs[0]->p_filesz) >= + pagesizes[1]) + base_flags |= MAP_ALIGNED_SUPER; + if (base_vaddr != 0) + base_flags |= MAP_FIXED | MAP_EXCL; + + mapbase = mmap(base_addr, mapsize, PROT_NONE, base_flags, -1, 0); + if (mapbase == MAP_FAILED) { + _rtld_error("%s: mmap of entire address space failed: %s", + path, rtld_strerror(errno)); + goto error; + } + if (base_addr != NULL && mapbase != base_addr) { + _rtld_error( + "%s: mmap returned wrong address: wanted %p, got %p", + path, base_addr, mapbase); + goto error1; + } - if ((nclear = data_vlimit - clear_vaddr) > 0) { - /* Make sure the end of the segment is writable */ - if ((data_prot & PROT_WRITE) == 0 && -1 == - mprotect(clear_page, page_size, data_prot|PROT_WRITE)) { - _rtld_error("%s: mprotect failed: %s", path, - rtld_strerror(errno)); + for (i = 0; i <= nsegs; i++) { + /* Overlay the segment onto the proper region. */ + data_offset = rtld_trunc_page(segs[i]->p_offset); + data_vaddr = rtld_trunc_page(segs[i]->p_vaddr); + data_vlimit = rtld_round_page(segs[i]->p_vaddr + + segs[i]->p_filesz); + data_addr = mapbase + (data_vaddr - base_vaddr); + data_prot = convert_prot(segs[i]->p_flags); + data_flags = convert_flags(segs[i]->p_flags) | MAP_FIXED; + if (data_vlimit != data_vaddr && mmap(data_addr, + data_vlimit - data_vaddr, data_prot, data_flags | + MAP_PREFAULT_READ, fd, data_offset) == MAP_FAILED) { + _rtld_error("%s: mmap of data failed: %s", + path, rtld_strerror(errno)); goto error1; } - memset(clear_addr, 0, nclear); - - /* Reset the data protection back */ - if ((data_prot & PROT_WRITE) == 0) - mprotect(clear_page, page_size, data_prot); - } - - /* Overlay the BSS segment onto the proper region. */ - bss_vaddr = data_vlimit; - bss_vlimit = rtld_round_page(segs[i]->p_vaddr + segs[i]->p_memsz); - bss_addr = mapbase + (bss_vaddr - base_vaddr); - if (bss_vlimit > bss_vaddr) { /* There is something to do */ - if (mmap(bss_addr, bss_vlimit - bss_vaddr, data_prot, - data_flags | MAP_ANON, -1, 0) == MAP_FAILED) { - _rtld_error("%s: mmap of bss failed: %s", path, - rtld_strerror(errno)); - goto error1; + /* Do BSS setup */ + if (segs[i]->p_filesz != segs[i]->p_memsz) { + /* Clear any BSS in the last page of the segment. */ + clear_vaddr = segs[i]->p_vaddr + segs[i]->p_filesz; + clear_addr = mapbase + (clear_vaddr - base_vaddr); + clear_page = mapbase + (rtld_trunc_page(clear_vaddr) - + base_vaddr); + + if ((nclear = data_vlimit - clear_vaddr) > 0) { + /* + * Make sure the end of the segment is + * writable. + */ + if ((data_prot & PROT_WRITE) == 0 && + mprotect(clear_page, page_size, + data_prot | PROT_WRITE) == -1) { + _rtld_error("%s: mprotect failed: %s", + path, rtld_strerror(errno)); + goto error1; + } + + memset(clear_addr, 0, nclear); + + /* Reset the data protection back */ + if ((data_prot & PROT_WRITE) == 0) + mprotect(clear_page, page_size, + data_prot); + } + + /* Overlay the BSS segment onto the proper region. */ + bss_vaddr = data_vlimit; + bss_vlimit = rtld_round_page(segs[i]->p_vaddr + + segs[i]->p_memsz); + bss_addr = mapbase + (bss_vaddr - base_vaddr); + if (bss_vlimit > bss_vaddr) { + /* There is something to do */ + if (mmap(bss_addr, bss_vlimit - bss_vaddr, + data_prot, data_flags | MAP_ANON, -1, + 0) == MAP_FAILED) { + _rtld_error( + "%s: mmap of bss failed: %s", + path, rtld_strerror(errno)); + goto error1; + } + } + } + + if (phdr_vaddr == 0 && data_offset <= hdr->e_phoff && + data_vlimit - data_vaddr + data_offset >= + hdr->e_phoff + hdr->e_phnum * sizeof(Elf_Phdr)) { + phdr_vaddr = data_vaddr + hdr->e_phoff - data_offset; } - } } - if (phdr_vaddr == 0 && data_offset <= hdr->e_phoff && - (data_vlimit - data_vaddr + data_offset) >= - (hdr->e_phoff + hdr->e_phnum * sizeof (Elf_Phdr))) { - phdr_vaddr = data_vaddr + hdr->e_phoff - data_offset; + obj = obj_new(); + if (sb != NULL) { + obj->dev = sb->st_dev; + obj->ino = sb->st_ino; + } + obj->mapbase = mapbase; + obj->mapsize = mapsize; + obj->vaddrbase = base_vaddr; + obj->relocbase = mapbase - base_vaddr; + obj->dynamic = (const Elf_Dyn *)(obj->relocbase + phdyn->p_vaddr); + if (hdr->e_entry != 0) + obj->entry = (caddr_t)(obj->relocbase + hdr->e_entry); + if (phdr_vaddr != 0) { + obj->phdr = (const Elf_Phdr *)(obj->relocbase + phdr_vaddr); + } else { + obj->phdr = malloc(phsize); + if (obj->phdr == NULL) { + obj_free(obj); + _rtld_error("%s: cannot allocate program header", + path); + goto error1; + } + memcpy(__DECONST(char *, obj->phdr), (char *)hdr + hdr->e_phoff, + phsize); + obj->phdr_alloc = true; } - } - - obj = obj_new(); - if (sb != NULL) { - obj->dev = sb->st_dev; - obj->ino = sb->st_ino; - } - obj->mapbase = mapbase; - obj->mapsize = mapsize; - obj->vaddrbase = base_vaddr; - obj->relocbase = mapbase - base_vaddr; - obj->dynamic = (const Elf_Dyn *)(obj->relocbase + phdyn->p_vaddr); - if (hdr->e_entry != 0) - obj->entry = (caddr_t)(obj->relocbase + hdr->e_entry); - if (phdr_vaddr != 0) { - obj->phdr = (const Elf_Phdr *)(obj->relocbase + phdr_vaddr); - } else { - obj->phdr = malloc(phsize); - if (obj->phdr == NULL) { - obj_free(obj); - _rtld_error("%s: cannot allocate program header", path); - goto error1; + obj->phsize = phsize; + if (phinterp != NULL) + obj->interp = (const char *)(obj->relocbase + + phinterp->p_vaddr); + if (phtls != NULL) { + tls_dtv_generation++; + obj->tlsindex = ++tls_max_index; + obj->tlssize = phtls->p_memsz; + obj->tlsalign = phtls->p_align; + obj->tlspoffset = phtls->p_offset; + obj->tlsinitsize = phtls->p_filesz; + obj->tlsinit = mapbase + phtls->p_vaddr; } - memcpy(__DECONST(char *, obj->phdr), (char *)hdr + hdr->e_phoff, phsize); - obj->phdr_alloc = true; - } - obj->phsize = phsize; - if (phinterp != NULL) - obj->interp = (const char *)(obj->relocbase + phinterp->p_vaddr); - if (phtls != NULL) { - tls_dtv_generation++; - obj->tlsindex = ++tls_max_index; - obj->tlssize = phtls->p_memsz; - obj->tlsalign = phtls->p_align; - obj->tlspoffset = phtls->p_offset; - obj->tlsinitsize = phtls->p_filesz; - obj->tlsinit = mapbase + phtls->p_vaddr; - } - obj->stack_flags = stack_flags; - if (note_start < note_end) - digest_notes(obj, note_start, note_end); - if (note_map != NULL) - munmap(note_map, note_map_len); - munmap(hdr, page_size); - return (obj); + obj->stack_flags = stack_flags; + if (note_start < note_end) + digest_notes(obj, note_start, note_end); + if (note_map != NULL) + munmap(note_map, note_map_len); + munmap(hdr, page_size); + return (obj); error1: - munmap(mapbase, mapsize); + munmap(mapbase, mapsize); error: - if (note_map != NULL && note_map != MAP_FAILED) - munmap(note_map, note_map_len); - if (!phdr_in_zero_page(hdr)) - munmap(phdr, hdr->e_phnum * sizeof(phdr[0])); - munmap(hdr, page_size); - return (NULL); + if (note_map != NULL && note_map != MAP_FAILED) + munmap(note_map, note_map_len); + if (!phdr_in_zero_page(hdr)) + munmap(phdr, hdr->e_phnum * sizeof(phdr[0])); + munmap(hdr, page_size); + return (NULL); } bool @@ -359,7 +381,8 @@ check_elf_headers(const Elf_Ehdr *hdr, const char *path) } if (hdr->e_phentsize != sizeof(Elf_Phdr)) { _rtld_error( - "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); + "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", + path); return (false); } return (true); @@ -397,9 +420,8 @@ get_elf_header(int fd, const char *path, const struct stat *sbp, if (phdr_in_zero_page(hdr)) { phdr = (Elf_Phdr *)((char *)hdr + hdr->e_phoff); } else { - phdr = mmap(NULL, hdr->e_phnum * sizeof(phdr[0]), - PROT_READ, MAP_PRIVATE | MAP_PREFAULT_READ, fd, - hdr->e_phoff); + phdr = mmap(NULL, hdr->e_phnum * sizeof(phdr[0]), PROT_READ, + MAP_PRIVATE | MAP_PREFAULT_READ, fd, hdr->e_phoff); if (phdr == MAP_FAILED) { _rtld_error("%s: error mapping phdr: %s", path, rtld_strerror(errno)); @@ -417,55 +439,57 @@ error: void obj_free(Obj_Entry *obj) { - Objlist_Entry *elm; - - if (obj->tls_static) - free_tls_offset(obj); - while (obj->needed != NULL) { - Needed_Entry *needed = obj->needed; - obj->needed = needed->next; - free(needed); - } - while (!STAILQ_EMPTY(&obj->names)) { - Name_Entry *entry = STAILQ_FIRST(&obj->names); - STAILQ_REMOVE_HEAD(&obj->names, link); - free(entry); - } - while (!STAILQ_EMPTY(&obj->dldags)) { - elm = STAILQ_FIRST(&obj->dldags); - STAILQ_REMOVE_HEAD(&obj->dldags, link); - free(elm); - } - while (!STAILQ_EMPTY(&obj->dagmembers)) { - elm = STAILQ_FIRST(&obj->dagmembers); - STAILQ_REMOVE_HEAD(&obj->dagmembers, link); - free(elm); - } - if (obj->vertab) - free(obj->vertab); - if (obj->origin_path) - free(obj->origin_path); - if (obj->z_origin) - free(__DECONST(void*, obj->rpath)); - if (obj->priv) - free(obj->priv); - if (obj->path) - free(obj->path); - if (obj->phdr_alloc) - free(__DECONST(void *, obj->phdr)); - free(obj); + Objlist_Entry *elm; + + if (obj->tls_static) + free_tls_offset(obj); + while (obj->needed != NULL) { + Needed_Entry *needed = obj->needed; + + obj->needed = needed->next; + free(needed); + } + while (!STAILQ_EMPTY(&obj->names)) { + Name_Entry *entry = STAILQ_FIRST(&obj->names); + + STAILQ_REMOVE_HEAD(&obj->names, link); + free(entry); + } + while (!STAILQ_EMPTY(&obj->dldags)) { + elm = STAILQ_FIRST(&obj->dldags); + STAILQ_REMOVE_HEAD(&obj->dldags, link); + free(elm); + } + while (!STAILQ_EMPTY(&obj->dagmembers)) { + elm = STAILQ_FIRST(&obj->dagmembers); + STAILQ_REMOVE_HEAD(&obj->dagmembers, link); + free(elm); + } + if (obj->vertab) + free(obj->vertab); + if (obj->origin_path) + free(obj->origin_path); + if (obj->z_origin) + free(__DECONST(void *, obj->rpath)); + if (obj->priv) + free(obj->priv); + if (obj->path) + free(obj->path); + if (obj->phdr_alloc) + free(__DECONST(void *, obj->phdr)); + free(obj); } Obj_Entry * obj_new(void) { - Obj_Entry *obj; + Obj_Entry *obj; - obj = CNEW(Obj_Entry); - STAILQ_INIT(&obj->dldags); - STAILQ_INIT(&obj->dagmembers); - STAILQ_INIT(&obj->names); - return obj; + obj = CNEW(Obj_Entry); + STAILQ_INIT(&obj->dldags); + STAILQ_INIT(&obj->dagmembers); + STAILQ_INIT(&obj->names); + return (obj); } /* @@ -475,26 +499,27 @@ obj_new(void) int convert_prot(int elfflags) { - int prot = 0; - if (elfflags & PF_R) - prot |= PROT_READ; - if (elfflags & PF_W) - prot |= PROT_WRITE; - if (elfflags & PF_X) - prot |= PROT_EXEC; - return prot; + int prot = 0; + + if ((elfflags & PF_R) != 0) + prot |= PROT_READ; + if ((elfflags & PF_W) != 0) + prot |= PROT_WRITE; + if ((elfflags & PF_X) != 0) + prot |= PROT_EXEC; + return (prot); } static int convert_flags(int elfflags) { - int flags = MAP_PRIVATE; /* All mappings are private */ - - /* - * Readonly mappings are marked "MAP_NOCORE", because they can be - * reconstructed by a debugger. - */ - if (!(elfflags & PF_W)) - flags |= MAP_NOCORE; - return flags; + int flags = MAP_PRIVATE; /* All mappings are private */ + + /* + * Readonly mappings are marked "MAP_NOCORE", because they can be + * reconstructed by a debugger. + */ + if ((elfflags & PF_W) == 0) + flags |= MAP_NOCORE; + return (flags); }