[PATCH v4 xserver 3/3] Xext: Use general OS functions to determine client command string in SELinux.

Rami Ylimäki rami.ylimaki at vincit.fi
Thu Dec 23 04:11:40 PST 2010


Signed-off-by: Rami Ylimäki <rami.ylimaki at vincit.fi>
Reviewed-by: Tiago Vignatti <tiago.vignatti at nokia.com>
---
 Xext/xselinux_hooks.c |   34 +++++++++++++++++-----------------
 1 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/Xext/xselinux_hooks.c b/Xext/xselinux_hooks.c
index 560e1e9..f1d8e5d 100644
--- a/Xext/xselinux_hooks.c
+++ b/Xext/xselinux_hooks.c
@@ -40,6 +40,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "propertyst.h"
 #include "extnsionst.h"
 #include "xacestr.h"
+#include "client.h"
 #include "../os/osdep.h"
 #define _XSELINUX_NEED_FLASK_MAP
 #include "xselinuxint.h"
@@ -129,26 +130,25 @@ SELinuxLabelClient(ClientPtr client)
 
     /* For local clients, try and determine the executable name */
     if (XaceIsLocal(client)) {
-	struct ucred creds;
-	socklen_t len = sizeof(creds);
-	char path[PATH_MAX + 1];
-	size_t bytes;
-
-	memset(&creds, 0, sizeof(creds));
-	if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &creds, &len) < 0)
-	    goto finish;
+	/* Get cached command name if CLIENTIDS is enabled. */
+	const char *cmdname = GetClientCmdName(client);
+	Bool cached = (cmdname != NULL);
+	/* If CLIENTIDS is disabled, figure out the command name from
+	 * scratch. */
+	if (!cmdname)
+	{
+	    pid_t pid = DetermineClientPid(client);
+	    if (pid != -1)
+		DetermineClientCmd(pid, &cmdname, NULL);
+	}
 
-	snprintf(path, PATH_MAX + 1, "/proc/%d/cmdline", creds.pid);
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
+	if (!cmdname)
 	    goto finish;
 
-	bytes = read(fd, path, PATH_MAX + 1);
-	close(fd);
-	if (bytes <= 0)
-	    goto finish;
+	strncpy(subj->command, cmdname, COMMAND_LEN - 1);
 
-	strncpy(subj->command, path, COMMAND_LEN - 1);
+	if (!cached)
+	    free((void *) cmdname); /* const char * */
     }
 
 finish:
-- 
1.6.3.3



More information about the xorg-devel mailing list