Fix do_exec's permission checking.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2181 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/ume.c b/coregrind/ume.c
index 86faf62..bda2100 100644
--- a/coregrind/ume.c
+++ b/coregrind/ume.c
@@ -646,18 +646,27 @@
 	 return EACCES;
       }
 
-      if (uid == st.st_uid && !(st.st_mode & S_IXUSR))
-	 return EACCES;
-
-      if (gid == st.st_gid && !(st.st_mode & S_IXGRP))
-	 return EACCES;
-
-      for(i = 0; i < ngrp; i++)
-	 if (groups[i] == st.st_gid && !(st.st_mode & S_IXGRP))
+      if (uid == st.st_uid) {
+	 if (!(st.st_mode & S_IXUSR))
 	    return EACCES;
+      } else {
+	 int grpmatch = 0;
 
-      if (!(st.st_mode & S_IXOTH))
-	 return EACCES;
+	 if (gid == st.st_gid)
+	    grpmatch = 1;
+	 else 
+	    for(i = 0; i < ngrp; i++)
+	       if (groups[i] == st.st_gid) {
+		  grpmatch = 1;
+		  break;
+	       }
+
+	 if (grpmatch) {
+	    if (!(st.st_mode & S_IXGRP))
+	       return EACCES;
+	 } else if (!(st.st_mode & S_IXOTH))
+	    return EACCES;
+      }
    }
 
    bufsz = pread(fd, buf, sizeof(buf), 0);