You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by id...@apache.org on 2014/08/04 21:10:17 UTC

git commit: Fix stout/os to properly check errno from getpwnam_r. Support some Linux systems (e.g., RHEL7) which return non-zero and set errno to indicate a user or group was not found.

Repository: mesos
Updated Branches:
  refs/heads/master 46f1aebde -> 81d830f50


Fix stout/os to properly check errno from getpwnam_r.
Support some Linux systems (e.g., RHEL7) which return non-zero and set
errno to indicate a user or group was not found.

Review: https://reviews.apache.org/r/24249


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/81d830f5
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/81d830f5
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/81d830f5

Branch: refs/heads/master
Commit: 81d830f502f99290e4c9fd00f231f0b9fff6b591
Parents: 46f1aeb
Author: Ian Downes <id...@twitter.com>
Authored: Mon Aug 4 11:36:52 2014 -0700
Committer: Ian Downes <id...@twitter.com>
Committed: Mon Aug 4 11:55:21 2014 -0700

----------------------------------------------------------------------
 .../3rdparty/stout/include/stout/os.hpp         | 30 +++++++++++++++++---
 1 file changed, 26 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/81d830f5/3rdparty/libprocess/3rdparty/stout/include/stout/os.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os.hpp
index 0117fa5..4d67186 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/os.hpp
@@ -651,8 +651,8 @@ inline Result<uid_t> getuid(const Option<std::string>& user = None())
     char* buffer = new char[size];
 
     if (getpwnam_r(user.get().c_str(), &passwd, buffer, size, &result) == 0) {
-      // getpwnam_r will return 0 but set result == NULL if the user
-      // is not found.
+      // The usual interpretation of POSIX is that getpwnam_r will
+      // return 0 but set result == NULL if the user is not found.
       if (result == NULL) {
         delete[] buffer;
         return None();
@@ -662,6 +662,17 @@ inline Result<uid_t> getuid(const Option<std::string>& user = None())
       delete[] buffer;
       return uid;
     } else {
+      // RHEL7 (and possibly other systems) will return non-zero and
+      // set one of the following errors for "The given name or uid
+      // was not found." See 'man getpwnam_r'. We only check for the
+      // errors explicitly listed, and do not consider the ellipsis.
+      if (errno == ENOENT ||
+          errno == ESRCH ||
+          errno == EBADF ||
+          errno == EPERM) {
+        return None();
+      }
+
       if (errno != ERANGE) {
         delete[] buffer;
         return ErrnoError("Failed to get username information");
@@ -695,8 +706,8 @@ inline Result<gid_t> getgid(const Option<std::string>& user = None())
     char* buffer = new char[size];
 
     if (getpwnam_r(user.get().c_str(), &passwd, buffer, size, &result) == 0) {
-      // getpwnam_r will return 0 but set result == NULL if the user
-      // is not found.
+      // The usual interpretation of POSIX is that getpwnam_r will
+      // return 0 but set result == NULL if the group is not found.
       if (result == NULL) {
         delete[] buffer;
         return None();
@@ -706,6 +717,17 @@ inline Result<gid_t> getgid(const Option<std::string>& user = None())
       delete[] buffer;
       return gid;
     } else {
+      // RHEL7 (and possibly other systems) will return non-zero and
+      // set one of the following errors for "The given name or uid
+      // was not found." See 'man getpwnam_r'. We only check for the
+      // errors explicitly listed, and do not consider the ellipsis.
+      if (errno == ENOENT ||
+          errno == ESRCH ||
+          errno == EBADF ||
+          errno == EPERM) {
+        return None();
+      }
+
       if (errno != ERANGE) {
         delete[] buffer;
         return ErrnoError("Failed to get username information");