gensec: Fix a memory corruption in gensec_use_kerberos_mechs
[nivanova/samba-autobuild/.git] / auth / gensec / gensec_start.c
index 9576e53ec685b727eeebb5892c8ce9c43c8f97d6..ab092a7bb17b5355fbf34b90a175bb6aa6071f54 100644 (file)
@@ -75,7 +75,8 @@ _PUBLIC_ struct gensec_security_ops **gensec_use_kerberos_mechs(TALLOC_CTX *mem_
                /* noop */
        }
 
-       new_gensec_list = talloc_array(mem_ctx, struct gensec_security_ops *, num_mechs_in + 1);
+       new_gensec_list = talloc_array(mem_ctx, struct gensec_security_ops *,
+                                      num_mechs_in*2 + 1);
        if (!new_gensec_list) {
                return NULL;
        }
@@ -114,8 +115,9 @@ _PUBLIC_ struct gensec_security_ops **gensec_use_kerberos_mechs(TALLOC_CTX *mem_
        return new_gensec_list;
 }
 
-struct gensec_security_ops **gensec_security_mechs(struct gensec_security *gensec_security,
-                                                  TALLOC_CTX *mem_ctx)
+_PUBLIC_ struct gensec_security_ops **gensec_security_mechs(
+                               struct gensec_security *gensec_security,
+                               TALLOC_CTX *mem_ctx)
 {
        struct gensec_security_ops **backends;
        if (!gensec_security) {
@@ -166,8 +168,9 @@ static const struct gensec_security_ops *gensec_security_by_authtype(struct gens
        return NULL;
 }
 
-const struct gensec_security_ops *gensec_security_by_oid(struct gensec_security *gensec_security,
-                                                        const char *oid_string)
+_PUBLIC_ const struct gensec_security_ops *gensec_security_by_oid(
+                               struct gensec_security *gensec_security,
+                               const char *oid_string)
 {
        int i, j;
        struct gensec_security_ops **backends;
@@ -198,8 +201,9 @@ const struct gensec_security_ops *gensec_security_by_oid(struct gensec_security
        return NULL;
 }
 
-const struct gensec_security_ops *gensec_security_by_sasl_name(struct gensec_security *gensec_security,
-                                                              const char *sasl_name)
+_PUBLIC_ const struct gensec_security_ops *gensec_security_by_sasl_name(
+                               struct gensec_security *gensec_security,
+                               const char *sasl_name)
 {
        int i;
        struct gensec_security_ops **backends;
@@ -327,10 +331,11 @@ const struct gensec_security_ops **gensec_security_by_sasl_list(struct gensec_se
  * attached to the gensec_security, and return in our preferred order.
  */
 
-const struct gensec_security_ops_wrapper *gensec_security_by_oid_list(struct gensec_security *gensec_security,
-                                                                     TALLOC_CTX *mem_ctx,
-                                                                     const char **oid_strings,
-                                                                     const char *skip)
+_PUBLIC_ const struct gensec_security_ops_wrapper *gensec_security_by_oid_list(
+                                       struct gensec_security *gensec_security,
+                                       TALLOC_CTX *mem_ctx,
+                                       const char **oid_strings,
+                                       const char *skip)
 {
        struct gensec_security_ops_wrapper *backends_out;
        struct gensec_security_ops **backends;
@@ -451,8 +456,8 @@ const char **gensec_security_oids_from_ops(struct gensec_security *gensec_securi
  * Return OIDS from the security subsystems listed
  */
 
-const char **gensec_security_oids_from_ops_wrapped(TALLOC_CTX *mem_ctx,
-                                                  const struct gensec_security_ops_wrapper *wops)
+_PUBLIC_ const char **gensec_security_oids_from_ops_wrapped(TALLOC_CTX *mem_ctx,
+                               const struct gensec_security_ops_wrapper *wops)
 {
        int i;
        int j = 0;
@@ -493,9 +498,9 @@ const char **gensec_security_oids_from_ops_wrapped(TALLOC_CTX *mem_ctx,
  *
  */
 
-const char **gensec_security_oids(struct gensec_security *gensec_security,
-                                 TALLOC_CTX *mem_ctx,
-                                 const char *skip)
+_PUBLIC_ const char **gensec_security_oids(struct gensec_security *gensec_security,
+                                          TALLOC_CTX *mem_ctx,
+                                          const char *skip)
 {
        struct gensec_security_ops **ops
                = gensec_security_mechs(gensec_security, mem_ctx);
@@ -518,6 +523,8 @@ static NTSTATUS gensec_start(TALLOC_CTX *mem_ctx,
        (*gensec_security) = talloc_zero(mem_ctx, struct gensec_security);
        NT_STATUS_HAVE_NO_MEMORY(*gensec_security);
 
+       (*gensec_security)->max_update_size = 0;
+
        SMB_ASSERT(settings->lp_ctx != NULL);
        (*gensec_security)->settings = talloc_reference(*gensec_security, settings);
 
@@ -550,6 +557,7 @@ _PUBLIC_ NTSTATUS gensec_subcontext_start(TALLOC_CTX *mem_ctx,
 
        (*gensec_security)->subcontext = true;
        (*gensec_security)->want_features = parent->want_features;
+       (*gensec_security)->max_update_size = parent->max_update_size;
        (*gensec_security)->dcerpc_auth_level = parent->dcerpc_auth_level;
        (*gensec_security)->auth_context = talloc_reference(*gensec_security, parent->auth_context);
        (*gensec_security)->settings = talloc_reference(*gensec_security, parent->settings);
@@ -817,7 +825,7 @@ _PUBLIC_ NTSTATUS gensec_set_credentials(struct gensec_security *gensec_security
   The 'name' can be later used by other backends to find the operations
   structure for this backend.
 */
-NTSTATUS gensec_register(const struct gensec_security_ops *ops)
+_PUBLIC_ NTSTATUS gensec_register(const struct gensec_security_ops *ops)
 {
        if (gensec_security_by_name(NULL, ops->name) != NULL) {
                /* its already registered! */