@@ -106,51 +106,104 @@ func GetKernelModules(modulesPath string,
106106 symmap .Add (libpf.Symbol {
107107 Name : "vmlinux" ,
108108 Address : stext .Address ,
109- Size : int (etext .Address - stext .Address ),
109+ Size : uint64 (etext .Address - stext .Address ),
110110 })
111111
112- atLeastOneValidAddress := false
113- count := 0
112+ modules , err := parseKernelModules (bufio .NewScanner (file ))
113+ if err != nil {
114+ return nil , fmt .Errorf ("failed to parse kernel modules: %v" , err )
115+ }
114116
115- var scanner = bufio .NewScanner (file )
116- for scanner .Scan () {
117- var size , address uint64
118- var refcount int64
119- var name , dependencies , state string
117+ for _ , kmod := range modules {
118+ symmap .Add (libpf.Symbol {
119+ Name : libpf .SymbolName (kmod .name ),
120+ Address : libpf .SymbolValue (kmod .address ),
121+ Size : kmod .size ,
122+ })
123+ }
124+
125+ symmap .Finalize ()
126+
127+ return & symmap , nil
128+ }
129+
130+ func parseKernelModules (scanner * bufio.Scanner ) ([]kernelModule , error ) {
131+ var (
132+ modules []kernelModule
133+ atLeastOneValidAddress = false
134+ count = 0
135+ )
120136
137+ for scanner .Scan () {
121138 line := scanner .Text ()
122139
123140 count ++
124141
125- nFields , err := fmt .Sscanf (line , "%s %d %d %s %s 0x%x" ,
126- & name , & size , & refcount , & dependencies , & state , & address )
142+ kmod , err := parseKernelModuleLine (line )
127143 if err != nil {
128- log .Warnf ("err parsing line in modules: '%s'" , err )
129- continue
130- }
131- if nFields < 6 {
132- log .Warnf ("unexpected line in modules: '%s'" , line )
133- continue
144+ return nil , fmt .Errorf ("failed to parse kernel module line: %v" , err )
134145 }
135- if address == 0 {
146+ if kmod . address == 0 {
136147 continue
137148 }
138149 atLeastOneValidAddress = true
139150
140- symmap .Add (libpf.Symbol {
141- Name : libpf .SymbolName (name ),
142- Address : libpf .SymbolValue (address ),
143- Size : int (size ),
144- })
151+ modules = append (modules , kmod )
145152 }
146153
147154 if count > 0 && ! atLeastOneValidAddress {
148155 return nil , errors .New ("addresses from all modules is zero - check process permissions" )
149156 }
150157
151- symmap .Finalize ()
158+ return modules , nil
159+ }
152160
153- return & symmap , nil
161+ type kernelModule struct {
162+ name string
163+ size uint64
164+ address uint64
165+ }
166+
167+ func parseKernelModuleLine (line string ) (kernelModule , error ) {
168+ // The format is: "name size refcount dependencies state address"
169+ parts := strings .SplitN (line , " " , 6 )
170+ if len (parts ) < 6 {
171+ return kernelModule {}, fmt .Errorf ("unexpected line in modules: '%s'" , line )
172+ }
173+
174+ size , err := parseSize (parts [1 ])
175+ if err != nil {
176+ return kernelModule {}, fmt .Errorf ("failed to parse size value: '%s'" , parts [1 ])
177+ }
178+
179+ address , err := parseAddress (parts [5 ])
180+ if err != nil {
181+ return kernelModule {}, fmt .Errorf ("failed to parse address value: '%s'" , parts [5 ])
182+ }
183+
184+ return kernelModule {
185+ name : parts [0 ],
186+ size : size ,
187+ address : address ,
188+ }, nil
189+ }
190+
191+ func parseAddress (addressStr string ) (uint64 , error ) {
192+ address , err := strconv .ParseUint (strings .TrimPrefix (addressStr , "0x" ), 16 , 64 )
193+ if err != nil {
194+ return 0 , fmt .Errorf ("failed to parse address as hex value: '%s'" , addressStr )
195+ }
196+
197+ return address , nil
198+ }
199+
200+ func parseSize (sizeStr string ) (uint64 , error ) {
201+ size , err := strconv .ParseUint (sizeStr , 10 , 64 )
202+ if err != nil {
203+ return 0 , fmt .Errorf ("failed to parse size int value: %q" , sizeStr )
204+ }
205+
206+ return size , nil
154207}
155208
156209// IsPIDLive checks if a PID belongs to a live process. It will never produce a false negative but
0 commit comments