about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/ldso/dynlink.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index efbec8fb..dec95111 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -403,16 +403,16 @@ error:
 	return 0;
 }
 
-static int path_open(const char *name, const char *search, char *buf, size_t buf_size)
+static int path_open(const char *name, const char *s, char *buf, size_t buf_size)
 {
-	const char *s=search, *z;
-	int l, fd;
+	size_t l;
+	int fd;
 	for (;;) {
-		while (*s==':') s++;
-		if (!*s) return -1;
-		z = strchr(s, ':');
-		l = z ? z-s : strlen(s);
-		snprintf(buf, buf_size, "%.*s/%s", l, s, name);
+		s += strspn(s, ":\n");
+		l = strcspn(s, ":\n");
+		if (l-1 >= INT_MAX) return -1;
+		if (snprintf(buf, buf_size, "%.*s/%s", (int)l, s, name) >= buf_size)
+			continue;
 		if ((fd = open(buf, O_RDONLY|O_CLOEXEC))>=0) return fd;
 		s += l;
 	}