summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/sunrpc/auth_gss/auth_gss.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index be8f103d22fd..1943e1198804 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -284,7 +284,12 @@ err:
284 return p; 284 return p;
285} 285}
286 286
287#define UPCALL_BUF_LEN 128 287/* XXX: Need some documentation about why UPCALL_BUF_LEN is so small.
288 * Is user space expecting no more than UPCALL_BUF_LEN bytes?
289 * Note that there are now _two_ NI_MAXHOST sized data items
290 * being passed in this string.
291 */
292#define UPCALL_BUF_LEN 256
288 293
289struct gss_upcall_msg { 294struct gss_upcall_msg {
290 refcount_t count; 295 refcount_t count;
@@ -462,8 +467,17 @@ static int gss_encode_v1_msg(struct gss_upcall_msg *gss_msg,
462 p += len; 467 p += len;
463 gss_msg->msg.len += len; 468 gss_msg->msg.len += len;
464 } 469 }
465 if (service_name != NULL) { 470 if (service_name) {
466 len = scnprintf(p, buflen, "service=%s ", service_name); 471 char *c = strchr(service_name, '@');
472
473 if (!c)
474 len = scnprintf(p, buflen, "service=%s ",
475 service_name);
476 else
477 len = scnprintf(p, buflen,
478 "service=%.*s srchost=%s ",
479 (int)(c - service_name),
480 service_name, c + 1);
467 buflen -= len; 481 buflen -= len;
468 p += len; 482 p += len;
469 gss_msg->msg.len += len; 483 gss_msg->msg.len += len;