summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/Makefile.in3
-rw-r--r--source3/auth/server_info.c62
-rw-r--r--source3/rpc_client/util_netlogon.c63
-rw-r--r--source3/rpc_client/util_netlogon.h5
-rw-r--r--source3/wscript_build2
5 files changed, 77 insertions, 58 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 09cd71315b9..ebfee9fbc9b 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -375,7 +375,8 @@ LIBCLI_SAMR_OBJ = librpc/gen_ndr/ndr_samr_c.o \
rpc_client/cli_samr.o
LIBCLI_NETLOGON_OBJ = librpc/gen_ndr/ndr_netlogon_c.o \
- rpc_client/cli_netlogon.o
+ rpc_client/cli_netlogon.o \
+ rpc_client/util_netlogon.o
LIBCLI_EPMAPPER_OBJ = librpc/gen_ndr/ndr_epmapper_c.o
diff --git a/source3/auth/server_info.c b/source3/auth/server_info.c
index 01c7a96cdc4..0f62983560a 100644
--- a/source3/auth/server_info.c
+++ b/source3/auth/server_info.c
@@ -21,6 +21,7 @@
#include "../lib/crypto/arcfour.h"
#include "../librpc/gen_ndr/netlogon.h"
#include "../libcli/security/security.h"
+#include "rpc_client/util_netlogon.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_AUTH
@@ -490,66 +491,15 @@ struct netr_SamInfo3 *copy_netr_SamInfo3(TALLOC_CTX *mem_ctx,
{
struct netr_SamInfo3 *info3;
unsigned int i;
+ NTSTATUS status;
info3 = talloc_zero(mem_ctx, struct netr_SamInfo3);
if (!info3) return NULL;
- /* first copy all, then realloc pointers */
- info3->base = orig->base;
-
- if (orig->base.account_name.string) {
- info3->base.account_name.string =
- talloc_strdup(info3, orig->base.account_name.string);
- RET_NOMEM(info3->base.account_name.string);
- }
- if (orig->base.full_name.string) {
- info3->base.full_name.string =
- talloc_strdup(info3, orig->base.full_name.string);
- RET_NOMEM(info3->base.full_name.string);
- }
- if (orig->base.logon_script.string) {
- info3->base.logon_script.string =
- talloc_strdup(info3, orig->base.logon_script.string);
- RET_NOMEM(info3->base.logon_script.string);
- }
- if (orig->base.profile_path.string) {
- info3->base.profile_path.string =
- talloc_strdup(info3, orig->base.profile_path.string);
- RET_NOMEM(info3->base.profile_path.string);
- }
- if (orig->base.home_directory.string) {
- info3->base.home_directory.string =
- talloc_strdup(info3, orig->base.home_directory.string);
- RET_NOMEM(info3->base.home_directory.string);
- }
- if (orig->base.home_drive.string) {
- info3->base.home_drive.string =
- talloc_strdup(info3, orig->base.home_drive.string);
- RET_NOMEM(info3->base.home_drive.string);
- }
-
- if (orig->base.groups.count) {
- info3->base.groups.rids = (struct samr_RidWithAttribute *)
- talloc_memdup(info3, orig->base.groups.rids,
- (sizeof(struct samr_RidWithAttribute) *
- orig->base.groups.count));
- RET_NOMEM(info3->base.groups.rids);
- }
-
- if (orig->base.logon_server.string) {
- info3->base.logon_server.string =
- talloc_strdup(info3, orig->base.logon_server.string);
- RET_NOMEM(info3->base.logon_server.string);
- }
- if (orig->base.domain.string) {
- info3->base.domain.string =
- talloc_strdup(info3, orig->base.domain.string);
- RET_NOMEM(info3->base.domain.string);
- }
-
- if (orig->base.domain_sid) {
- info3->base.domain_sid = dom_sid_dup(info3, orig->base.domain_sid);
- RET_NOMEM(info3->base.domain_sid);
+ status = copy_netr_SamBaseInfo(info3, &orig->base, &info3->base);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(info3);
+ return NULL;
}
if (orig->sidcount) {
diff --git a/source3/rpc_client/util_netlogon.c b/source3/rpc_client/util_netlogon.c
new file mode 100644
index 00000000000..558a4dae03d
--- /dev/null
+++ b/source3/rpc_client/util_netlogon.c
@@ -0,0 +1,63 @@
+/*
+ Unix SMB/CIFS implementation.
+ Authentication utility functions
+ Copyright (C) Volker Lendecke 2010
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "../librpc/gen_ndr/netlogon.h"
+#include "../libcli/security/security.h"
+#include "rpc_client/util_netlogon.h"
+
+#define COPY_LSA_STRING(mem_ctx, in, out, name) do { \
+ if (in->name.string) { \
+ out->name.string = talloc_strdup(mem_ctx, in->name.string); \
+ NT_STATUS_HAVE_NO_MEMORY(out->name.string); \
+ } \
+} while (0)
+
+NTSTATUS copy_netr_SamBaseInfo(TALLOC_CTX *mem_ctx,
+ const struct netr_SamBaseInfo *in,
+ struct netr_SamBaseInfo *out)
+{
+ /* first copy all, then realloc pointers */
+ *out = *in;
+
+ COPY_LSA_STRING(mem_ctx, in, out, account_name);
+ COPY_LSA_STRING(mem_ctx, in, out, full_name);
+ COPY_LSA_STRING(mem_ctx, in, out, logon_script);
+ COPY_LSA_STRING(mem_ctx, in, out, profile_path);
+ COPY_LSA_STRING(mem_ctx, in, out, home_directory);
+ COPY_LSA_STRING(mem_ctx, in, out, home_drive);
+
+ if (in->groups.count) {
+ out->groups.rids = (struct samr_RidWithAttribute *)
+ talloc_memdup(mem_ctx, in->groups.rids,
+ (sizeof(struct samr_RidWithAttribute) *
+ in->groups.count));
+ NT_STATUS_HAVE_NO_MEMORY(out->groups.rids);
+ }
+
+ COPY_LSA_STRING(mem_ctx, in, out, logon_server);
+ COPY_LSA_STRING(mem_ctx, in, out, domain);
+
+ if (in->domain_sid) {
+ out->domain_sid = dom_sid_dup(mem_ctx, in->domain_sid);
+ NT_STATUS_HAVE_NO_MEMORY(out->domain_sid);
+ }
+
+ return NT_STATUS_OK;
+}
diff --git a/source3/rpc_client/util_netlogon.h b/source3/rpc_client/util_netlogon.h
new file mode 100644
index 00000000000..42e4326f7dc
--- /dev/null
+++ b/source3/rpc_client/util_netlogon.h
@@ -0,0 +1,5 @@
+/* The following definitions come from rpc_client/util_netlogon.c */
+
+NTSTATUS copy_netr_SamBaseInfo(TALLOC_CTX *mem_ctx,
+ const struct netr_SamBaseInfo *in,
+ struct netr_SamBaseInfo *out);
diff --git a/source3/wscript_build b/source3/wscript_build
index 611e28d5ce8..91af04863ca 100644
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -43,7 +43,7 @@ LIBCLI_LSA_SRC = '''rpc_client/cli_lsarpc.c'''
LIBCLI_SAMR_SRC = 'rpc_client/cli_samr.c'
-LIBRPCCLI_NETLOGON_SRC = 'rpc_client/cli_netlogon.c'
+LIBRPCCLI_NETLOGON_SRC = 'rpc_client/cli_netlogon.c rpc_client/util_netlogon.c'
# this includes only the low level parse code, not stuff
# that requires knowledge of security contexts