]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/gssd/gssd_proc.c
Add option to specify directory to search for credentials cache files
[nfs-utils.git] / utils / gssd / gssd_proc.c
index 78919b8ea9532bfc094fd8478adaab36a0a39ecd..4c3d85da766ebdef5f1352ada8c0c6f8f2fbd9b9 100644 (file)
@@ -436,6 +436,8 @@ int create_auth_rpc_client(struct clnt_info *clp,
        int                     sockp = RPC_ANYSOCK;
        int                     sendsz = 32768, recvsz = 32768;
        struct addrinfo         ai_hints, *a = NULL;
+       char                    service[64];
+       char                    *at_sign;
 
        sec.qop = GSS_C_QOP_DEFAULT;
        sec.svc = RPCSEC_GSS_SVC_NONE;
@@ -505,8 +507,21 @@ int create_auth_rpc_client(struct clnt_info *clp,
                goto out_fail;
        }
 
-       errcode = getaddrinfo(clp->servername, "nfs",
-                             &ai_hints, &a);
+       /* extract the service name from clp->servicename */
+       if ((at_sign = strchr(clp->servicename, '@')) == NULL) {
+               printerr(0, "WARNING: servicename (%s) not formatted as "
+                       "expected with service@host", clp->servicename);
+               goto out_fail;
+       }
+       if ((at_sign - clp->servicename) >= sizeof(service)) {
+               printerr(0, "WARNING: service portion of servicename (%s) "
+                       "is too long!", clp->servicename);
+               goto out_fail;
+       }
+       strncpy(service, clp->servicename, at_sign - clp->servicename);
+       service[at_sign - clp->servicename] = '\0';
+
+       errcode = getaddrinfo(clp->servername, service, &ai_hints, &a);
        if (errcode) {
                printerr(0, "WARNING: Error from getaddrinfo for server "
                         "'%s': %s", clp->servername, gai_strerror(errcode));
@@ -673,7 +688,7 @@ handle_krb5_upcall(struct clnt_info *clp)
                goto out_return_error;
        }
 
-       if (serialize_context_for_kernel(pd.pd_ctx, &token)) {
+       if (serialize_context_for_kernel(pd.pd_ctx, &token, &krb5oid)) {
                printerr(0, "WARNING: Failed to serialize krb5 context for "
                            "user with uid %d for server %s\n",
                         uid, clp->servername);
@@ -728,7 +743,7 @@ handle_spkm3_upcall(struct clnt_info *clp)
                goto out_return_error;
        }
 
-       if (serialize_context_for_kernel(pd.pd_ctx, &token)) {
+       if (serialize_context_for_kernel(pd.pd_ctx, &token, &spkm3oid)) {
                printerr(0, "WARNING: Failed to serialize spkm3 context for "
                            "user with uid %d for server\n",
                         uid, clp->servername);