Skip to content

Commit 0b4a83b

Browse files
committed
Filter already tracked directories from ldcache update
Signed-off-by: Evan Lezar <elezar@nvidia.com>
1 parent e6eaa43 commit 0b4a83b

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed

internal/ldconfig/ldconfig.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package ldconfig
1919

2020
import (
21+
"bufio"
2122
"fmt"
2223
"os"
2324
"os/exec"
@@ -75,6 +76,11 @@ func (l *Ldconfig) UpdateLDCache(directories ...string) error {
7576
return err
7677
}
7778

79+
filteredDirectories, err := l.filterDirectories(directories...)
80+
if err != nil {
81+
return err
82+
}
83+
7884
args := []string{
7985
filepath.Base(ldconfigPath),
8086
// Explicitly specify using /etc/ld.so.conf since the host's ldconfig may
@@ -83,13 +89,64 @@ func (l *Ldconfig) UpdateLDCache(directories ...string) error {
8389
"-C", "/etc/ld.so.cache",
8490
}
8591

86-
if err := createLdsoconfdFile(ldsoconfdFilenamePattern, directories...); err != nil {
92+
if err := createLdsoconfdFile(ldsoconfdFilenamePattern, filteredDirectories...); err != nil {
8793
return fmt.Errorf("failed to update ld.so.conf.d: %w", err)
8894
}
8995

9096
return SafeExec(ldconfigPath, args, nil)
9197
}
9298

99+
func (l *Ldconfig) filterDirectories(directories ...string) ([]string, error) {
100+
processedConfFiles := make(map[string]bool)
101+
ldconfigFilenames := []string{"/etc/ld.so.conf"}
102+
103+
ldconfigDirs := make(map[string]string)
104+
for len(ldconfigFilenames) > 0 {
105+
ldconfigFilename := ldconfigFilenames[0]
106+
ldconfigFilenames = ldconfigFilenames[1:]
107+
if processedConfFiles[ldconfigFilename] {
108+
continue
109+
}
110+
processedConfFiles[ldconfigFilename] = true
111+
112+
if len(ldconfigFilename) == 0 {
113+
continue
114+
}
115+
116+
ldsoconf, err := os.Open(ldconfigFilename)
117+
if err != nil {
118+
return nil, err
119+
}
120+
defer ldsoconf.Close()
121+
122+
scanner := bufio.NewScanner(ldsoconf)
123+
for scanner.Scan() {
124+
line := strings.TrimSpace(scanner.Text())
125+
switch {
126+
case strings.HasPrefix(line, "#") || len(line) == 0:
127+
continue
128+
case strings.HasPrefix(line, "include "):
129+
includes, err := filepath.Glob(strings.TrimPrefix(line, "include "))
130+
if err != nil {
131+
return nil, err
132+
}
133+
ldconfigFilenames = append(ldconfigFilenames, includes...)
134+
default:
135+
ldconfigDirs[line] = ldconfigFilename
136+
}
137+
}
138+
}
139+
140+
var filtered []string
141+
for _, d := range directories {
142+
if _, ok := ldconfigDirs[d]; ok {
143+
continue
144+
}
145+
filtered = append(filtered, d)
146+
}
147+
return filtered, nil
148+
}
149+
93150
func (l *Ldconfig) prepareRoot() (string, error) {
94151
// To prevent leaking the parent proc filesystem, we create a new proc mount
95152
// in the specified root.

0 commit comments

Comments
 (0)