@@ -142,7 +142,11 @@ impl SysusersEntry {
142142 . or_else ( || id. map ( |id| ( id, id) ) )
143143 . map ( |( uid, gid) | ( Some ( uid) , Some ( gid) ) )
144144 . unwrap_or ( ( None , None ) ) ;
145- let uid = uid. map ( |id| id. parse ( ) ) . transpose ( ) . map_err ( |_| err ( ) ) ?;
145+ let uid = uid
146+ . filter ( |& v| v != "-" )
147+ . map ( |id| id. parse ( ) )
148+ . transpose ( )
149+ . map_err ( |_| err ( ) ) ?;
146150 let pgid = pgid. map ( |id| id. parse ( ) ) . transpose ( ) . map_err ( |_| err ( ) ) ?;
147151 let ( gecos, s) = Self :: next_token_owned ( s) . ok_or_else ( err. clone ( ) ) ?;
148152 let ( home, s) = Self :: next_optional_token_owned ( s) . unwrap_or_default ( ) ;
@@ -388,6 +392,7 @@ mod tests {
388392 /// Non-default sysusers found in the wild
389393 const OTHER_SYSUSERS_REF : & str = indoc ! { r#"
390394 u qemu 107:qemu "qemu user" - -
395+ u vboxadd -:1 - /var/run/vboxadd -
391396 "# } ;
392397
393398 fn parse_all ( s : & str ) -> impl Iterator < Item = SysusersEntry > + use < ' _ > {
@@ -458,6 +463,17 @@ mod tests {
458463 shell: None
459464 }
460465 ) ;
466+ assert_eq ! (
467+ entries. next( ) . unwrap( ) ,
468+ SysusersEntry :: User {
469+ name: "vboxadd" . into( ) ,
470+ uid: None ,
471+ pgid: Some ( 1 . into( ) ) ,
472+ gecos: "-" . into( ) ,
473+ home: Some ( "/var/run/vboxadd" . into( ) ) ,
474+ shell: None
475+ }
476+ ) ;
461477 assert_eq ! ( entries. count( ) , 0 ) ;
462478
463479 Ok ( ( ) )
0 commit comments