diff options
| author | Rich Felker <dalias@aerifal.cx> | 2011-06-25 17:49:16 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2011-06-25 17:49:16 -0400 | 
| commit | 49388f3b7b72a1695bef05f64439b602b2e77a53 (patch) | |
| tree | 918e3f7a6f97c8761bc46088ae2f7ee61ea67711 | |
| parent | e8b8f3c90e02d8fa077be0f273fce1e48e2719d2 (diff) | |
| download | musl-49388f3b7b72a1695bef05f64439b602b2e77a53.tar.gz | |
handle library paths better (ignore empty path components, etc.)
| -rw-r--r-- | src/ldso/dynlink.c | 8 | 
1 files changed, 5 insertions, 3 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 56ba89eb..472e389d 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -208,15 +208,17 @@ static void *map_library(int fd, size_t *lenp, unsigned char **basep, size_t *dy  static int path_open(const char *name, const char *search)  {  	char buf[2*NAME_MAX+2]; -	const char *s, *z; +	const char *s=search, *z;  	int l, fd; -	for (s=search; *s; s+=l+!!z) { +	for (;;) { +		while (*s==':') s++; +		if (!*s) return -1;  		z = strchr(s, ':');  		l = z ? z-s : strlen(s);  		snprintf(buf, sizeof buf, "%.*s/%s", l, s, name);  		if ((fd = open(buf, O_RDONLY))>=0) return fd; +		s += l;  	} -	return -1;  }  static struct dso *load_library(const char *name)  | 
