From: GNU Libc Maintainers Date: Fri, 26 Jan 2018 22:35:29 +0000 (+0000) Subject: unsubmitted-dlopen-static-crash X-Git-Tag: archive/raspbian/2.26-6+rpi1^2~9 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8914ac874a55e6447f2a641952582628954ff801;p=glibc.git unsubmitted-dlopen-static-crash Gbp-Pq: Topic any Gbp-Pq: Name unsubmitted-dlopen-static-crash.diff --- diff --git a/elf/dl-open.c b/elf/dl-open.c index cec54db41..b5baf3a9a 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -84,11 +84,22 @@ add_to_global (struct link_map *new) anymore. Instead the malloc() implementation of the libc is used. But this means the block from the main map cannot be used in an realloc() call. Therefore we allocate a completely new - array the first time we have to add something to the locale scope. */ + array the first time we have to add something to the locale scope. + + Also the list may be missing altogether if we are called via + dlopen() from a statically linked executable as in this case ld.so + has not been called and no dynamic symbols have been pulled yet. + Start a new list in this case. */ struct link_namespaces *ns = &GL(dl_ns)[new->l_ns]; if (ns->_ns_global_scope_alloc == 0) { + /* See if we've got a list at all. */ + if (ns->_ns_main_searchlist == NULL) + ns->_ns_main_searchlist = calloc (1, sizeof (struct r_scope_elem)); + if (ns->_ns_main_searchlist == NULL) + goto nomem; + /* This is the first dynamic object given global scope. */ ns->_ns_global_scope_alloc = ns->_ns_main_searchlist->r_nlist + to_add + 8;