From a081c6c271cf568b753427967b2d835183f3418f Mon Sep 17 00:00:00 2001 From: Arvin Schnell Date: Wed, 2 Nov 2016 22:18:26 +0100 Subject: [PATCH] - fixed use of getpwuid_r, getpwnam_r and getgrnam_r --- package/snapper.changes | 5 +++++ snapper/AppUtil.cc | 35 ++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/package/snapper.changes b/package/snapper.changes index 2404f8c3..821ffa6e 100644 --- a/package/snapper.changes +++ b/package/snapper.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Wed Nov 02 22:17:16 CET 2016 - aschnell@suse.com + +- fixed use of getpwuid_r, getpwnam_r and getgrnam_r + ------------------------------------------------------------------- Tue Aug 09 21:53:02 CEST 2016 - aschnell@suse.com diff --git a/snapper/AppUtil.cc b/snapper/AppUtil.cc index df3b0afa..052235d5 100644 --- a/snapper/AppUtil.cc +++ b/snapper/AppUtil.cc @@ -292,16 +292,27 @@ namespace snapper } + long + sysconf(int name, long fallback) + { + long ret = ::sysconf(name); + return ret == -1 ? fallback : ret; + } + + bool get_uid_username_gid(uid_t uid, string& username, gid_t& gid) { struct passwd pwd; struct passwd* result; - long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); - char buf[bufsize]; + vector buf(sysconf(_SC_GETPW_R_SIZE_MAX, 1024)); - if (getpwuid_r(uid, &pwd, buf, bufsize, &result) != 0 || result != &pwd) + int e; + while ((e = getpwuid_r(uid, &pwd, buf.data(), buf.size(), &result)) == ERANGE) + buf.resize(2 * buf.size()); + + if (e != 0 || result == NULL) return false; memset(pwd.pw_passwd, 0, strlen(pwd.pw_passwd)); @@ -319,10 +330,13 @@ namespace snapper struct passwd pwd; struct passwd* result; - long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); - char buf[bufsize]; + vector buf(sysconf(_SC_GETPW_R_SIZE_MAX, 1024)); + + int e; + while ((e = getpwnam_r(username, &pwd, buf.data(), buf.size(), &result)) == ERANGE) + buf.resize(2 * buf.size()); - if (getpwnam_r(username, &pwd, buf, bufsize, &result) != 0 || result != &pwd) + if (e != 0 || result == NULL) { y2war("couldn't find username '" << username << "'"); return false; @@ -342,10 +356,13 @@ namespace snapper struct group grp; struct group* result; - long bufsize = sysconf(_SC_GETGR_R_SIZE_MAX); - char buf[bufsize]; + vector buf(sysconf(_SC_GETGR_R_SIZE_MAX, 1024)); + + int e; + while ((e = getgrnam_r(groupname, &grp, buf.data(), buf.size(), &result)) == ERANGE) + buf.resize(2 * buf.size()); - if (getgrnam_r(groupname, &grp, buf, bufsize, &result) != 0 || result != &grp) + if (e != 0 || result == NULL) { y2war("couldn't find groupname '" << groupname << "'"); return false; -- 2.47.3