]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
- fixed use of getpwuid_r, getpwnam_r and getgrnam_r 288/head
authorArvin Schnell <aschnell@suse.de>
Wed, 2 Nov 2016 21:18:26 +0000 (22:18 +0100)
committerArvin Schnell <aschnell@suse.de>
Wed, 2 Nov 2016 21:18:26 +0000 (22:18 +0100)
package/snapper.changes
snapper/AppUtil.cc

index 2404f8c34d75f14d880349c8d99329470924122e..821ffa6ef53973f1e8906ecf03edc78428a2ed43 100644 (file)
@@ -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
 
index df3b0afa64fa479525769dbf23075fd503a9d498..052235d5e63748bc32646613530324034199d853 100644 (file)
@@ -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<char> 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<char> 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<char> 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;