From Kevin Coffman Initialize mech to null to avoid segfault if an error occurs and mech is never returned from gss_accept_sec_context. --- nfs-utils-1.0.7-kwc/utils/svcgssd/svcgssd_proc.c | 28 +++++++++++++++-------- 1 files changed, 19 insertions(+), 9 deletions(-) diff -puN utils/svcgssd/svcgssd_proc.c~svcgssd_error_reporting utils/svcgssd/svcgssd_proc.c --- nfs-utils-1.0.7/utils/svcgssd/svcgssd_proc.c~svcgssd_error_reporting 2005-10-18 15:16:07.871119000 -0400 +++ nfs-utils-1.0.7-kwc/utils/svcgssd/svcgssd_proc.c 2005-10-18 15:52:26.158469000 -0400 @@ -189,25 +189,37 @@ get_ids(gss_name_t client_name, gss_OID char *sname; int res = -1; uid_t uid, gid; - gss_OID name_type; + gss_OID name_type = GSS_C_NO_OID; char *secname; gid_t *groups; maj_stat = gss_display_name(&min_stat, client_name, &name, &name_type); - if (maj_stat != GSS_S_COMPLETE) + if (maj_stat != GSS_S_COMPLETE) { + pgsserr("get_ids: gss_display_name", + maj_stat, min_stat, mech); goto out; - if (!(sname = calloc(name.length + 1, 1))) + } + if (!(sname = calloc(name.length + 1, 1))) { + printerr(0, "WARNING: get_ids: error allocating %d bytes " + "for sname\n", name.length + 1); goto out; + } memcpy(sname, name.value, name.length); printerr(1, "sname = %s\n", sname); res = -EINVAL; - if ((secname = mech2file(mech)) == NULL) + if ((secname = mech2file(mech)) == NULL) { + printerr(0, "WARNING: get_ids: error mapping mech to " + "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) + if (res < 0) { + printerr(0, "WARNING: get_ids: unable to map " + "name '%s' to a uid\n", sname); goto out_free; + } cred->cr_uid = uid; cred->cr_gid = gid; add_supplementary_groups(secname, sname, cred); @@ -215,8 +227,6 @@ get_ids(gss_name_t client_name, gss_OID out_free: free(sname); out: - if (res) - printerr(0, "WARNING: get_uid failed\n"); return res; } @@ -275,7 +285,7 @@ handle_nullreq(FILE *f) { u_int32_t ret_flags; gss_ctx_id_t ctx = GSS_C_NO_CONTEXT; gss_name_t client_name; - gss_OID mech; + gss_OID mech = GSS_C_NO_OID; u_int32_t maj_stat = GSS_S_FAILURE, min_stat = 0; struct svc_cred cred; static char *lbuf = NULL; @@ -327,7 +337,7 @@ handle_nullreq(FILE *f) { goto out_err; } if (get_ids(client_name, mech, &cred)) { - printerr(0, "WARNING: handle_nullreq: get_uid failed\n"); + /* get_ids() prints error msg */ maj_stat = GSS_S_BAD_NAME; /* XXX ? */ goto out_err; } _