blob: da288d6ccfc0f5be1f492018c2c1caf5ff1fd3aa [file] [log] [blame]
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001From 2f7407697f2a905fedb98037152e7830f73bc6c6 Mon Sep 17 00:00:00 2001
Andrew Geissler82c905d2020-04-13 13:39:40 -05002From: Khem Raj <raj.khem@gmail.com>
3Date: Wed, 18 Mar 2015 01:50:00 +0000
Andrew Geisslerd1e89492021-02-12 15:35:20 -06004Subject: [PATCH] nativesdk-glibc: Fix buffer overrun with a relocated SDK
Andrew Geissler82c905d2020-04-13 13:39:40 -05005
6When ld-linux-*.so.2 is relocated to a path that is longer than the
7original fixed location, the dynamic loader will crash in open_path
8because it implicitly assumes that max_dirnamelen is a fixed size that
9never changes.
10
11The allocated buffer will not be large enough to contain the directory
12path string which is larger than the fixed location provided at build
13time.
14
15Upstream-Status: Inappropriate [OE SDK specific]
16
17Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
18Signed-off-by: Khem Raj <raj.khem@gmail.com>
19---
20 elf/dl-load.c | 12 ++++++++++++
21 1 file changed, 12 insertions(+)
22
23diff --git a/elf/dl-load.c b/elf/dl-load.c
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000024index 39c4657fa2..daa3af6c51 100644
Andrew Geissler82c905d2020-04-13 13:39:40 -050025--- a/elf/dl-load.c
26+++ b/elf/dl-load.c
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000027@@ -1904,7 +1904,19 @@ open_path (const char *name, size_t namelen, int mode,
Andrew Geissler82c905d2020-04-13 13:39:40 -050028 given on the command line when rtld is run directly. */
29 return -1;
30
31+ do
32+ {
33+ struct r_search_path_elem *this_dir = *dirs;
34+ if (this_dir->dirnamelen > max_dirnamelen)
35+ {
36+ max_dirnamelen = this_dir->dirnamelen;
37+ }
38+ }
39+ while (*++dirs != NULL);
40+
41 buf = alloca (max_dirnamelen + max_capstrlen + namelen);
42+
43+ dirs = sps->dirs;
44 do
45 {
46 struct r_search_path_elem *this_dir = *dirs;