Imported Upstream version 0.2.5
[platform/upstream/libtirpc.git] / src / svc_auth_gss.c
index 54b23b1..155c8de 100644 (file)
@@ -53,11 +53,11 @@ typedef struct gss_union_ctx_id_t {
 
 
 
-static bool_t  svcauth_gss_destroy();
-static bool_t   svcauth_gss_wrap();
-static bool_t   svcauth_gss_unwrap();
+static bool_t  svcauth_gss_wrap(SVCAUTH *, XDR *, xdrproc_t, caddr_t);
+static bool_t  svcauth_gss_unwrap(SVCAUTH *, XDR *, xdrproc_t, caddr_t);
+static bool_t  svcauth_gss_destroy(SVCAUTH *);
 
-struct svc_auth_ops svc_auth_gss_ops = {
+static struct svc_auth_ops svc_auth_gss_ops = {
        svcauth_gss_wrap,
        svcauth_gss_unwrap,
        svcauth_gss_destroy
@@ -79,7 +79,7 @@ struct svc_rpc_gss_data {
        ((struct svc_rpc_gss_data *)(auth)->svc_ah_private)
 
 /* Global server credentials. */
-gss_cred_id_t          _svcauth_gss_creds;
+static gss_cred_id_t   _svcauth_gss_creds;
 static gss_name_t      _svcauth_gss_name = NULL;
 
 bool_t
@@ -87,13 +87,14 @@ svcauth_gss_set_svc_name(gss_name_t name)
 {
        OM_uint32       maj_stat, min_stat;
 
-       log_debug("in svcauth_gss_set_svc_name()");
+       gss_log_debug("in svcauth_gss_set_svc_name()");
 
        if (_svcauth_gss_name != NULL) {
                maj_stat = gss_release_name(&min_stat, &_svcauth_gss_name);
 
                if (maj_stat != GSS_S_COMPLETE) {
-                       log_status("gss_release_name", maj_stat, min_stat);
+                       gss_log_status("svcauth_gss_set_svc_name: gss_release_name", 
+                               maj_stat, min_stat);
                        return (FALSE);
                }
                _svcauth_gss_name = NULL;
@@ -101,7 +102,8 @@ svcauth_gss_set_svc_name(gss_name_t name)
        maj_stat = gss_duplicate_name(&min_stat, name, &_svcauth_gss_name);
 
        if (maj_stat != GSS_S_COMPLETE) {
-               log_status("gss_duplicate_name", maj_stat, min_stat);
+               gss_log_status("svcauth_gss_set_svc_name: gss_duplicate_name", 
+                       maj_stat, min_stat);
                return (FALSE);
        }
 
@@ -115,7 +117,7 @@ svcauth_gss_import_name(char *service)
        gss_buffer_desc namebuf;
        OM_uint32       maj_stat, min_stat;
 
-       log_debug("in svcauth_gss_import_name()");
+       gss_log_debug("in svcauth_gss_import_name()");
 
        namebuf.value = service;
        namebuf.length = strlen(service);
@@ -124,7 +126,8 @@ svcauth_gss_import_name(char *service)
                                   (gss_OID)GSS_C_NT_HOSTBASED_SERVICE, &name);
 
        if (maj_stat != GSS_S_COMPLETE) {
-               log_status("gss_import_name", maj_stat, min_stat);
+               gss_log_status("svcauth_gss_import_name: gss_import_name", 
+                       maj_stat, min_stat);
                return (FALSE);
        }
        if (svcauth_gss_set_svc_name(name) != TRUE) {
@@ -139,14 +142,15 @@ svcauth_gss_acquire_cred(void)
 {
        OM_uint32       maj_stat, min_stat;
 
-       log_debug("in svcauth_gss_acquire_cred()");
+       gss_log_debug("in svcauth_gss_acquire_cred()");
 
        maj_stat = gss_acquire_cred(&min_stat, _svcauth_gss_name, 0,
                                    GSS_C_NULL_OID_SET, GSS_C_ACCEPT,
                                    &_svcauth_gss_creds, NULL, NULL);
 
        if (maj_stat != GSS_S_COMPLETE) {
-               log_status("gss_acquire_cred", maj_stat, min_stat);
+               gss_log_status("svcauth_gss_acquire_cred: gss_acquire_cred", 
+                       maj_stat, min_stat);
                return (FALSE);
        }
        return (TRUE);
@@ -157,12 +161,13 @@ svcauth_gss_release_cred(void)
 {
        OM_uint32       maj_stat, min_stat;
 
-       log_debug("in svcauth_gss_release_cred()");
+       gss_log_debug("in svcauth_gss_release_cred()");
 
        maj_stat = gss_release_cred(&min_stat, &_svcauth_gss_creds);
 
        if (maj_stat != GSS_S_COMPLETE) {
-               log_status("gss_release_cred", maj_stat, min_stat);
+               gss_log_status("svcauth_gss_release_cred: gss_release_cred", 
+                       maj_stat, min_stat);
                return (FALSE);
        }
 
@@ -181,7 +186,7 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
        gss_OID                  mech;
        OM_uint32                maj_stat = 0, min_stat = 0, ret_flags, seq;
 
-       log_debug("in svcauth_gss_accept_context()");
+       gss_log_debug("in svcauth_gss_accept_context()");
 
        gd = SVCAUTH_PRIVATE(rqst->rq_xprt->xp_auth);
        gc = (struct rpc_gss_cred *)rqst->rq_clntcred;
@@ -208,7 +213,8 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
 
        if (gr->gr_major != GSS_S_COMPLETE &&
            gr->gr_major != GSS_S_CONTINUE_NEEDED) {
-               log_status("accept_sec_context", gr->gr_major, gr->gr_minor);
+               gss_log_status("svcauth_gss_accept_sec_context: accept_sec_context",
+                       gr->gr_major, gr->gr_minor);
                gd->ctx = GSS_C_NO_CONTEXT;
                gss_release_buffer(&min_stat, &gr->gr_token);
                return (FALSE);
@@ -238,31 +244,30 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
                maj_stat = gss_display_name(&min_stat, gd->client_name,
                                            &gd->cname, &gd->sec.mech);
                if (maj_stat != GSS_S_COMPLETE) {
-                       log_status("display_name", maj_stat, min_stat);
+                       gss_log_status("svcauth_gss_accept_sec_context: display_name", 
+                               maj_stat, min_stat);
                        return (FALSE);
                }
-#ifdef DEBUG
 #ifdef HAVE_KRB5
                {
                        gss_buffer_desc mechname;
 
                        gss_oid_to_str(&min_stat, mech, &mechname);
 
-                       log_debug("accepted context for %.*s with "
-                                 "<mech %.*s, qop %d, svc %d>",
-                                 gd->cname.length, (char *)gd->cname.value,
-                                 mechname.length, (char *)mechname.value,
-                                 gd->sec.qop, gd->sec.svc);
+                       gss_log_debug("accepted context for %.*s with "
+                                     "<mech %.*s, qop %d, svc %d>",
+                                     gd->cname.length, (char *)gd->cname.value,
+                                     mechname.length, (char *)mechname.value,
+                                     gd->sec.qop, gd->sec.svc);
 
                        gss_release_buffer(&min_stat, &mechname);
                }
 #elif HAVE_HEIMDAL
-               log_debug("accepted context for %.*s with "
-                         "<mech {}, qop %d, svc %d>",
-                         gd->cname.length, (char *)gd->cname.value,
-                         gd->sec.qop, gd->sec.svc);
+               gss_log_debug("accepted context for %.*s with "
+                             "<mech {}, qop %d, svc %d>",
+                             gd->cname.length, (char *)gd->cname.value,
+                             gd->sec.qop, gd->sec.svc);
 #endif
-#endif /* DEBUG */
                seq = htonl(gr->gr_win);
                seqbuf.value = &seq;
                seqbuf.length = sizeof(seq);
@@ -286,21 +291,19 @@ svcauth_gss_validate(struct svc_rpc_gss_data *gd, struct rpc_msg *msg)
        struct opaque_auth      *oa;
        gss_buffer_desc          rpcbuf, checksum;
        OM_uint32                maj_stat, min_stat, qop_state;
-       u_char                   rpchdr[128];
+       u_char                   *rpchdr;
        int32_t                 *buf;
 
-       log_debug("in svcauth_gss_validate()");
-
-       memset(rpchdr, 0, sizeof(rpchdr));
+       gss_log_debug("in svcauth_gss_validate()");
 
        /* XXX - Reconstruct RPC header for signing (from xdr_callmsg). */
        oa = &msg->rm_call.cb_cred;
        if (oa->oa_length > MAX_AUTH_BYTES)
                return (FALSE);
-       
-       /* 8 XDR units from the IXDR macro calls. */
-       if (sizeof(rpchdr) < (8 * BYTES_PER_XDR_UNIT +
-                       RNDUP(oa->oa_length)))
+
+       rpchdr = (u_char *)calloc(((8 * BYTES_PER_XDR_UNIT) + 
+                       RNDUP(oa->oa_length)), 1);
+       if (rpchdr == NULL)
                return (FALSE);
 
        buf = (int32_t *)rpchdr;
@@ -325,21 +328,24 @@ svcauth_gss_validate(struct svc_rpc_gss_data *gd, struct rpc_msg *msg)
        maj_stat = gss_verify_mic(&min_stat, gd->ctx, &rpcbuf, &checksum,
                                  &qop_state);
 
+       free(rpchdr);
+
        if (maj_stat != GSS_S_COMPLETE) {
-               log_status("gss_verify_mic", maj_stat, min_stat);
+               gss_log_status("svcauth_gss_validate: gss_verify_mic", 
+                       maj_stat, min_stat);
                return (FALSE);
        }
        return (TRUE);
 }
 
-bool_t
+static bool_t
 svcauth_gss_nextverf(struct svc_req *rqst, u_int num)
 {
        struct svc_rpc_gss_data *gd;
        gss_buffer_desc          signbuf, checksum;
        OM_uint32                maj_stat, min_stat;
 
-       log_debug("in svcauth_gss_nextverf()");
+       gss_log_debug("in svcauth_gss_nextverf()");
 
        if (rqst->rq_xprt->xp_auth == NULL)
                return (FALSE);
@@ -353,7 +359,8 @@ svcauth_gss_nextverf(struct svc_req *rqst, u_int num)
                               &signbuf, &checksum);
 
        if (maj_stat != GSS_S_COMPLETE) {
-               log_status("gss_get_mic", maj_stat, min_stat);
+               gss_log_status("svcauth_gss_nextverf: gss_get_mic", 
+                       maj_stat, min_stat);
                return (FALSE);
        }
        rqst->rq_xprt->xp_verf.oa_flavor = RPCSEC_GSS;
@@ -373,7 +380,7 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
        struct rpc_gss_init_res  gr;
        int                      call_stat, offset;
 
-       log_debug("in svcauth_gss()");
+       gss_log_debug("in svcauth_gss()");
 
        /* Initialize reply. */
        rqst->rq_xprt->xp_verf = _null_auth;
@@ -513,13 +520,13 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
        return (AUTH_OK);
 }
 
-bool_t
+static bool_t
 svcauth_gss_destroy(SVCAUTH *auth)
 {
        struct svc_rpc_gss_data *gd;
        OM_uint32                min_stat;
 
-       log_debug("in svcauth_gss_destroy()");
+       gss_log_debug("in svcauth_gss_destroy()");
 
        gd = SVCAUTH_PRIVATE(auth);
 
@@ -535,12 +542,12 @@ svcauth_gss_destroy(SVCAUTH *auth)
        return (TRUE);
 }
 
-bool_t
+static bool_t
 svcauth_gss_wrap(SVCAUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
 {
        struct svc_rpc_gss_data *gd;
 
-       log_debug("in svcauth_gss_wrap()");
+       gss_log_debug("in svcauth_gss_wrap()");
 
        gd = SVCAUTH_PRIVATE(auth);
 
@@ -552,12 +559,12 @@ svcauth_gss_wrap(SVCAUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
                                 gd->sec.svc, gd->seq));
 }
 
-bool_t
+static bool_t
 svcauth_gss_unwrap(SVCAUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
 {
        struct svc_rpc_gss_data *gd;
 
-       log_debug("in svcauth_gss_unwrap()");
+       gss_log_debug("in svcauth_gss_unwrap()");
 
        gd = SVCAUTH_PRIVATE(auth);