s3-netapi: use NetApiBufferAllocate() for returned buffer in getdc calls.
authorGünther Deschner <gd@samba.org>
Fri, 21 Oct 2011 09:06:14 +0000 (11:06 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 21 Oct 2011 09:07:25 +0000 (11:07 +0200)
Guenther

source3/lib/netapi/getdc.c

index e753deacb09cfa0319404a3ba1218ed30f9a4f83..3b26d46db47e11f6f318bc513512775528f3ffd9 100644 (file)
@@ -43,6 +43,8 @@ WERROR NetGetDCName_r(struct libnetapi_ctx *ctx,
        NTSTATUS status;
        WERROR werr;
        struct dcerpc_binding_handle *b;
+       const char *dcname;
+       void *buffer;
 
        werr = libnetapi_get_binding_handle(ctx, r->in.server_name,
                                            &ndr_table_netlogon.syntax_id,
@@ -54,12 +56,24 @@ WERROR NetGetDCName_r(struct libnetapi_ctx *ctx,
        status = dcerpc_netr_GetDcName(b, talloc_tos(),
                                       r->in.server_name,
                                       r->in.domain_name,
-                                      (const char **)r->out.buffer,
+                                      &dcname,
                                       &werr);
 
        if (!NT_STATUS_IS_OK(status)) {
                werr = ntstatus_to_werror(status);
+               goto done;
+       }
+
+       if (!W_ERROR_IS_OK(werr)) {
+               goto done;
+       }
+
+       if (NetApiBufferAllocate(strlen_m_term(dcname), &buffer)) {
+               werr = WERR_NOMEM;
+               goto done;
        }
+       memcpy(buffer, dcname, strlen_m_term(dcname));
+       *r->out.buffer = buffer;
  done:
 
        return werr;
@@ -83,6 +97,8 @@ WERROR NetGetAnyDCName_r(struct libnetapi_ctx *ctx,
        NTSTATUS status;
        WERROR werr;
        struct dcerpc_binding_handle *b;
+       const char *dcname;
+       void *buffer;
 
        werr = libnetapi_get_binding_handle(ctx, r->in.server_name,
                                            &ndr_table_netlogon.syntax_id,
@@ -94,12 +110,24 @@ WERROR NetGetAnyDCName_r(struct libnetapi_ctx *ctx,
        status = dcerpc_netr_GetAnyDCName(b, talloc_tos(),
                                          r->in.server_name,
                                          r->in.domain_name,
-                                         (const char **)r->out.buffer,
+                                         &dcname,
                                          &werr);
        if (!NT_STATUS_IS_OK(status)) {
                werr = ntstatus_to_werror(status);
                goto done;
        }
+
+       if (!W_ERROR_IS_OK(werr)) {
+               goto done;
+       }
+
+       if (NetApiBufferAllocate(strlen_m_term(dcname), &buffer)) {
+               werr = WERR_NOMEM;
+               goto done;
+       }
+       memcpy(buffer, dcname, strlen_m_term(dcname));
+       *r->out.buffer = buffer;
+
  done:
 
        return werr;