diff options
author | wdsgyj <gongbo.guan@momenta.ai> | 2022-09-25 02:17:51 +0800 |
---|---|---|
committer | wdsgyj <gongbo.guan@momenta.ai> | 2022-09-25 02:17:51 +0800 |
commit | 9b232dd5815c9f78d13e061a407468a6fad53142 (patch) | |
tree | 094d665b3b249853e9153ead9eff53dc6bf83757 | |
parent | be36bf05478ac40f92a01e1e8ec6aa11fad65d1f (diff) | |
download | nix-9b232dd5815c9f78d13e061a407468a6fad53142.zip |
fix crash on Android platform
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/unistd.rs | 10 |
2 files changed, 7 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 5982d70c..7356b005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ This project adheres to [Semantic Versioning](https://semver.org/). - Fix `User::from_name` and `Group::from_name` panicking when given a name containing a nul. ([#1815](https://github.com/nix-rust/nix/pull/1815)) +- Fix `User::from_uid` and `User::from_name` crash on Android platform. + ([#1824](https://github.com/nix-rust/nix/pull/1824)) ### Removed diff --git a/src/unistd.rs b/src/unistd.rs index 63795cac..e7a64dab 100644 --- a/src/unistd.rs +++ b/src/unistd.rs @@ -2984,12 +2984,12 @@ impl From<&libc::passwd> for User { fn from(pw: &libc::passwd) -> User { unsafe { User { - name: CStr::from_ptr(pw.pw_name).to_string_lossy().into_owned(), - passwd: CString::new(CStr::from_ptr(pw.pw_passwd).to_bytes()).unwrap(), + name: if pw.pw_name.is_null() { Default::default() } else { CStr::from_ptr(pw.pw_name).to_string_lossy().into_owned() }, + passwd: if pw.pw_passwd.is_null() { Default::default() } else { CString::new(CStr::from_ptr(pw.pw_passwd).to_bytes()).unwrap() }, #[cfg(not(all(target_os = "android", target_pointer_width = "32")))] - gecos: CString::new(CStr::from_ptr(pw.pw_gecos).to_bytes()).unwrap(), - dir: PathBuf::from(OsStr::from_bytes(CStr::from_ptr(pw.pw_dir).to_bytes())), - shell: PathBuf::from(OsStr::from_bytes(CStr::from_ptr(pw.pw_shell).to_bytes())), + gecos: if pw.pw_gecos.is_null() { Default::default() } else { CString::new(CStr::from_ptr(pw.pw_gecos).to_bytes()).unwrap() }, + dir: if pw.pw_dir.is_null() { Default::default() } else { PathBuf::from(OsStr::from_bytes(CStr::from_ptr(pw.pw_dir).to_bytes())) }, + shell: if pw.pw_shell.is_null() { Default::default() } else { PathBuf::from(OsStr::from_bytes(CStr::from_ptr(pw.pw_shell).to_bytes())) }, uid: Uid::from_raw(pw.pw_uid), gid: Gid::from_raw(pw.pw_gid), #[cfg(not(any(target_os = "android", |