gsasl-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU gsasl branch, master, updated. gsasl-1-5-0-4-gd80bd5c


From: Simon Josefsson
Subject: [SCM] GNU gsasl branch, master, updated. gsasl-1-5-0-4-gd80bd5c
Date: Mon, 12 Apr 2010 19:56:38 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU gsasl".

http://git.savannah.gnu.org/cgit/gsasl.git/commit/?id=d80bd5ce3e0c3621c14c9445df3b21e484f3ecad

The branch, master has been updated
       via  d80bd5ce3e0c3621c14c9445df3b21e484f3ecad (commit)
       via  8240deb37031ce40581c5fa2d6fb15ae1d84cf0a (commit)
      from  38cc3ff84643c06ebf63c9e970894b18c5f52c06 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d80bd5ce3e0c3621c14c9445df3b21e484f3ecad
Author: Simon Josefsson <address@hidden>
Date:   Mon Apr 12 21:48:40 2010 +0200

    GS2: Fix decoding of invalid data in server.  Code review fixes.

commit 8240deb37031ce40581c5fa2d6fb15ae1d84cf0a
Author: Simon Josefsson <address@hidden>
Date:   Mon Apr 12 21:07:12 2010 +0200

    Add.

-----------------------------------------------------------------------

Summary of changes:
 .gitignore          |    3 ++
 lib/gs2/client.c    |   63 ++++++++++++++++++++++---------------
 lib/gs2/gs2helper.c |   17 ++++------
 lib/gs2/gs2helper.h |   16 +++------
 lib/gs2/mechinfo.c  |   43 ++++++++++++-------------
 lib/gs2/server.c    |   86 +++++++++++++++++++++++++++++++++++---------------
 6 files changed, 135 insertions(+), 93 deletions(-)

diff --git a/.gitignore b/.gitignore
index 661d54d..82ec4dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -153,6 +153,7 @@ gltests/Makefile.in
 gltests/arg-nonnull.h
 gltests/c++defs.h
 gltests/fcntl.h
+gltests/ioctl.o
 gltests/libtests.a
 gltests/malloca.o
 gltests/sys/
@@ -191,6 +192,8 @@ gltests/test-getopt.o
 gltests/test-gettimeofday
 gltests/test-gettimeofday.o
 gltests/test-iconv
+gltests/test-iconv-h
+gltests/test-iconv-h.o
 gltests/test-iconv.o
 gltests/test-inet_ntop
 gltests/test-inet_ntop.o
diff --git a/lib/gs2/client.c b/lib/gs2/client.c
index 2664672..198eae3 100644
--- a/lib/gs2/client.c
+++ b/lib/gs2/client.c
@@ -37,7 +37,8 @@
 
 struct _gsasl_gs2_client_state
 {
-  int step; /* 0 = initial, 1 = first token, 2 = looping, 3 = done */
+  /* steps: 0 = initial, 1 = first token, 2 = looping, 3 = done */
+  int step;
   gss_name_t service;
   gss_ctx_id_t context;
   gss_OID mech_oid;
@@ -46,6 +47,8 @@ struct _gsasl_gs2_client_state
 };
 typedef struct _gsasl_gs2_client_state _gsasl_gs2_client_state;
 
+/* Initialize GS2 state into MECH_DATA.  Return GSASL_OK if GS2 is
+   ready and initialization succeeded, or an error code. */
 int
 _gsasl_gs2_client_start (Gsasl_session * sctx, void **mech_data)
 {
@@ -56,10 +59,6 @@ _gsasl_gs2_client_start (Gsasl_session * sctx, void 
**mech_data)
   if (state == NULL)
     return GSASL_MALLOC_ERROR;
 
-  state->step = 0;
-  state->service = GSS_C_NO_NAME;
-  state->context = GSS_C_NO_CONTEXT;
-
   res = gs2_get_oid (sctx, &state->mech_oid);
   if (res != GSASL_OK)
     {
@@ -67,9 +66,11 @@ _gsasl_gs2_client_start (Gsasl_session * sctx, void 
**mech_data)
       return res;
     }
 
+  state->step = 0;
+  state->service = GSS_C_NO_NAME;
+  state->context = GSS_C_NO_CONTEXT;
   state->token.length = 0;
   state->token.value = NULL;
-
   /* The initiator-address-type and acceptor-address-type fields of
      the GSS-CHANNEL-BINDINGS structure MUST be set to 0.  The
      initiator-address and acceptor-address fields MUST be the empty
@@ -88,6 +89,9 @@ _gsasl_gs2_client_start (Gsasl_session * sctx, void 
**mech_data)
   return GSASL_OK;
 }
 
+/* Return newly allocated copy of STR with all occurrences of ','
+   replaced with =2C and '=' with '=3D', or return NULL on memory
+   allocation errors.  */
 static char *
 escape_authzid (const char *str)
 {
@@ -121,30 +125,30 @@ escape_authzid (const char *str)
   return out;
 }
 
+/* Get service, hostname and authorization identity from application,
+   import the GSS-API name, and initialize the channel binding data.
+   Return GSASL_OK on success or an error code. */
 static int
-prepare (Gsasl_session * sctx, _gsasl_gs2_client_state *state)
+prepare (Gsasl_session * sctx, _gsasl_gs2_client_state * state)
 {
-  const char *service, *hostname;
+  const char *service = gsasl_property_get (sctx, GSASL_SERVICE);
+  const char *hostname = gsasl_property_get (sctx, GSASL_HOSTNAME);
   const char *authzid = gsasl_property_get (sctx, GSASL_AUTHZID);
   gss_buffer_desc bufdesc;
   OM_uint32 maj_stat, min_stat;
 
-  service = gsasl_property_get (sctx, GSASL_SERVICE);
   if (!service)
     return GSASL_NO_SERVICE;
-
-  hostname = gsasl_property_get (sctx, GSASL_HOSTNAME);
   if (!hostname)
     return GSASL_NO_HOSTNAME;
 
-  bufdesc.length = asprintf ((char**) &bufdesc.value, "address@hidden",
+  bufdesc.length = asprintf ((char **) &bufdesc.value, "address@hidden",
                             service, hostname);
   if (bufdesc.length <= 0 || bufdesc.value == NULL)
     return GSASL_MALLOC_ERROR;
 
   maj_stat = gss_import_name (&min_stat, &bufdesc,
-                             GSS_C_NT_HOSTBASED_SERVICE,
-                             &state->service);
+                             GSS_C_NT_HOSTBASED_SERVICE, &state->service);
   free (bufdesc.value);
   if (GSS_ERROR (maj_stat))
     return GSASL_GSSAPI_IMPORT_NAME_ERROR;
@@ -152,11 +156,14 @@ prepare (Gsasl_session * sctx, _gsasl_gs2_client_state 
*state)
   if (authzid)
     {
       char *escaped_authzid = escape_authzid (authzid);
+
       if (!escaped_authzid)
        return GSASL_MALLOC_ERROR;
+
       state->cb.application_data.length
-       = asprintf ((char**) &state->cb.application_data.value,
+       = asprintf ((char **) &state->cb.application_data.value,
                    "n,a=%s,", escaped_authzid);
+
       free (escaped_authzid);
     }
   else
@@ -174,12 +181,12 @@ prepare (Gsasl_session * sctx, _gsasl_gs2_client_state 
*state)
 
 /* Copy token to output buffer.  On first round trip, strip context
    token header and add channel binding data. For later round trips,
-   just copy the buffer. */
+   just copy the buffer.  Return GSASL_OK on success or an error
+   code.  */
 static int
 token2output (Gsasl_session * sctx,
-             _gsasl_gs2_client_state *state,
-             const gss_buffer_t token,
-             char **output, size_t * output_len)
+             _gsasl_gs2_client_state * state,
+             const gss_buffer_t token, char **output, size_t * output_len)
 {
   OM_uint32 maj_stat, min_stat;
   gss_buffer_desc bufdesc;
@@ -188,8 +195,7 @@ token2output (Gsasl_session * sctx,
     {
       state->step++;
 
-      maj_stat = gss_decapsulate_token (token, state->mech_oid,
-                                       &bufdesc);
+      maj_stat = gss_decapsulate_token (token, state->mech_oid, &bufdesc);
       if (GSS_ERROR (maj_stat))
        return GSASL_GSSAPI_ENCAPSULATE_TOKEN_ERROR;
 
@@ -222,6 +228,10 @@ token2output (Gsasl_session * sctx,
   return GSASL_OK;
 }
 
+/* Perform one GS2 step.  GS2 state is in MECH_DATA.  Any data from
+   server is provided in INPUT/INPUT_LEN and output from client is
+   expected to be put in newly allocated OUTPUT/OUTPUT_LEN.  Return
+   GSASL_NEEDS_MORE or GSASL_OK on success, or an error code.  */
 int
 _gsasl_gs2_client_step (Gsasl_session * sctx,
                        void *mech_data,
@@ -253,7 +263,7 @@ _gsasl_gs2_client_step (Gsasl_session * sctx,
       buf = &bufdesc;
     }
 
-  /* Release memory for token from last round-trip, if any. */
+  /* First release memory for token from last round-trip, if any. */
   if (state->token.value != NULL)
     {
       maj_stat = gss_release_buffer (&min_stat, &state->token);
@@ -274,9 +284,7 @@ _gsasl_gs2_client_step (Gsasl_session * sctx,
                                   &state->cb,
                                   buf,
                                   &actual_mech_type,
-                                  &state->token,
-                                  &ret_flags,
-                                  NULL);
+                                  &state->token, &ret_flags, NULL);
   if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED)
     return GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR;
 
@@ -287,6 +295,9 @@ _gsasl_gs2_client_step (Gsasl_session * sctx,
   if (maj_stat == GSS_S_CONTINUE_NEEDED)
     return GSASL_NEEDS_MORE;
 
+  /* The GSS-API layer is done here, check that we established a valid
+     security context for GS2 purposes. */
+
   if (!(ret_flags & GSS_C_MUTUAL_FLAG))
     return GSASL_AUTHENTICATION_ERROR;
 
@@ -297,6 +308,8 @@ _gsasl_gs2_client_step (Gsasl_session * sctx,
   return GSASL_OK;
 }
 
+/* Cleanup GS2 state context, i.e., release memory associated with
+   buffers in MECH_DATA state. */
 void
 _gsasl_gs2_client_finish (Gsasl_session * sctx, void *mech_data)
 {
diff --git a/lib/gs2/gs2helper.c b/lib/gs2/gs2helper.c
index 861ff5f..c9cbb5c 100644
--- a/lib/gs2/gs2helper.c
+++ b/lib/gs2/gs2helper.c
@@ -37,7 +37,7 @@
    bit silly given that we only support Kerberos V5 today, but will be
    useful when that changes.  */
 int
-gs2_get_oid (Gsasl_session * sctx, gss_OID *mech_oid)
+gs2_get_oid (Gsasl_session * sctx, gss_OID * mech_oid)
 {
   gss_buffer_desc sasl_mech_name;
   OM_uint32 maj_stat, min_stat;
@@ -75,9 +75,9 @@ gss_oid_equal (const gss_OID first_oid, const gss_OID 
second_oid)
    Kerberos V5.  */
 
 OM_uint32
-gss_inquire_mech_for_saslname (OM_uint32 *minor_status,
+gss_inquire_mech_for_saslname (OM_uint32 * minor_status,
                               const gss_buffer_t sasl_mech_name,
-                              gss_OID *mech_type)
+                              gss_OID * mech_type)
 {
   static gss_OID_desc krb5oid_static = {
     9, (char *) "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02"
@@ -186,8 +186,7 @@ _gss_encapsulate_token_prefix (const char *prefix, size_t 
prefixlen,
 
 extern OM_uint32
 gss_encapsulate_token (const gss_buffer_t input_token,
-                      const gss_OID token_oid,
-                      gss_buffer_t output_token)
+                      const gss_OID token_oid, gss_buffer_t output_token)
 {
   int rc;
 
@@ -216,7 +215,7 @@ gss_encapsulate_token (const gss_buffer_t input_token,
 #ifndef HAVE_GSS_ENCAPSULATE_TOKEN
 
 static size_t
-_gss_asn1_get_length_der (const char *der, size_t der_len, size_t *len)
+_gss_asn1_get_length_der (const char *der, size_t der_len, size_t * len)
 {
   size_t ans;
   size_t k, punt;
@@ -313,8 +312,7 @@ _gss_decapsulate_token (const char *in, size_t inlen,
 
 OM_uint32
 gss_decapsulate_token (const gss_buffer_t input_token,
-                      const gss_OID token_oid,
-                      gss_buffer_t output_token)
+                      const gss_OID token_oid, gss_buffer_t output_token)
 {
   gss_OID_desc tmpoid;
   char *oid = NULL, *out = NULL;
@@ -329,8 +327,7 @@ gss_decapsulate_token (const gss_buffer_t input_token,
 
   if (_gss_decapsulate_token ((char *) input_token->value,
                              input_token->length,
-                             &oid, &oidlen,
-                             &out, &outlen) != 0)
+                             &oid, &oidlen, &out, &outlen) != 0)
     return GSS_S_DEFECTIVE_TOKEN;
 
   tmpoid.length = oidlen;
diff --git a/lib/gs2/gs2helper.h b/lib/gs2/gs2helper.h
index 66b84c2..63df1e7 100644
--- a/lib/gs2/gs2helper.h
+++ b/lib/gs2/gs2helper.h
@@ -35,33 +35,29 @@
 /* Get gsasl functions and types. */
 #include <gsasl.h>
 
-extern int
-gs2_get_oid (Gsasl_session * sctx, gss_OID *mech_oid);
+extern int gs2_get_oid (Gsasl_session * sctx, gss_OID * mech_oid);
 
 #ifndef HAVE_GSS_OID_EQUAL
-extern int
-gss_oid_equal (const gss_OID first_oid, const gss_OID second_oid);
+extern int gss_oid_equal (const gss_OID first_oid, const gss_OID second_oid);
 #endif /* HAVE_GSS_OID_EQUAL */
 
 #ifndef HAVE_GSS_INQUIRE_MECH_FOR_SASLNAME
 OM_uint32
-gss_inquire_mech_for_saslname (OM_uint32 *minor_status,
+gss_inquire_mech_for_saslname (OM_uint32 * minor_status,
                               const gss_buffer_t sasl_mech_name,
-                              gss_OID *mech_type);
+                              gss_OID * mech_type);
 #endif /* HAVE_GSS_INQUIRE_MECH_FOR_SASLNAME */
 
 #ifndef HAVE_GSS_ENCAPSULATE_TOKEN
 extern OM_uint32
 gss_encapsulate_token (const gss_buffer_t input_token,
-                      const gss_OID token_oid,
-                      gss_buffer_t output_token);
+                      const gss_OID token_oid, gss_buffer_t output_token);
 #endif /* HAVE_GSS_ENCAPSULATE_TOKEN */
 
 #ifndef HAVE_GSS_DECAPSULATE_TOKEN
 OM_uint32
 gss_decapsulate_token (const gss_buffer_t input_token,
-                      const gss_OID token_oid,
-                      gss_buffer_t output_token);
+                      const gss_OID token_oid, gss_buffer_t output_token);
 #endif
 
 #endif /* GS2_HELPER_H */
diff --git a/lib/gs2/mechinfo.c b/lib/gs2/mechinfo.c
index d1a7a98..c8319e6 100644
--- a/lib/gs2/mechinfo.c
+++ b/lib/gs2/mechinfo.c
@@ -30,45 +30,44 @@
 Gsasl_mechanism gsasl_gs2_krb5_mechanism = {
   GSASL_GS2_KRB5_NAME,
   {
-    NULL,
-    NULL,
+   NULL,
+   NULL,
 #ifdef USE_CLIENT
-    _gsasl_gs2_client_start,
+   _gsasl_gs2_client_start,
 #else
-    NULL,
+   NULL,
 #endif
 #ifdef USE_CLIENT
-    _gsasl_gs2_client_step,
+   _gsasl_gs2_client_step,
 #else
-    NULL,
+   NULL,
 #endif
 #ifdef USE_CLIENT
-    _gsasl_gs2_client_finish,
+   _gsasl_gs2_client_finish,
 #else
-    NULL,
+   NULL,
 #endif
-    NULL,
-    NULL
-  },
+   NULL,
+   NULL}
+  ,
   {
-    NULL,
-    NULL,
+   NULL,
+   NULL,
 #ifdef USE_SERVER
-    _gsasl_gs2_server_start,
+   _gsasl_gs2_server_start,
 #else
-    NULL,
+   NULL,
 #endif
 #ifdef USE_SERVER
-    _gsasl_gs2_server_step,
+   _gsasl_gs2_server_step,
 #else
-    NULL,
+   NULL,
 #endif
 #ifdef USE_SERVER
-    _gsasl_gs2_server_finish,
+   _gsasl_gs2_server_finish,
 #else
-    NULL,
+   NULL,
 #endif
-    NULL,
-    NULL
-  }
+   NULL,
+   NULL}
 };
diff --git a/lib/gs2/server.c b/lib/gs2/server.c
index 7b00d78..0694a17 100644
--- a/lib/gs2/server.c
+++ b/lib/gs2/server.c
@@ -37,6 +37,7 @@
 
 struct _Gsasl_gs2_server_state
 {
+  /* steps: 0 = first state, 1 = initial, 2 = processing, 3 = done */
   int step;
   gss_name_t client;
   gss_cred_id_t cred;
@@ -46,39 +47,38 @@ struct _Gsasl_gs2_server_state
 };
 typedef struct _Gsasl_gs2_server_state _Gsasl_gs2_server_state;
 
-/* Populate state->cred with credential to use for connection. */
+/* Populate state->cred with credential to use for connection.  Return
+   GSASL_OK on success or an error code.  */
 static int
-gs2_get_cred  (Gsasl_session * sctx, _Gsasl_gs2_server_state * state)
+gs2_get_cred (Gsasl_session * sctx, _Gsasl_gs2_server_state * state)
 {
   OM_uint32 maj_stat, min_stat;
   gss_buffer_desc bufdesc;
-  const char *service;
-  const char *hostname;
+  const char *service = gsasl_property_get (sctx, GSASL_SERVICE);
+  const char *hostname = gsasl_property_get (sctx, GSASL_HOSTNAME);
   gss_name_t server;
   gss_OID_set_desc oid_set;
   gss_OID_set actual_mechs;
   int present;
 
-  service = gsasl_property_get (sctx, GSASL_SERVICE);
   if (!service)
     return GSASL_NO_SERVICE;
-
-  hostname = gsasl_property_get (sctx, GSASL_HOSTNAME);
   if (!hostname)
     return GSASL_NO_HOSTNAME;
 
-  bufdesc.length = asprintf ((char**) &bufdesc.value, "address@hidden",
+  bufdesc.length = asprintf ((char **) &bufdesc.value, "address@hidden",
                             service, hostname);
   if (bufdesc.length <= 0 || bufdesc.value == NULL)
     return GSASL_MALLOC_ERROR;
 
   maj_stat = gss_import_name (&min_stat, &bufdesc,
-                             GSS_C_NT_HOSTBASED_SERVICE,
-                             &server);
+                             GSS_C_NT_HOSTBASED_SERVICE, &server);
   free (bufdesc.value);
   if (GSS_ERROR (maj_stat))
     return GSASL_GSSAPI_IMPORT_NAME_ERROR;
 
+  /* Attempt to get a credential for our mechanism.  */
+
   oid_set.count = 1;
   oid_set.elements = state->mech_oid;
 
@@ -89,6 +89,9 @@ gs2_get_cred  (Gsasl_session * sctx, _Gsasl_gs2_server_state 
* state)
   if (GSS_ERROR (maj_stat))
     return GSASL_GSSAPI_ACQUIRE_CRED_ERROR;
 
+  /* Now double check that the credential actually was for our
+     mechanism... */
+
   maj_stat = gss_test_oid_set_member (&min_stat, state->mech_oid,
                                      actual_mechs, &present);
   if (GSS_ERROR (maj_stat))
@@ -101,9 +104,14 @@ gs2_get_cred  (Gsasl_session * sctx, 
_Gsasl_gs2_server_state * state)
   if (GSS_ERROR (maj_stat))
     return GSASL_GSSAPI_RELEASE_OID_SET_ERROR;
 
+  if (!present)
+    return GSASL_GSSAPI_ACQUIRE_CRED_ERROR;
+
   return GSASL_OK;
 }
 
+/* Initialize GS2 state into MECH_DATA.  Return GSASL_OK if GS2 is
+   ready and initialization succeeded, or an error code. */
 int
 _gsasl_gs2_server_start (Gsasl_session * sctx, void **mech_data)
 {
@@ -131,7 +139,6 @@ _gsasl_gs2_server_start (Gsasl_session * sctx, void 
**mech_data)
   state->step = 0;
   state->context = GSS_C_NO_CONTEXT;
   state->client = NULL;
-
   /* The initiator-address-type and acceptor-address-type fields of
      the GSS-CHANNEL-BINDINGS structure MUST be set to 0.  The
      initiator-address and acceptor-address fields MUST be the empty
@@ -150,14 +157,22 @@ _gsasl_gs2_server_start (Gsasl_session * sctx, void 
**mech_data)
   return GSASL_OK;
 }
 
-static char *
-unescape_authzid (const char *str, size_t len)
+/* Create in AUTHZID a newly allocated copy of STR where =2C is
+   replaced with , and =3D is replaced with =.  Return GSASL_OK on
+   success, GSASL_MALLOC_ERROR on memory errors, GSASL_PARSE_ERRORS if
+   string contains any unencoded ',' or incorrectly encoded
+   sequence.  */
+static int
+unescape_authzid (const char *str, size_t len, char **authzid)
 {
-  char *out = malloc (len + 1);
-  char *p = out;
+  char *p;
 
-  if (!out)
-    return NULL;
+  if (memchr (str, ',', len) != NULL)
+    return GSASL_MECHANISM_PARSE_ERROR;
+
+  p = *authzid = malloc (len + 1);
+  if (!p)
+    return GSASL_MALLOC_ERROR;
 
   while (len > 0 && *str)
     {
@@ -173,6 +188,12 @@ unescape_authzid (const char *str, size_t len)
          str += 3;
          len -= 3;
        }
+      else if (str[0] == '=')
+       {
+         free (*authzid);
+         *authzid = NULL;
+         return GSASL_MECHANISM_PARSE_ERROR;
+       }
       else
        {
          *p++ = *str;
@@ -182,12 +203,16 @@ unescape_authzid (const char *str, size_t len)
     }
   *p = '\0';
 
-  return out;
+  return GSASL_OK;
 }
 
+/* Parse the GS2 header containing flags and authorization identity.
+   Put authorization identity (or NULL) in AUTHZID and length of
+   header in HEADERLEN.  Return GSASL_OK on success or an error
+   code.*/
 static int
 parse_gs2_header (const char *data, size_t len,
-                 char **authzid, size_t *headerlen)
+                 char **authzid, size_t * headerlen)
 {
   char *authzid_endptr;
 
@@ -202,9 +227,15 @@ parse_gs2_header (const char *data, size_t len,
   else if (strncmp (data, "n,a=", 4) == 0 &&
           (authzid_endptr = memchr (data + 4, ',', len - 4)))
     {
-      *authzid = unescape_authzid (data + 4, authzid_endptr - (data + 4));
-      if (!*authzid)
-       return GSASL_MALLOC_ERROR;
+      int res;
+
+      if (authzid_endptr == NULL)
+       return GSASL_MECHANISM_PARSE_ERROR;
+
+      res = unescape_authzid (data + 4, authzid_endptr - (data + 4), authzid);
+      if (res != GSASL_OK)
+       return res;
+
       *headerlen = authzid_endptr - data + 1;
     }
   else
@@ -213,6 +244,10 @@ parse_gs2_header (const char *data, size_t len,
   return GSASL_OK;
 }
 
+/* Perform one GS2 step.  GS2 state is in MECH_DATA.  Any data from
+   client is provided in INPUT/INPUT_LEN and output from server is
+   expected to be put in newly allocated OUTPUT/OUTPUT_LEN.  Return
+   GSASL_NEEDS_MORE or GSASL_OK on success, or an error code.  */
 int
 _gsasl_gs2_server_step (Gsasl_session * sctx,
                        void *mech_data,
@@ -289,10 +324,7 @@ _gsasl_gs2_server_step (Gsasl_session * sctx,
                                         &state->cb,
                                         &state->client,
                                         &mech_type,
-                                        &bufdesc2,
-                                        &ret_flags,
-                                        NULL,
-                                        NULL);
+                                        &bufdesc2, &ret_flags, NULL, NULL);
       if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED)
        return GSASL_GSSAPI_ACCEPT_SEC_CONTEXT_ERROR;
 
@@ -342,6 +374,8 @@ _gsasl_gs2_server_step (Gsasl_session * sctx,
   return res;
 }
 
+/* Cleanup GS2 state context, i.e., release memory associated with
+   buffers in MECH_DATA state. */
 void
 _gsasl_gs2_server_finish (Gsasl_session * sctx, void *mech_data)
 {


hooks/post-receive
-- 
GNU gsasl




reply via email to

[Prev in Thread] Current Thread [Next in Thread]