diff options
-rw-r--r-- | gnu/usr.bin/ld/rtld/rtld.c | 22 | ||||
-rw-r--r-- | libexec/rtld-aout/rtld.c | 22 |
2 files changed, 42 insertions, 2 deletions
diff --git a/gnu/usr.bin/ld/rtld/rtld.c b/gnu/usr.bin/ld/rtld/rtld.c index 96dd0fe..d1ab408 100644 --- a/gnu/usr.bin/ld/rtld/rtld.c +++ b/gnu/usr.bin/ld/rtld/rtld.c @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: rtld.c,v 1.16 1994/04/13 20:52:40 ats Exp $ + * $Id: rtld.c,v 1.17 1994/06/15 22:41:15 rich Exp $ */ #include <sys/param.h> @@ -162,6 +162,7 @@ static void init_map __P((struct so_map *, char *)); static char *rtfindlib __P((char *, int, int, int *)); void binder_entry __P((void)); long binder __P((jmpslot_t *)); +static void unmaphints __P((void)); static struct nzlist *lookup __P((char *, struct so_map **, int)); static inline struct rt_symbol *lookup_rts __P((char *)); static struct rt_symbol *enter_rts __P((char *, long, int, caddr_t, @@ -293,6 +294,9 @@ struct _dynamic *dp; ddp->dd_sym_loaded = 1; } + /* Forget hints so that hints file can go away if it is unlinked */ + unmaphints(); + /* Close our file descriptor */ (void)close(crtp->crt_ldfd); return 0; @@ -949,6 +953,7 @@ xprintf(" BINDER: %s located at = %#x in %s\n", sym, addr, src_map->som_path); static struct hints_header *hheader; +static long hmsize; static struct hints_bucket *hbuckets; static char *hstrtab; @@ -970,6 +975,7 @@ maphints() addr = mmap(0, msize, PROT_READ, MAP_FILE|MAP_COPY, fd, 0); if (addr == (caddr_t)-1) { + close(fd); hheader = (struct hints_header *)-1; return; } @@ -977,22 +983,27 @@ maphints() hheader = (struct hints_header *)addr; if (HH_BADMAG(*hheader)) { munmap(addr, msize); + close(fd); hheader = (struct hints_header *)-1; return; } if (hheader->hh_version != LD_HINTS_VERSION_1) { munmap(addr, msize); + close(fd); hheader = (struct hints_header *)-1; return; } + hmsize = msize; if (hheader->hh_ehints > msize) { + hmsize = hheader->hh_ehints; if (mmap(addr+msize, hheader->hh_ehints - msize, PROT_READ, MAP_FILE|MAP_COPY|MAP_FIXED, fd, msize) != (caddr_t)(addr+msize)) { munmap((caddr_t)hheader, msize); + close(fd); hheader = (struct hints_header *)-1; return; } @@ -1003,6 +1014,15 @@ maphints() hstrtab = (char *)(addr + hheader->hh_strtab); } + static void +unmaphints() +{ + if (HINTS_VALID) { + munmap((caddr_t)hheader, hmsize); + hheader = NULL; + } +} + int hinthash(cp, vmajor, vminor) char *cp; diff --git a/libexec/rtld-aout/rtld.c b/libexec/rtld-aout/rtld.c index 96dd0fe..d1ab408 100644 --- a/libexec/rtld-aout/rtld.c +++ b/libexec/rtld-aout/rtld.c @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: rtld.c,v 1.16 1994/04/13 20:52:40 ats Exp $ + * $Id: rtld.c,v 1.17 1994/06/15 22:41:15 rich Exp $ */ #include <sys/param.h> @@ -162,6 +162,7 @@ static void init_map __P((struct so_map *, char *)); static char *rtfindlib __P((char *, int, int, int *)); void binder_entry __P((void)); long binder __P((jmpslot_t *)); +static void unmaphints __P((void)); static struct nzlist *lookup __P((char *, struct so_map **, int)); static inline struct rt_symbol *lookup_rts __P((char *)); static struct rt_symbol *enter_rts __P((char *, long, int, caddr_t, @@ -293,6 +294,9 @@ struct _dynamic *dp; ddp->dd_sym_loaded = 1; } + /* Forget hints so that hints file can go away if it is unlinked */ + unmaphints(); + /* Close our file descriptor */ (void)close(crtp->crt_ldfd); return 0; @@ -949,6 +953,7 @@ xprintf(" BINDER: %s located at = %#x in %s\n", sym, addr, src_map->som_path); static struct hints_header *hheader; +static long hmsize; static struct hints_bucket *hbuckets; static char *hstrtab; @@ -970,6 +975,7 @@ maphints() addr = mmap(0, msize, PROT_READ, MAP_FILE|MAP_COPY, fd, 0); if (addr == (caddr_t)-1) { + close(fd); hheader = (struct hints_header *)-1; return; } @@ -977,22 +983,27 @@ maphints() hheader = (struct hints_header *)addr; if (HH_BADMAG(*hheader)) { munmap(addr, msize); + close(fd); hheader = (struct hints_header *)-1; return; } if (hheader->hh_version != LD_HINTS_VERSION_1) { munmap(addr, msize); + close(fd); hheader = (struct hints_header *)-1; return; } + hmsize = msize; if (hheader->hh_ehints > msize) { + hmsize = hheader->hh_ehints; if (mmap(addr+msize, hheader->hh_ehints - msize, PROT_READ, MAP_FILE|MAP_COPY|MAP_FIXED, fd, msize) != (caddr_t)(addr+msize)) { munmap((caddr_t)hheader, msize); + close(fd); hheader = (struct hints_header *)-1; return; } @@ -1003,6 +1014,15 @@ maphints() hstrtab = (char *)(addr + hheader->hh_strtab); } + static void +unmaphints() +{ + if (HINTS_VALID) { + munmap((caddr_t)hheader, hmsize); + hheader = NULL; + } +} + int hinthash(cp, vmajor, vminor) char *cp; |