1818package ldconfig
1919
2020import (
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+
93150func (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