diff options
author | Roland McGrath <roland@hack.frob.com> | 2015-11-20 16:16:35 -0800 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2015-11-20 16:16:35 -0800 |
commit | f549f0bcba7196a2afc51657c536bbc131a7c544 (patch) | |
tree | 660614e69524c182846179ea86a11dc1a4d773ad /sysdeps/nacl | |
parent | 2d2c271aea8edd4147793ee6eea82b4ebe2143ae (diff) | |
download | glibc-f549f0bcba7196a2afc51657c536bbc131a7c544.tar.gz glibc-f549f0bcba7196a2afc51657c536bbc131a7c544.tar.xz glibc-f549f0bcba7196a2afc51657c536bbc131a7c544.zip |
NaCl: Use allocate_code_data after dyncode_create
Diffstat (limited to 'sysdeps/nacl')
-rw-r--r-- | sysdeps/nacl/dl-map-segments.h | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/sysdeps/nacl/dl-map-segments.h b/sysdeps/nacl/dl-map-segments.h index f305da304a..f2d5d84dcd 100644 --- a/sysdeps/nacl/dl-map-segments.h +++ b/sysdeps/nacl/dl-map-segments.h @@ -53,7 +53,7 @@ _dl_map_segments (struct link_map *l, int fd, const size_t maplength, bool has_holes, struct link_map *loader) { - if (__builtin_expect (type, ET_DYN) == ET_DYN) + if (__glibc_likely (type == ET_DYN)) { /* This is a position-independent shared object. Let the system choose where to place it. @@ -165,6 +165,32 @@ _dl_map_segments (struct link_map *l, int fd, errno = error; return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT; } + if (__glibc_unlikely (type != ET_DYN)) + { + /* A successful PROT_EXEC mmap would have implicitly + updated the bookkeeping so that a future + allocate_code_data call would know that this range + of the address space is already occupied. That + doesn't happen implicitly with dyncode_create, so + it's necessary to do an explicit call to update the + bookkeeping. */ + uintptr_t allocated_address; + error = __nacl_irt_code_data_alloc.allocate_code_data + (l->l_addr + c->mapstart, len, 0, 0, &allocated_address); + if (__glibc_unlikely (error)) + { + errno = error; + return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT; + } + if (__glibc_unlikely + (allocated_address != l->l_addr + c->mapstart)) + { + /* This is not a very helpful error for this case, + but there isn't really anything better to use. */ + errno = ENOMEM; + return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT; + } + } } else { |