@@ -142,7 +142,11 @@ impl SysusersEntry {
142
142
. or_else ( || id. map ( |id| ( id, id) ) )
143
143
. map ( |( uid, gid) | ( Some ( uid) , Some ( gid) ) )
144
144
. 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 ( ) ) ?;
146
150
let pgid = pgid. map ( |id| id. parse ( ) ) . transpose ( ) . map_err ( |_| err ( ) ) ?;
147
151
let ( gecos, s) = Self :: next_token_owned ( s) . ok_or_else ( err. clone ( ) ) ?;
148
152
let ( home, s) = Self :: next_optional_token_owned ( s) . unwrap_or_default ( ) ;
@@ -388,6 +392,7 @@ mod tests {
388
392
/// Non-default sysusers found in the wild
389
393
const OTHER_SYSUSERS_REF : & str = indoc ! { r#"
390
394
u qemu 107:qemu "qemu user" - -
395
+ u vboxadd -:1 - /var/run/vboxadd -
391
396
"# } ;
392
397
393
398
fn parse_all ( s : & str ) -> impl Iterator < Item = SysusersEntry > + use < ' _ > {
@@ -458,6 +463,17 @@ mod tests {
458
463
shell: None
459
464
}
460
465
) ;
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
+ ) ;
461
477
assert_eq ! ( entries. count( ) , 0 ) ;
462
478
463
479
Ok ( ( ) )
0 commit comments