summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobbie Harwood <rharwood@redhat.com>2016-06-03 14:30:36 +0000
committerSimo Sorce <simo@redhat.com>2016-06-07 04:31:57 -0400
commitbbda272145ebbe0cbb65467c1573e583b9e1b7c7 (patch)
treedb1e33b8c2b645c28af309a420bc44cb0f247e65
parentb5d1a189da2037d87283eac8998af4bfb1aefa79 (diff)
Use new socket if uid, pid, or gid changes
The gssproxy daemon uses SO_PEERCRED to determine credentials of the connecting process. However, these credentials are set only at the time connect has called. Therefore they must be reset every time uid or pid changes. For completeness, we check gid as well. Signed-off-by: Robbie Harwood <rharwood@redhat.com> Reviewed-by: Simo Sorce <simo@redhat.com> Closes #27
-rw-r--r--proxy/src/client/gpm_common.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/proxy/src/client/gpm_common.c b/proxy/src/client/gpm_common.c
index cb4ccdb..0a54dbc 100644
--- a/proxy/src/client/gpm_common.c
+++ b/proxy/src/client/gpm_common.c
@@ -13,6 +13,12 @@
struct gpm_ctx {
pthread_mutex_t lock;
int fd;
+
+ /* these are only meaningful if fd != -1 */
+ pid_t pid;
+ uid_t uid;
+ gid_t gid;
+
int next_xid;
};
@@ -93,6 +99,9 @@ done:
}
}
gpmctx->fd = fd;
+ gpmctx->pid = getpid();
+ gpmctx->uid = geteuid();
+ gpmctx->gid = getegid();
return ret;
}
@@ -120,12 +129,25 @@ static void gpm_close_socket(struct gpm_ctx *gpmctx)
static int gpm_grab_sock(struct gpm_ctx *gpmctx)
{
int ret;
+ pid_t p;
+ uid_t u;
+ gid_t g;
ret = pthread_mutex_lock(&gpmctx->lock);
if (ret) {
return ret;
}
+ /* Detect fork / setresuid and friends */
+ p = getpid();
+ u = geteuid();
+ g = getegid();
+
+ if (gpmctx->fd != -1 &&
+ (p != gpmctx->pid || u != gpmctx->uid || g != gpmctx->gid)) {
+ gpm_close_socket(gpmctx);
+ }
+
if (gpmctx->fd == -1) {
ret = gpm_open_socket(gpmctx);
}