@@ -56,13 +56,13 @@ type IDMap struct {
5656 Count int64
5757}
5858
59- func parseLine (line []byte , v ... any ) {
60- parseParts (bytes .Split (line , []byte (":" )), v ... )
59+ func parseLine (line []byte , v ... any ) error {
60+ return parseParts (bytes .Split (line , []byte (":" )), v ... )
6161}
6262
63- func parseParts (parts [][]byte , v ... any ) {
63+ func parseParts (parts [][]byte , v ... any ) error {
6464 if len (parts ) == 0 {
65- return
65+ return nil
6666 }
6767
6868 for i , p := range parts {
@@ -78,10 +78,24 @@ func parseParts(parts [][]byte, v ...any) {
7878 case * string :
7979 * e = string (p )
8080 case * int :
81- // "numbers", with conversion errors ignored because of some misbehaving configuration files.
82- * e , _ = strconv .Atoi (string (p ))
81+ if len (p ) != 0 {
82+ n , ok , err := parseNumeric (string (p ))
83+ if err != nil {
84+ return fmt .Errorf ("parsing integer field %d: %w" , i , err )
85+ }
86+ if ! ok {
87+ return fmt .Errorf ("parsing integer field %d: %q is not numeric" , i , p )
88+ }
89+ * e = n
90+ }
8391 case * int64 :
84- * e , _ = strconv .ParseInt (string (p ), 10 , 64 )
92+ if len (p ) != 0 {
93+ n , err := strconv .ParseInt (string (p ), 10 , 64 )
94+ if err != nil {
95+ return fmt .Errorf ("parsing integer field %d: %w" , i , err )
96+ }
97+ * e = n
98+ }
8599 case * []string :
86100 // Comma-separated lists.
87101 if len (p ) != 0 {
@@ -94,6 +108,7 @@ func parseParts(parts [][]byte, v ...any) {
94108 panic (fmt .Sprintf ("parseLine only accepts {*string, *int, *int64, *[]string} as arguments! %#v is not a pointer!" , e ))
95109 }
96110 }
111+ return nil
97112}
98113
99114func ParsePasswdFile (path string ) ([]User , error ) {
@@ -135,7 +150,9 @@ func ParsePasswdFilter(r io.Reader, filter func(User) bool) ([]User, error) {
135150 // root:x:0:0:root:/root:/bin/bash
136151 // adm:x:3:4:adm:/var/adm:/bin/false
137152 p := User {}
138- parseLine (line , & p .Name , & p .Pass , & p .Uid , & p .Gid , & p .Gecos , & p .Home , & p .Shell )
153+ if err := parseLine (line , & p .Name , & p .Pass , & p .Uid , & p .Gid , & p .Gecos , & p .Home , & p .Shell ); err != nil {
154+ return nil , err
155+ }
139156
140157 if filter == nil || filter (p ) {
141158 out = append (out , p )
@@ -194,7 +211,9 @@ func ParseGroupFilter(r io.Reader, filter func(Group) bool) ([]Group, error) {
194211 // root:x:0:root
195212 // adm:x:4:root,adm,daemon
196213 p := Group {}
197- parseLine (line , & p .Name , & p .Pass , & p .Gid , & p .List )
214+ if err := parseLine (line , & p .Name , & p .Pass , & p .Gid , & p .List ); err != nil {
215+ return nil , err
216+ }
198217
199218 if filter == nil || filter (p ) {
200219 out = append (out , p )
@@ -539,7 +558,9 @@ func ParseSubIDFilter(r io.Reader, filter func(SubID) bool) ([]SubID, error) {
539558
540559 // see: man 5 subuid
541560 p := SubID {}
542- parseLine (line , & p .Name , & p .SubID , & p .Count )
561+ if err := parseLine (line , & p .Name , & p .SubID , & p .Count ); err != nil {
562+ return nil , err
563+ }
543564
544565 if filter == nil || filter (p ) {
545566 out = append (out , p )
@@ -587,7 +608,9 @@ func ParseIDMapFilter(r io.Reader, filter func(IDMap) bool) ([]IDMap, error) {
587608
588609 // see: man 7 user_namespaces
589610 p := IDMap {}
590- parseParts (bytes .Fields (line ), & p .ID , & p .ParentID , & p .Count )
611+ if err := parseParts (bytes .Fields (line ), & p .ID , & p .ParentID , & p .Count ); err != nil {
612+ return nil , err
613+ }
591614
592615 if filter == nil || filter (p ) {
593616 out = append (out , p )
0 commit comments