X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fgssd%2Fsvcgssd_proc.c;h=7a916d718033e0cbf663e90a42e766640db57219;hp=f1bfbef7b57a3b63428c3ab278e97c31966252ff;hb=d6c1b35c;hpb=b695dbb65bb199e3a9ed5a9f780ed2e575061b46 diff --git a/utils/gssd/svcgssd_proc.c b/utils/gssd/svcgssd_proc.c index f1bfbef..7a916d7 100644 --- a/utils/gssd/svcgssd_proc.c +++ b/utils/gssd/svcgssd_proc.c @@ -57,6 +57,7 @@ #include "err_util.h" #include "context.h" #include "gss_oids.h" +#include "svcgssd_krb5.h" extern char * mech2file(gss_OID mech); #define SVCGSSD_CONTEXT_CHANNEL "/proc/net/rpc/auth.rpcsec.context/channel" @@ -132,7 +133,7 @@ struct gss_verifier { #define RPCSEC_GSS_SEQ_WIN 5 static int -send_response(FILE *f, gss_buffer_desc *in_handle, gss_buffer_desc *in_token, +send_response(gss_buffer_desc *in_handle, gss_buffer_desc *in_token, u_int32_t maj_stat, u_int32_t min_stat, gss_buffer_desc *out_handle, gss_buffer_desc *out_token) { @@ -241,7 +242,7 @@ get_ids(gss_name_t client_name, gss_OID mech, struct svc_cred *cred) "file for name '%s'\n", sname); goto out_free; } - nfs4_init_name_mapping(NULL); /* XXX: should only do this once */ + res = nfs4_gss_princ_to_ids(secname, sname, &uid, &gid); if (res < 0) { /* @@ -431,12 +432,6 @@ handle_nullreq(FILE *f) { print_hexl("in_tok", in_tok.value, in_tok.length); #endif - if (in_tok.length < 0) { - printerr(0, "WARNING: handle_nullreq: " - "failed parsing request\n"); - goto out_err; - } - if (in_handle.length != 0) { /* CONTINUE_INIT case */ if (in_handle.length != sizeof(ctx)) { printerr(0, "WARNING: handle_nullreq: " @@ -449,6 +444,10 @@ handle_nullreq(FILE *f) { memcpy(&ctx, in_handle.value, in_handle.length); } + if (svcgssd_limit_krb5_enctypes()) { + goto out_err; + } + maj_stat = gss_accept_sec_context(&min_stat, &ctx, gssd_creds, &in_tok, GSS_C_NO_CHANNEL_BINDINGS, &client_name, &mech, &out_tok, &ret_flags, NULL, NULL); @@ -498,7 +497,7 @@ handle_nullreq(FILE *f) { do_svc_downcall(&out_handle, &cred, mech, &ctx_token, ctx_endtime, hostbased_name); continue_needed: - send_response(f, &in_handle, &in_tok, maj_stat, min_stat, + send_response(&in_handle, &in_tok, maj_stat, min_stat, &out_handle, &out_tok); out: if (ctx_token.value != NULL) @@ -514,7 +513,7 @@ out: out_err: if (ctx != GSS_C_NO_CONTEXT) gss_delete_sec_context(&ignore_min_stat, &ctx, &ignore_out_tok); - send_response(f, &in_handle, &in_tok, maj_stat, min_stat, + send_response(&in_handle, &in_tok, maj_stat, min_stat, &null_token, &null_token); goto out; }