When we  call getgrgid_r()  to  verify whether the corresponding gid is
existent, if not, getgrgid_r() will return 0 or ENOENT or ESRCH or
EBADF or EPERM...

But tst_get_unused_gid() only check return value 0, this is not complete.
For example, if the gid is not existent, getgrgid_r() in RHEL7 beta will
return ENOENT, which will cause tst_get_unused_gid failed incorrectly.
This is the same for getpwuid_r().

We should make tst_get_unused_uid/tst_get_unused_gid check all the possible
return value.

Signed-off-by: Zeng Linggang <[email protected]>
---
 lib/tst_uid_gid.c | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/lib/tst_uid_gid.c b/lib/tst_uid_gid.c
index 3ba1ad6..a835c38 100644
--- a/lib/tst_uid_gid.c
+++ b/lib/tst_uid_gid.c
@@ -16,6 +16,7 @@
  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <errno.h>
 #include <grp.h>
 #include <limits.h>
 #include <pwd.h>
@@ -44,10 +45,21 @@ uid_t tst_get_unused_uid(void)
                s = getpwuid_r(uid, &pwd, buf, bufsize, &result);
                if (result == NULL) {
                        free(buf);
-                       if (s == 0)
+                       /*
+                        * When the given name or gid was not found, getgrgid_r
+                        * may return 0 or ENOENT or ESRCH or EBADF or EPERM
+                        * or ...
+                        */
+                       switch (s) {
+                       case 0:
+                       case ENOENT:
+                       case ESRCH:
+                       case EBADF:
+                       case EPERM:
                                return uid;
-                       else
+                       default:
                                return -1;
+                       }
                }
        }
 
@@ -76,10 +88,21 @@ gid_t tst_get_unused_gid(void)
                s = getgrgid_r(gid, &grp, buf, bufsize, &result);
                if (result == NULL) {
                        free(buf);
-                       if (s == 0)
+                       /*
+                        * When the given name or gid was not found, getgrgid_r
+                        * may return 0 or ENOENT or ESRCH or EBADF or EPERM
+                        * or ...
+                        */
+                       switch (s) {
+                       case 0:
+                       case ENOENT:
+                       case ESRCH:
+                       case EBADF:
+                       case EPERM:
                                return gid;
-                       else
+                       default:
                                return -1;
+                       }
                }
        }
 
-- 
1.8.4.2




------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to