|
@@ -332,6 +332,7 @@ struct rsc {
|
|
|
struct svc_cred cred;
|
|
|
struct gss_svc_seq_data seqdata;
|
|
|
struct gss_ctx *mechctx;
|
|
|
+ char *client_name;
|
|
|
};
|
|
|
|
|
|
static struct cache_head *rsc_table[RSC_HASHMAX];
|
|
@@ -346,6 +347,7 @@ static void rsc_free(struct rsc *rsci)
|
|
|
gss_delete_sec_context(&rsci->mechctx);
|
|
|
if (rsci->cred.cr_group_info)
|
|
|
put_group_info(rsci->cred.cr_group_info);
|
|
|
+ kfree(rsci->client_name);
|
|
|
}
|
|
|
|
|
|
static void rsc_put(struct kref *ref)
|
|
@@ -383,6 +385,7 @@ rsc_init(struct cache_head *cnew, struct cache_head *ctmp)
|
|
|
tmp->handle.data = NULL;
|
|
|
new->mechctx = NULL;
|
|
|
new->cred.cr_group_info = NULL;
|
|
|
+ new->client_name = NULL;
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -397,6 +400,8 @@ update_rsc(struct cache_head *cnew, struct cache_head *ctmp)
|
|
|
spin_lock_init(&new->seqdata.sd_lock);
|
|
|
new->cred = tmp->cred;
|
|
|
tmp->cred.cr_group_info = NULL;
|
|
|
+ new->client_name = tmp->client_name;
|
|
|
+ tmp->client_name = NULL;
|
|
|
}
|
|
|
|
|
|
static struct cache_head *
|
|
@@ -486,6 +491,15 @@ static int rsc_parse(struct cache_detail *cd,
|
|
|
status = gss_import_sec_context(buf, len, gm, &rsci.mechctx);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
+
|
|
|
+ /* get client name */
|
|
|
+ len = qword_get(&mesg, buf, mlen);
|
|
|
+ if (len > 0) {
|
|
|
+ rsci.client_name = kstrdup(buf, GFP_KERNEL);
|
|
|
+ if (!rsci.client_name)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
rsci.h.expiry_time = expiry;
|
|
|
rscp = rsc_update(&rsci, rscp);
|
|
@@ -913,6 +927,15 @@ struct gss_svc_data {
|
|
|
struct rsc *rsci;
|
|
|
};
|
|
|
|
|
|
+char *svc_gss_principal(struct svc_rqst *rqstp)
|
|
|
+{
|
|
|
+ struct gss_svc_data *gd = (struct gss_svc_data *)rqstp->rq_auth_data;
|
|
|
+
|
|
|
+ if (gd && gd->rsci)
|
|
|
+ return gd->rsci->client_name;
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
svcauth_gss_set_client(struct svc_rqst *rqstp)
|
|
|
{
|