summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/Makefile.in2
-rw-r--r--source3/include/includes.h1
-rw-r--r--source3/include/rpc_unixinfo.h172
-rw-r--r--source3/librpc/gen_ndr/ndr_unixinfo.c43
-rw-r--r--source3/librpc/gen_ndr/srv_dfs.c12
-rw-r--r--source3/librpc/gen_ndr/srv_lsa.c200
-rw-r--r--source3/librpc/gen_ndr/srv_lsa.h2
-rw-r--r--source3/librpc/gen_ndr/srv_unixinfo.c32
-rw-r--r--source3/librpc/gen_ndr/srv_unixinfo.h2
-rw-r--r--source3/librpc/gen_ndr/unixinfo.h2
-rw-r--r--source3/rpc_parse/parse_unixinfo.c266
-rw-r--r--source3/rpc_server/srv_unixinfo.c163
-rw-r--r--source3/rpc_server/srv_unixinfo_nt.c116
13 files changed, 307 insertions, 706 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 778e520ca1..9d3c023154 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -314,7 +314,7 @@ RPC_NETLOG_OBJ = rpc_server/srv_netlog.o rpc_server/srv_netlog_nt.o
RPC_SAMR_OBJ = rpc_server/srv_samr.o rpc_server/srv_samr_nt.o \
rpc_server/srv_samr_util.o
-RPC_UNIXINFO_OBJ = rpc_server/srv_unixinfo.o rpc_server/srv_unixinfo_nt.o rpc_parse/parse_unixinfo.o
+RPC_UNIXINFO_OBJ = librpc/gen_ndr/srv_unixinfo.o rpc_server/srv_unixinfo_nt.o
REGFIO_OBJ = registry/regfio.o
RPC_REG_OBJ = rpc_server/srv_reg.o rpc_server/srv_reg_nt.o $(REGFIO_OBJ)
diff --git a/source3/include/includes.h b/source3/include/includes.h
index 319a475bcf..f56faa7551 100644
--- a/source3/include/includes.h
+++ b/source3/include/includes.h
@@ -1008,7 +1008,6 @@ extern int errno;
#include "rpc_ds.h"
#include "rpc_echo.h"
#include "rpc_shutdown.h"
-#include "rpc_unixinfo.h"
#include "rpc_perfcount.h"
#include "rpc_perfcount_defs.h"
#include "nt_printing.h"
diff --git a/source3/include/rpc_unixinfo.h b/source3/include/rpc_unixinfo.h
deleted file mode 100644
index 913196b7c9..0000000000
--- a/source3/include/rpc_unixinfo.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- Unixinfo definitions.
-
- Copyright (C) Volker Lendecke 2005
-
- 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 2 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _RPC_UNIXINFO_H
-#define _RPC_UNIXINFO_H
-
-#define UNIXINFO_SID_TO_UID 0x00
-#define UNIXINFO_UID_TO_SID 0x01
-#define UNIXINFO_SID_TO_GID 0x02
-#define UNIXINFO_GID_TO_SID 0x03
-#define UNIXINFO_GETPWUID 0x04
-
-typedef struct unixinfo_q_sid_to_uid {
- DOM_SID sid;
-} UNIXINFO_Q_SID_TO_UID;
-
-typedef struct unixinfo_r_sid_to_uid {
- uint64 uid;
- NTSTATUS status;
-} UNIXINFO_R_SID_TO_UID;
-
-typedef struct unixinfo_q_uid_to_sid {
- uint64 uid;
-} UNIXINFO_Q_UID_TO_SID;
-
-typedef struct unixinfo_r_uid_to_sid {
- uint32 sidptr;
- DOM_SID sid;
- NTSTATUS status;
-} UNIXINFO_R_UID_TO_SID;
-
-typedef struct unixinfo_q_sid_to_gid {
- DOM_SID sid;
-} UNIXINFO_Q_SID_TO_GID;
-
-typedef struct unixinfo_r_sid_to_gid {
- uint64 gid;
- NTSTATUS status;
-} UNIXINFO_R_SID_TO_GID;
-
-typedef struct unixinfo_q_gid_to_sid {
- uint64 gid;
-} UNIXINFO_Q_GID_TO_SID;
-
-typedef struct unixinfo_r_gid_to_sid {
- uint32 sidptr;
- DOM_SID sid;
- NTSTATUS status;
-} UNIXINFO_R_GID_TO_SID;
-
-typedef struct unixinfo_q_getpwuid {
- uint32 count;
- uint64 *uid;
-} UNIXINFO_Q_GETPWUID;
-
-struct unixinfo_getpwuid {
- /* name, gid and gecos explicitly excluded, these values can be
- retrieved via other means */
- NTSTATUS status;
- const char *homedir;
- const char *shell;
-};
-
-typedef struct unixinfo_r_getpwuid {
- uint32 count;
- struct unixinfo_getpwuid *info;
- NTSTATUS status;
-} UNIXINFO_R_GETPWUID;
-
-#endif
-/*
- Unix SMB/CIFS implementation.
-
- Unixinfo definitions.
-
- Copyright (C) Volker Lendecke 2005
-
- 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 2 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _RPC_UNIXINFO_H
-#define _RPC_UNIXINFO_H
-
-#define UNIXINFO_SID_TO_UID 0x00
-#define UNIXINFO_UID_TO_SID 0x01
-#define UNIXINFO_SID_TO_GID 0x02
-#define UNIXINFO_GID_TO_SID 0x03
-#define UNIXINFO_GETPWUID 0x04
-
-typedef struct unixinfo_q_sid_to_uid {
- DOM_SID sid;
-} UNIXINFO_Q_SID_TO_UID;
-
-typedef struct unixinfo_r_sid_to_uid {
- uint64 uid;
- NTSTATUS status;
-} UNIXINFO_R_SID_TO_UID;
-
-typedef struct unixinfo_q_uid_to_sid {
- uint64 uid;
-} UNIXINFO_Q_UID_TO_SID;
-
-typedef struct unixinfo_r_uid_to_sid {
- uint32 sidptr;
- DOM_SID sid;
- NTSTATUS status;
-} UNIXINFO_R_UID_TO_SID;
-
-typedef struct unixinfo_q_sid_to_gid {
- DOM_SID sid;
-} UNIXINFO_Q_SID_TO_GID;
-
-typedef struct unixinfo_r_sid_to_gid {
- uint64 gid;
- NTSTATUS status;
-} UNIXINFO_R_SID_TO_GID;
-
-typedef struct unixinfo_q_gid_to_sid {
- uint64 gid;
-} UNIXINFO_Q_GID_TO_SID;
-
-typedef struct unixinfo_r_gid_to_sid {
- uint32 sidptr;
- DOM_SID sid;
- NTSTATUS status;
-} UNIXINFO_R_GID_TO_SID;
-
-typedef struct unixinfo_q_getpwuid {
- uint64 uid;
-} UNIXINFO_Q_GETPWUID;
-
-typedef struct unixinfo_r_getpwuid {
- /* name and gid explicitly excluded, these values can be retrieved via
- other means */
- const char *gecos;
- const char *homedir;
- const char *shell;
- NTSTATUS status;
-} UNIXINFO_R_GETPWUID;
-
-#endif
diff --git a/source3/librpc/gen_ndr/ndr_unixinfo.c b/source3/librpc/gen_ndr/ndr_unixinfo.c
index 4a5a2c70d6..bbf76a368b 100644
--- a/source3/librpc/gen_ndr/ndr_unixinfo.c
+++ b/source3/librpc/gen_ndr/ndr_unixinfo.c
@@ -327,7 +327,7 @@ _PUBLIC_ void ndr_print_unixinfo_GidToSid(struct ndr_print *ndr, const char *nam
NTSTATUS ndr_push_unixinfo_GetPWUid(struct ndr_push *ndr, int flags, const struct unixinfo_GetPWUid *r)
{
uint32_t cntr_uids_0;
- uint32_t cntr_infos_1;
+ uint32_t cntr_infos_0;
if (flags & NDR_IN) {
if (r->in.count == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.count));
@@ -339,10 +339,9 @@ NTSTATUS ndr_push_unixinfo_GetPWUid(struct ndr_push *ndr, int flags, const struc
if (flags & NDR_OUT) {
if (r->out.count == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
- if (r->out.infos == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
- for (cntr_infos_1 = 0; cntr_infos_1 < *r->out.count; cntr_infos_1++) {
- NDR_CHECK(ndr_push_unixinfo_GetPWUidInfo(ndr, NDR_SCALARS, &r->out.infos[cntr_infos_1]));
+ for (cntr_infos_0 = 0; cntr_infos_0 < *r->out.count; cntr_infos_0++) {
+ NDR_CHECK(ndr_push_unixinfo_GetPWUidInfo(ndr, NDR_SCALARS, &r->out.infos[cntr_infos_0]));
}
NDR_CHECK(ndr_push_NTSTATUS(ndr, NDR_SCALARS, r->out.result));
}
@@ -352,10 +351,10 @@ NTSTATUS ndr_push_unixinfo_GetPWUid(struct ndr_push *ndr, int flags, const struc
NTSTATUS ndr_pull_unixinfo_GetPWUid(struct ndr_pull *ndr, int flags, struct unixinfo_GetPWUid *r)
{
uint32_t cntr_uids_0;
- uint32_t cntr_infos_1;
+ uint32_t cntr_infos_0;
TALLOC_CTX *_mem_save_count_0;
TALLOC_CTX *_mem_save_uids_0;
- TALLOC_CTX *_mem_save_infos_1;
+ TALLOC_CTX *_mem_save_infos_0;
if (flags & NDR_IN) {
ZERO_STRUCT(r->out);
@@ -379,9 +378,6 @@ NTSTATUS ndr_pull_unixinfo_GetPWUid(struct ndr_pull *ndr, int flags, struct unix
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_uids_0, 0);
NDR_PULL_ALLOC(ndr, r->out.count);
*r->out.count = *r->in.count;
- if (r->in.count == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
- NDR_PULL_ALLOC_N(ndr, r->out.infos, *r->in.count);
- memset(r->out.infos, 0, *r->in.count * sizeof(*r->out.infos));
if (r->in.uids) {
if (r->in.count == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->in.uids, *r->in.count));
@@ -399,15 +395,13 @@ NTSTATUS ndr_pull_unixinfo_GetPWUid(struct ndr_pull *ndr, int flags, struct unix
}
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
NDR_CHECK(ndr_pull_array_size(ndr, &r->out.infos));
- if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
- NDR_PULL_ALLOC_N(ndr, r->out.infos, ndr_get_array_size(ndr, &r->out.infos));
- }
- _mem_save_infos_1 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_ALLOC_N(ndr, r->out.infos, ndr_get_array_size(ndr, &r->out.infos));
+ _mem_save_infos_0 = NDR_PULL_GET_MEM_CTX(ndr);
NDR_PULL_SET_MEM_CTX(ndr, r->out.infos, 0);
- for (cntr_infos_1 = 0; cntr_infos_1 < *r->out.count; cntr_infos_1++) {
- NDR_CHECK(ndr_pull_unixinfo_GetPWUidInfo(ndr, NDR_SCALARS, &r->out.infos[cntr_infos_1]));
+ for (cntr_infos_0 = 0; cntr_infos_0 < *r->out.count; cntr_infos_0++) {
+ NDR_CHECK(ndr_pull_unixinfo_GetPWUidInfo(ndr, NDR_SCALARS, &r->out.infos[cntr_infos_0]));
}
- NDR_PULL_SET_MEM_CTX(ndr, _mem_save_infos_1, 0);
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_infos_0, 0);
NDR_CHECK(ndr_pull_NTSTATUS(ndr, NDR_SCALARS, &r->out.result));
if (r->out.infos) {
if (r->out.count == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
@@ -420,7 +414,7 @@ NTSTATUS ndr_pull_unixinfo_GetPWUid(struct ndr_pull *ndr, int flags, struct unix
_PUBLIC_ void ndr_print_unixinfo_GetPWUid(struct ndr_print *ndr, const char *name, int flags, const struct unixinfo_GetPWUid *r)
{
uint32_t cntr_uids_0;
- uint32_t cntr_infos_1;
+ uint32_t cntr_infos_0;
ndr_print_struct(ndr, name, "unixinfo_GetPWUid");
ndr->depth++;
if (flags & NDR_SET_VALUES) {
@@ -453,20 +447,17 @@ _PUBLIC_ void ndr_print_unixinfo_GetPWUid(struct ndr_print *ndr, const char *nam
ndr->depth++;
ndr_print_uint32(ndr, "count", *r->out.count);
ndr->depth--;
- ndr_print_ptr(ndr, "infos", r->out.infos);
- ndr->depth++;
ndr->print(ndr, "%s: ARRAY(%d)", "infos", *r->out.count);
ndr->depth++;
- for (cntr_infos_1=0;cntr_infos_1<*r->out.count;cntr_infos_1++) {
- char *idx_1=NULL;
- asprintf(&idx_1, "[%d]", cntr_infos_1);
- if (idx_1) {
- ndr_print_unixinfo_GetPWUidInfo(ndr, "infos", &r->out.infos[cntr_infos_1]);
- free(idx_1);
+ for (cntr_infos_0=0;cntr_infos_0<*r->out.count;cntr_infos_0++) {
+ char *idx_0=NULL;
+ asprintf(&idx_0, "[%d]", cntr_infos_0);
+ if (idx_0) {
+ ndr_print_unixinfo_GetPWUidInfo(ndr, "infos", &r->out.infos[cntr_infos_0]);
+ free(idx_0);
}
}
ndr->depth--;
- ndr->depth--;
ndr_print_NTSTATUS(ndr, "result", r->out.result);
ndr->depth--;
}
diff --git a/source3/librpc/gen_ndr/srv_dfs.c b/source3/librpc/gen_ndr/srv_dfs.c
index 75f3cd3949..bd4503248d 100644
--- a/source3/librpc/gen_ndr/srv_dfs.c
+++ b/source3/librpc/gen_ndr/srv_dfs.c
@@ -31,6 +31,12 @@ static BOOL api_dfs_GetManagerVersion(pipes_struct *p)
return False;
}
+ r.out.exist_flag = talloc_size(mem_ctx, sizeof(*r.out.exist_flag));
+ if (r.out.exist_flag == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
_dfs_GetManagerVersion(p, r.out.exist_flag);
push = ndr_push_init_ctx(mem_ctx);
@@ -231,6 +237,12 @@ static BOOL api_dfs_GetInfo(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _dfs_GetInfo(p, r.in.path, r.in.server, r.in.share, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
diff --git a/source3/librpc/gen_ndr/srv_lsa.c b/source3/librpc/gen_ndr/srv_lsa.c
index 20d564b65f..c9780580d6 100644
--- a/source3/librpc/gen_ndr/srv_lsa.c
+++ b/source3/librpc/gen_ndr/srv_lsa.c
@@ -133,6 +133,12 @@ static BOOL api_lsa_EnumPrivs(pipes_struct *p)
}
r.out.resume_handle = r.in.resume_handle;
+ r.out.privs = talloc_size(mem_ctx, sizeof(*r.out.privs));
+ if (r.out.privs == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumPrivs(p, r.in.handle, r.in.resume_handle, r.in.max_count, r.out.privs);
push = ndr_push_init_ctx(mem_ctx);
@@ -183,6 +189,12 @@ static BOOL api_lsa_QuerySecurity(pipes_struct *p)
return False;
}
+ r.out.sdbuf = talloc_size(mem_ctx, sizeof(*r.out.sdbuf));
+ if (r.out.sdbuf == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QuerySecurity(p, r.in.handle, r.in.sec_info, r.out.sdbuf);
push = ndr_push_init_ctx(mem_ctx);
@@ -333,6 +345,12 @@ static BOOL api_lsa_OpenPolicy(pipes_struct *p)
return False;
}
+ r.out.handle = talloc_size(mem_ctx, sizeof(*r.out.handle));
+ if (r.out.handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_OpenPolicy(p, r.in.system_name, r.in.attr, r.in.access_mask, r.out.handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -383,6 +401,12 @@ static BOOL api_lsa_QueryInfoPolicy(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QueryInfoPolicy(p, r.in.handle, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
@@ -533,6 +557,12 @@ static BOOL api_lsa_CreateAccount(pipes_struct *p)
return False;
}
+ r.out.acct_handle = talloc_size(mem_ctx, sizeof(*r.out.acct_handle));
+ if (r.out.acct_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_CreateAccount(p, r.in.handle, r.in.sid, r.in.access_mask, r.out.acct_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -584,6 +614,12 @@ static BOOL api_lsa_EnumAccounts(pipes_struct *p)
}
r.out.resume_handle = r.in.resume_handle;
+ r.out.sids = talloc_size(mem_ctx, sizeof(*r.out.sids));
+ if (r.out.sids == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumAccounts(p, r.in.handle, r.in.resume_handle, r.in.num_entries, r.out.sids);
push = ndr_push_init_ctx(mem_ctx);
@@ -634,6 +670,12 @@ static BOOL api_lsa_CreateTrustedDomain(pipes_struct *p)
return False;
}
+ r.out.trustdom_handle = talloc_size(mem_ctx, sizeof(*r.out.trustdom_handle));
+ if (r.out.trustdom_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_CreateTrustedDomain(p, r.in.handle, r.in.info, r.in.access_mask, r.out.trustdom_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -685,6 +727,12 @@ static BOOL api_lsa_EnumTrustDom(pipes_struct *p)
}
r.out.resume_handle = r.in.resume_handle;
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumTrustDom(p, r.in.handle, r.in.resume_handle, r.in.max_size, r.out.domains);
push = ndr_push_init_ctx(mem_ctx);
@@ -735,6 +783,12 @@ static BOOL api_lsa_LookupNames(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.sids = r.in.sids;
r.out.count = r.in.count;
r.out.result = _lsa_LookupNames(p, r.in.handle, r.in.num_names, r.in.names, r.out.domains, r.in.sids, r.in.level, r.in.count);
@@ -787,6 +841,12 @@ static BOOL api_lsa_LookupSids(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.names = r.in.names;
r.out.count = r.in.count;
r.out.result = _lsa_LookupSids(p, r.in.handle, r.in.sids, r.out.domains, r.in.names, r.in.level, r.in.count);
@@ -839,6 +899,12 @@ static BOOL api_lsa_CreateSecret(pipes_struct *p)
return False;
}
+ r.out.sec_handle = talloc_size(mem_ctx, sizeof(*r.out.sec_handle));
+ if (r.out.sec_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_CreateSecret(p, r.in.handle, r.in.name, r.in.access_mask, r.out.sec_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -889,6 +955,12 @@ static BOOL api_lsa_OpenAccount(pipes_struct *p)
return False;
}
+ r.out.acct_handle = talloc_size(mem_ctx, sizeof(*r.out.acct_handle));
+ if (r.out.acct_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_OpenAccount(p, r.in.handle, r.in.sid, r.in.access_mask, r.out.acct_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -939,6 +1011,12 @@ static BOOL api_lsa_EnumPrivsAccount(pipes_struct *p)
return False;
}
+ r.out.privs = talloc_size(mem_ctx, sizeof(*r.out.privs));
+ if (r.out.privs == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumPrivsAccount(p, r.in.handle, r.out.privs);
push = ndr_push_init_ctx(mem_ctx);
@@ -1289,6 +1367,12 @@ static BOOL api_lsa_OpenTrustedDomain(pipes_struct *p)
return False;
}
+ r.out.trustdom_handle = talloc_size(mem_ctx, sizeof(*r.out.trustdom_handle));
+ if (r.out.trustdom_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_OpenTrustedDomain(p, r.in.handle, r.in.sid, r.in.access_mask, r.out.trustdom_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -1339,6 +1423,12 @@ static BOOL api_lsa_QueryTrustedDomainInfo(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QueryTrustedDomainInfo(p, r.in.trustdom_handle, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
@@ -1439,6 +1529,12 @@ static BOOL api_lsa_OpenSecret(pipes_struct *p)
return False;
}
+ r.out.sec_handle = talloc_size(mem_ctx, sizeof(*r.out.sec_handle));
+ if (r.out.sec_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_OpenSecret(p, r.in.handle, r.in.name, r.in.access_mask, r.out.sec_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -1593,6 +1689,12 @@ static BOOL api_lsa_LookupPrivValue(pipes_struct *p)
return False;
}
+ r.out.luid = talloc_size(mem_ctx, sizeof(*r.out.luid));
+ if (r.out.luid == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_LookupPrivValue(p, r.in.handle, r.in.name, r.out.luid);
push = ndr_push_init_ctx(mem_ctx);
@@ -1643,6 +1745,12 @@ static BOOL api_lsa_LookupPrivName(pipes_struct *p)
return False;
}
+ r.out.name = talloc_size(mem_ctx, sizeof(*r.out.name));
+ if (r.out.name == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_LookupPrivName(p, r.in.handle, r.in.luid, r.out.name);
push = ndr_push_init_ctx(mem_ctx);
@@ -1693,6 +1801,12 @@ static BOOL api_lsa_LookupPrivDisplayName(pipes_struct *p)
return False;
}
+ r.out.disp_name = talloc_size(mem_ctx, sizeof(*r.out.disp_name));
+ if (r.out.disp_name == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.language_id = r.in.language_id;
r.out.result = _lsa_LookupPrivDisplayName(p, r.in.handle, r.in.name, r.out.disp_name, r.in.language_id, r.in.unknown);
@@ -1794,6 +1908,12 @@ static BOOL api_lsa_EnumAccountsWithUserRight(pipes_struct *p)
return False;
}
+ r.out.sids = talloc_size(mem_ctx, sizeof(*r.out.sids));
+ if (r.out.sids == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumAccountsWithUserRight(p, r.in.handle, r.in.name, r.out.sids);
push = ndr_push_init_ctx(mem_ctx);
@@ -1844,6 +1964,12 @@ static BOOL api_lsa_EnumAccountRights(pipes_struct *p)
return False;
}
+ r.out.rights = talloc_size(mem_ctx, sizeof(*r.out.rights));
+ if (r.out.rights == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumAccountRights(p, r.in.handle, r.in.sid, r.out.rights);
push = ndr_push_init_ctx(mem_ctx);
@@ -1994,6 +2120,12 @@ static BOOL api_lsa_QueryTrustedDomainInfoBySid(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QueryTrustedDomainInfoBySid(p, r.in.handle, r.in.dom_sid, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
@@ -2244,6 +2376,12 @@ static BOOL api_lsa_OpenPolicy2(pipes_struct *p)
return False;
}
+ r.out.handle = talloc_size(mem_ctx, sizeof(*r.out.handle));
+ if (r.out.handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_OpenPolicy2(p, r.in.system_name, r.in.attr, r.in.access_mask, r.out.handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -2346,6 +2484,12 @@ static BOOL api_lsa_QueryInfoPolicy2(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QueryInfoPolicy2(p, r.in.handle, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
@@ -2446,6 +2590,12 @@ static BOOL api_lsa_QueryTrustedDomainInfoByName(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QueryTrustedDomainInfoByName(p, r.in.handle, r.in.trusted_domain, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
@@ -2547,6 +2697,12 @@ static BOOL api_lsa_EnumTrustedDomainsEx(pipes_struct *p)
}
r.out.resume_handle = r.in.resume_handle;
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_EnumTrustedDomainsEx(p, r.in.handle, r.in.resume_handle, r.out.domains, r.in.max_size);
push = ndr_push_init_ctx(mem_ctx);
@@ -2698,6 +2854,12 @@ static BOOL api_lsa_QueryDomainInformationPolicy(pipes_struct *p)
return False;
}
+ r.out.info = talloc_size(mem_ctx, sizeof(*r.out.info));
+ if (r.out.info == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_QueryDomainInformationPolicy(p, r.in.handle, r.in.level, r.out.info);
push = ndr_push_init_ctx(mem_ctx);
@@ -2798,6 +2960,12 @@ static BOOL api_lsa_OpenTrustedDomainByName(pipes_struct *p)
return False;
}
+ r.out.trustdom_handle = talloc_size(mem_ctx, sizeof(*r.out.trustdom_handle));
+ if (r.out.trustdom_handle == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _lsa_OpenTrustedDomainByName(p, r.in.handle, r.in.name, r.in.access_mask, r.out.trustdom_handle);
push = ndr_push_init_ctx(mem_ctx);
@@ -2898,6 +3066,12 @@ static BOOL api_lsa_LookupSids2(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.names = r.in.names;
r.out.count = r.in.count;
r.out.result = _lsa_LookupSids2(p, r.in.handle, r.in.sids, r.out.domains, r.in.names, r.in.level, r.in.count, r.in.unknown1, r.in.unknown2);
@@ -2950,6 +3124,12 @@ static BOOL api_lsa_LookupNames2(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.sids = r.in.sids;
r.out.count = r.in.count;
r.out.result = _lsa_LookupNames2(p, r.in.handle, r.in.num_names, r.in.names, r.out.domains, r.in.sids, r.in.level, r.in.count, r.in.unknown1, r.in.unknown2);
@@ -3452,6 +3632,12 @@ static BOOL api_lsa_LookupNames3(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.sids = r.in.sids;
r.out.count = r.in.count;
r.out.result = _lsa_LookupNames3(p, r.in.handle, r.in.num_names, r.in.names, r.out.domains, r.in.sids, r.in.level, r.in.count, r.in.unknown1, r.in.unknown2);
@@ -3854,6 +4040,12 @@ static BOOL api_lsa_LookupSids3(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.names = r.in.names;
r.out.count = r.in.count;
r.out.result = _lsa_LookupSids3(p, r.in.sids, r.out.domains, r.in.names, r.in.level, r.in.count, r.in.unknown1, r.in.unknown2);
@@ -3906,6 +4098,12 @@ static BOOL api_lsa_LookupNames4(pipes_struct *p)
return False;
}
+ r.out.domains = talloc_size(mem_ctx, sizeof(*r.out.domains));
+ if (r.out.domains == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.sids = r.in.sids;
r.out.count = r.in.count;
r.out.result = _lsa_LookupNames4(p, r.in.num_names, r.in.names, r.out.domains, r.in.sids, r.in.level, r.in.count, r.in.unknown1, r.in.unknown2);
@@ -4227,7 +4425,7 @@ void lsarpc_get_pipe_fns(struct api_struct **fns, int *n_fns)
*n_fns = sizeof(api_lsarpc_cmds) / sizeof(struct api_struct);
}
-NTSTATUS rpc_netdfs_init(void)
+NTSTATUS rpc_lsarpc_init(void)
{
return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "lsarpc", "lsarpc", api_lsarpc_cmds, sizeof(api_lsarpc_cmds) / sizeof(struct api_struct));
}
diff --git a/source3/librpc/gen_ndr/srv_lsa.h b/source3/librpc/gen_ndr/srv_lsa.h
index b6fdf5f1d3..4dd3c75415 100644
--- a/source3/librpc/gen_ndr/srv_lsa.h
+++ b/source3/librpc/gen_ndr/srv_lsa.h
@@ -84,5 +84,5 @@ NTSTATUS _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(pipes_struct *p);
NTSTATUS _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(pipes_struct *p);
NTSTATUS _lsa_LSARADTREPORTSECURITYEVENT(pipes_struct *p);
void lsarpc_get_pipe_fns(struct api_struct **fns, int *n_fns);
-NTSTATUS rpc_netdfs_init(void);
+NTSTATUS rpc_lsarpc_init(void);
#endif /* __SRV_LSARPC__ */
diff --git a/source3/librpc/gen_ndr/srv_unixinfo.c b/source3/librpc/gen_ndr/srv_unixinfo.c
index 1c58e94405..e992330866 100644
--- a/source3/librpc/gen_ndr/srv_unixinfo.c
+++ b/source3/librpc/gen_ndr/srv_unixinfo.c
@@ -31,6 +31,12 @@ static BOOL api_unixinfo_SidToUid(pipes_struct *p)
return False;
}
+ r.out.uid = talloc_size(mem_ctx, sizeof(*r.out.uid));
+ if (r.out.uid == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _unixinfo_SidToUid(p, r.in.sid, r.out.uid);
push = ndr_push_init_ctx(mem_ctx);
@@ -81,6 +87,12 @@ static BOOL api_unixinfo_UidToSid(pipes_struct *p)
return False;
}
+ r.out.sid = talloc_size(mem_ctx, sizeof(*r.out.sid));
+ if (r.out.sid == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _unixinfo_UidToSid(p, r.in.uid, r.out.sid);
push = ndr_push_init_ctx(mem_ctx);
@@ -131,6 +143,12 @@ static BOOL api_unixinfo_SidToGid(pipes_struct *p)
return False;
}
+ r.out.gid = talloc_size(mem_ctx, sizeof(*r.out.gid));
+ if (r.out.gid == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _unixinfo_SidToGid(p, r.in.sid, r.out.gid);
push = ndr_push_init_ctx(mem_ctx);
@@ -181,6 +199,12 @@ static BOOL api_unixinfo_GidToSid(pipes_struct *p)
return False;
}
+ r.out.sid = talloc_size(mem_ctx, sizeof(*r.out.sid));
+ if (r.out.sid == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _unixinfo_GidToSid(p, r.in.gid, r.out.sid);
push = ndr_push_init_ctx(mem_ctx);
@@ -232,6 +256,12 @@ static BOOL api_unixinfo_GetPWUid(pipes_struct *p)
}
r.out.count = r.in.count;
+ r.out.infos = talloc_array_size(mem_ctx, sizeof(*r.out.infos), *r.in.count);
+ if (r.out.infos == NULL) {
+ talloc_free(mem_ctx);
+ return False;
+ }
+
r.out.result = _unixinfo_GetPWUid(p, r.in.count, r.in.uids, r.out.infos);
push = ndr_push_init_ctx(mem_ctx);
@@ -274,7 +304,7 @@ void unixinfo_get_pipe_fns(struct api_struct **fns, int *n_fns)
*n_fns = sizeof(api_unixinfo_cmds) / sizeof(struct api_struct);
}
-NTSTATUS rpc_netdfs_init(void)
+NTSTATUS rpc_unixinfo_init(void)
{
return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "unixinfo", "unixinfo", api_unixinfo_cmds, sizeof(api_unixinfo_cmds) / sizeof(struct api_struct));
}
diff --git a/source3/librpc/gen_ndr/srv_unixinfo.h b/source3/librpc/gen_ndr/srv_unixinfo.h
index 751b85162d..d21fb839ad 100644
--- a/source3/librpc/gen_ndr/srv_unixinfo.h
+++ b/source3/librpc/gen_ndr/srv_unixinfo.h
@@ -7,5 +7,5 @@ NTSTATUS _unixinfo_SidToGid(pipes_struct *p, struct dom_sid sid, uint64_t *gid);
NTSTATUS _unixinfo_GidToSid(pipes_struct *p, uint64_t gid, struct dom_sid *sid);
NTSTATUS _unixinfo_GetPWUid(pipes_struct *p, uint32_t *count, uint64_t *uids, struct unixinfo_GetPWUidInfo *infos);
void unixinfo_get_pipe_fns(struct api_struct **fns, int *n_fns);
-NTSTATUS rpc_netdfs_init(void);
+NTSTATUS rpc_unixinfo_init(void);
#endif /* __SRV_UNIXINFO__ */
diff --git a/source3/librpc/gen_ndr/unixinfo.h b/source3/librpc/gen_ndr/unixinfo.h
index 78914daebe..8f8984963f 100644
--- a/source3/librpc/gen_ndr/unixinfo.h
+++ b/source3/librpc/gen_ndr/unixinfo.h
@@ -71,7 +71,7 @@ struct unixinfo_GetPWUid {
struct {
uint32_t *count;/* [keepref,ref,range(0 1023)] */
- struct unixinfo_GetPWUidInfo *infos;/* [keepref,ref,size_is(*count)] */
+ struct unixinfo_GetPWUidInfo *infos;/* [keepref,size_is(*count)] */
NTSTATUS result;
} out;
diff --git a/source3/rpc_parse/parse_unixinfo.c b/source3/rpc_parse/parse_unixinfo.c
deleted file mode 100644
index 72e0d392ec..0000000000
--- a/source3/rpc_parse/parse_unixinfo.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Unix SMB/CIFS implementation.
- *
- * RPC Pipe client / server routines
- *
- * Copyright (C) Volker Lendecke 2005
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "includes.h"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_RPC_PARSE
-
-void init_q_unixinfo_sid_to_uid(UNIXINFO_Q_SID_TO_UID *q_d, const DOM_SID *sid)
-{
- sid_copy(&q_d->sid, sid);
-}
-
-BOOL unixinfo_io_q_unixinfo_sid_to_uid(const char *desc, UNIXINFO_Q_SID_TO_UID *q_d,
- prs_struct *ps, int depth)
-{
- return smb_io_dom_sid(desc, &q_d->sid, ps, depth);
-}
-
-BOOL unixinfo_io_r_unixinfo_sid_to_uid(const char *desc, UNIXINFO_R_SID_TO_UID *r_d,
- prs_struct *ps, int depth)
-{
- if (!prs_uint64(desc, ps, depth, &r_d->uid))
- return False;
-
- if (!prs_ntstatus(desc, ps, depth, &r_d->status))
- return False;
-
- return True;
-}
-
-void init_q_unixinfo_uid_to_sid(UNIXINFO_Q_UID_TO_SID *q_d, uint64 uid)
-{
- q_d->uid = uid;
-}
-
-BOOL unixinfo_io_q_unixinfo_uid_to_sid(const char *desc, UNIXINFO_Q_UID_TO_SID *q_d,
- prs_struct *ps, int depth)
-{
- return prs_uint64(desc, ps, depth, &q_d->uid);
-}
-
-void init_r_unixinfo_uid_to_sid(UNIXINFO_R_UID_TO_SID *r_d, DOM_SID *sid)
-{
- if (sid == NULL) {
- r_d->sidptr = 0;
- return;
- }
- r_d->sidptr = 1;
- sid_copy(&r_d->sid, sid);
-}
-
-BOOL unixinfo_io_r_unixinfo_uid_to_sid(const char *desc, UNIXINFO_R_UID_TO_SID *r_d,
- prs_struct *ps, int depth)
-{
- if (!prs_uint32("sidptr", ps, depth, &r_d->sidptr))
- return False;
-
- if (r_d->sidptr != 0) {
- if (!smb_io_dom_sid(desc, &r_d->sid, ps, depth))
- return False;
- }
-
- if (!prs_ntstatus(desc, ps, depth, &r_d->status))
- return False;
-
- return True;
-}
-
-void init_q_unixinfo_sid_to_gid(UNIXINFO_Q_SID_TO_GID *q_d, const DOM_SID *sid)
-{
- sid_copy(&q_d->sid, sid);
-}
-
-BOOL unixinfo_io_q_unixinfo_sid_to_gid(const char *desc, UNIXINFO_Q_SID_TO_GID *q_d,
- prs_struct *ps, int depth)
-{
- return smb_io_dom_sid(desc, &q_d->sid, ps, depth);
-}
-
-void init_r_unixinfo_sid_to_gid(UNIXINFO_R_SID_TO_GID *r_d, uint64 gid)
-{
- r_d->gid = gid;
- r_d->status = NT_STATUS_OK;
-}
-
-BOOL unixinfo_io_r_unixinfo_sid_to_gid(const char *desc, UNIXINFO_R_SID_TO_GID *r_d,
- prs_struct *ps, int depth)
-{
- if (!prs_uint64(desc, ps, depth, &r_d->gid))
- return False;
-
- if (!prs_ntstatus(desc, ps, depth, &r_d->status))
- return False;
-
- return True;
-}
-
-void init_q_unixinfo_gid_to_sid(UNIXINFO_Q_GID_TO_SID *q_d, uint64 gid)
-{
- q_d->gid = gid;
-}
-
-BOOL unixinfo_io_q_unixinfo_gid_to_sid(const char *desc, UNIXINFO_Q_GID_TO_SID *q_d,
- prs_struct *ps, int depth)
-{
- return prs_uint64(desc, ps, depth, &q_d->gid);
-}
-
-void init_r_unixinfo_gid_to_sid(UNIXINFO_R_GID_TO_SID *r_d, DOM_SID *sid)
-{
- if (sid == NULL) {
- r_d->sidptr = 0;
- return;
- }
- r_d->sidptr = 1;
- sid_copy(&r_d->sid, sid);
-}
-
-BOOL unixinfo_io_r_unixinfo_gid_to_sid(const char *desc, UNIXINFO_R_GID_TO_SID *r_d,
- prs_struct *ps, int depth)
-{
- if (!prs_uint32("sidptr", ps, depth, &r_d->sidptr))
- return False;
-
- if (r_d->sidptr != 0) {
- if (!smb_io_dom_sid(desc, &r_d->sid, ps, depth))
- return False;
- }
-
- if (!prs_ntstatus(desc, ps, depth, &r_d->status))
- return False;
-
- return True;
-}
-
-void init_q_unixinfo_getpwuid(UNIXINFO_Q_GETPWUID *r_d, int count,
- uint64 *uids)
-{
- r_d->count = count;
- r_d->uid = uids;
-}
-
-BOOL unixinfo_io_q_unixinfo_getpwuid(const char *desc,
- UNIXINFO_Q_GETPWUID *q_d,
- prs_struct *ps, int depth)
-{
- uint32 arraysize;
- int i;
-
- if (!prs_uint32("count", ps, depth, &q_d->count))
- return False;
-
- arraysize = q_d->count;
-
- if (!prs_uint32("arraysize", ps, depth, &arraysize))
- return False;
-
- if (arraysize != q_d->count) {
- DEBUG(10, ("count!=arraysize\n"));
- return False;
- }
-
- if (q_d->count > 1023) {
- DEBUG(10, ("Range exceeded\n"));
- return False;
- }
-
- if (UNMARSHALLING(ps)) {
- q_d->uid = PRS_ALLOC_MEM(ps, uint64, q_d->count);
- if (q_d->uid == NULL) {
- return False;
- }
- }
-
- for (i=0; i<q_d->count; i++) {
- if (!prs_uint64(desc, ps, depth+1, &q_d->uid[i]))
- return False;
- }
-
- return True;
-}
-
-void init_r_unixinfo_getpwuid(UNIXINFO_R_GETPWUID *r_d, uint32 count,
- struct unixinfo_getpwuid *info)
-{
- r_d->count = count;
- r_d->info = info;
-}
-
-BOOL unixinfo_io_r_unixinfo_getpwuid(const char *desc,
- UNIXINFO_R_GETPWUID *r_d,
- prs_struct *ps, int depth)
-{
- uint32 arraysize;
- int i;
-
- if (!prs_uint32("count", ps, depth, &r_d->count))
- return False;
-
- arraysize = r_d->count;
-
- if (!prs_uint32("arraysize", ps, depth, &arraysize))
- return False;
-
- if (arraysize != r_d->count) {
- DEBUG(10, ("count!=arraysize\n"));
- return False;
- }
-
- if (r_d->count > 1023) {
- DEBUG(10, ("Range exceeded\n"));
- return False;
- }
-
- if (UNMARSHALLING(ps)) {
- r_d->info = PRS_ALLOC_MEM(ps, struct unixinfo_getpwuid,
- r_d->count);
- if (r_d->info == NULL) {
- return False;
- }
- }
-
- for (i=0; i<r_d->count; i++) {
- if (!prs_align(ps))
- return False;
-
- if (!prs_ntstatus("status", ps, depth+1, &r_d->info[i].status))
- return False;
-
- if (!prs_string_alloc("homedir", ps, depth+1,
- &r_d->info[i].homedir))
- return False;
-
- if (!prs_string_alloc("shell", ps, depth+1,
- &r_d->info[i].shell))
- return False;
- }
-
- if (!prs_align(ps))
- return False;
-
- if (!prs_ntstatus(desc, ps, depth, &r_d->status))
- return False;
-
- return True;
-}
diff --git a/source3/rpc_server/srv_unixinfo.c b/source3/rpc_server/srv_unixinfo.c
deleted file mode 100644
index f21416dfab..0000000000
--- a/source3/rpc_server/srv_unixinfo.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Unix SMB/CIFS implementation.
- * RPC Pipe client / server routines for unixinfo-pipe
- * Copyright (C) Volker Lendecke 2005
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/* This is the interface to the rpcunixinfo pipe. */
-
-#include "includes.h"
-#include "nterr.h"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_RPC_SRV
-
-static BOOL api_sid_to_uid(pipes_struct *p)
-{
- UNIXINFO_Q_SID_TO_UID q_u;
- UNIXINFO_R_SID_TO_UID r_u;
-
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if (!unixinfo_io_q_unixinfo_sid_to_uid("", &q_u, data, 0))
- return False;
-
- r_u.status = _unixinfo_sid_to_uid(p, &q_u, &r_u);
-
- if (!unixinfo_io_r_unixinfo_sid_to_uid("", &r_u, rdata, 0))
- return False;
-
- return True;
-}
-
-static BOOL api_uid_to_sid(pipes_struct *p)
-{
- UNIXINFO_Q_UID_TO_SID q_u;
- UNIXINFO_R_UID_TO_SID r_u;
-
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if (!unixinfo_io_q_unixinfo_uid_to_sid("", &q_u, data, 0))
- return False;
-
- r_u.status = _unixinfo_uid_to_sid(p, &q_u, &r_u);
-
- if (!unixinfo_io_r_unixinfo_uid_to_sid("", &r_u, rdata, 0))
- return False;
-
- return True;
-}
-
-static BOOL api_sid_to_gid(pipes_struct *p)
-{
- UNIXINFO_Q_SID_TO_GID q_u;
- UNIXINFO_R_SID_TO_GID r_u;
-
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if (!unixinfo_io_q_unixinfo_sid_to_gid("", &q_u, data, 0))
- return False;
-
- r_u.status = _unixinfo_sid_to_gid(p, &q_u, &r_u);
-
- if (!unixinfo_io_r_unixinfo_sid_to_gid("", &r_u, rdata, 0))
- return False;
-
- return True;
-}
-
-static BOOL api_gid_to_sid(pipes_struct *p)
-{
- UNIXINFO_Q_GID_TO_SID q_u;
- UNIXINFO_R_GID_TO_SID r_u;
-
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if (!unixinfo_io_q_unixinfo_gid_to_sid("", &q_u, data, 0))
- return False;
-
- r_u.status = _unixinfo_gid_to_sid(p, &q_u, &r_u);
-
- if (!unixinfo_io_r_unixinfo_gid_to_sid("", &r_u, rdata, 0))
- return False;
-
- return True;
-}
-
-static BOOL api_getpwuid(pipes_struct *p)
-{
- UNIXINFO_Q_GETPWUID q_u;
- UNIXINFO_R_GETPWUID r_u;
-
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if (!unixinfo_io_q_unixinfo_getpwuid("", &q_u, data, 0))
- return False;
-
- r_u.status = _unixinfo_getpwuid(p, &q_u, &r_u);
-
- if (!unixinfo_io_r_unixinfo_getpwuid("", &r_u, rdata, 0))
- return False;
-
- return True;
-}
-
-/*******************************************************************
-\pipe\unixinfo commands
-********************************************************************/
-
-struct api_struct api_unixinfo_cmds[] = {
- {"SID_TO_UID", UNIXINFO_SID_TO_UID, api_sid_to_uid },
- {"UID_TO_SID", UNIXINFO_UID_TO_SID, api_uid_to_sid },
- {"SID_TO_GID", UNIXINFO_SID_TO_GID, api_sid_to_gid },
- {"GID_TO_SID", UNIXINFO_GID_TO_SID, api_gid_to_sid },
- {"GETPWUID", UNIXINFO_GETPWUID, api_getpwuid },
-};
-
-
-void unixinfo_get_pipe_fns( struct api_struct **fns, int *n_fns )
-{
- *fns = api_unixinfo_cmds;
- *n_fns = sizeof(api_unixinfo_cmds) / sizeof(struct api_struct);
-}
-
-NTSTATUS rpc_unixinfo_init(void)
-{
- return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
- "unixinfo", "unixinfo", api_unixinfo_cmds,
- sizeof(api_unixinfo_cmds) / sizeof(struct api_struct));
-}
diff --git a/source3/rpc_server/srv_unixinfo_nt.c b/source3/rpc_server/srv_unixinfo_nt.c
index 5afbb7bed0..321c6a6a5e 100644
--- a/source3/rpc_server/srv_unixinfo_nt.c
+++ b/source3/rpc_server/srv_unixinfo_nt.c
@@ -23,120 +23,92 @@
#include "includes.h"
#include "nterr.h"
+
+
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_RPC_SRV
/* Map a sid to a uid */
-NTSTATUS _unixinfo_sid_to_uid(pipes_struct *p,
- UNIXINFO_Q_SID_TO_UID *q_u,
- UNIXINFO_R_SID_TO_UID *r_u)
+NTSTATUS _unixinfo_SidToUid(pipes_struct *p, struct dom_sid sid, uint64_t *uid)
{
- uid_t uid;
+ uid_t real_uid;
+ NTSTATUS status;
+ *uid = 0;
- r_u->uid = 0;
+ status = sid_to_uid(&sid, &real_uid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED;
+ if (NT_STATUS_IS_OK(status))
+ *uid = real_uid;
- r_u->status = sid_to_uid(&q_u->sid, &uid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED;
- if (NT_STATUS_IS_OK(r_u->status))
- r_u->uid = uid;
-
- return r_u->status;
+ return status;
}
/* Map a uid to a sid */
-NTSTATUS _unixinfo_uid_to_sid(pipes_struct *p,
- UNIXINFO_Q_UID_TO_SID *q_u,
- UNIXINFO_R_UID_TO_SID *r_u)
+NTSTATUS _unixinfo_UidToSid(pipes_struct *p, uint64_t uid, struct dom_sid *sid)
{
- DOM_SID sid;
+ NTSTATUS status = NT_STATUS_NO_SUCH_USER;
- r_u->status = NT_STATUS_NO_SUCH_USER;
+ uid_to_sid(sid, (uid_t)uid);
+ status = NT_STATUS_OK;
- if (q_u->uid == 0) {
- uid_to_sid(&sid, q_u->uid);
- r_u->status = NT_STATUS_OK;
- }
-
- init_r_unixinfo_uid_to_sid(r_u,
- NT_STATUS_IS_OK(r_u->status) ? &sid : NULL);
-
- return r_u->status;
+ return status;
}
/* Map a sid to a gid */
-NTSTATUS _unixinfo_sid_to_gid(pipes_struct *p,
- UNIXINFO_Q_SID_TO_GID *q_u,
- UNIXINFO_R_SID_TO_GID *r_u)
+NTSTATUS _unixinfo_SidToGid(pipes_struct *p, struct dom_sid sid, uint64_t *gid)
{
- gid_t gid;
+ gid_t real_gid;
+ NTSTATUS status;
- r_u->gid = 0;
+ *gid = 0;
- r_u->status = sid_to_gid(&q_u->sid, &gid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED;
- if (NT_STATUS_IS_OK(r_u->status))
- r_u->gid = gid;
+ status = sid_to_gid(&sid, &real_gid) ? NT_STATUS_OK : NT_STATUS_NONE_MAPPED;
+ if (NT_STATUS_IS_OK(status))
+ *gid = real_gid;
- return r_u->status;
+ return status;
}
/* Map a gid to a sid */
-NTSTATUS _unixinfo_gid_to_sid(pipes_struct *p,
- UNIXINFO_Q_GID_TO_SID *q_u,
- UNIXINFO_R_GID_TO_SID *r_u)
+NTSTATUS _unixinfo_GidToSid(pipes_struct *p, uint64_t gid, struct dom_sid *sid)
{
- DOM_SID sid;
+ NTSTATUS status = NT_STATUS_NO_SUCH_GROUP;
- r_u->status = NT_STATUS_NO_SUCH_GROUP;
+ gid_to_sid(sid, (gid_t)gid);
+ status = NT_STATUS_OK;
- if (q_u->gid == 0) {
- gid_to_sid(&sid, q_u->gid);
- r_u->status = NT_STATUS_OK;
- }
-
- init_r_unixinfo_gid_to_sid(r_u,
- NT_STATUS_IS_OK(r_u->status) ? &sid : NULL);
-
- return r_u->status;
+ return status;
}
/* Get unix struct passwd information */
-NTSTATUS _unixinfo_getpwuid(pipes_struct *p,
- UNIXINFO_Q_GETPWUID *q_u,
- UNIXINFO_R_GETPWUID *r_u)
+NTSTATUS _unixinfo_GetPWUid(pipes_struct *p, uint32_t *count, uint64_t *uids,
+ struct unixinfo_GetPWUidInfo *infos)
{
int i;
+ NTSTATUS status;
- if (r_u->count > 1023) {
+ if (*count > 1023)
return NT_STATUS_INVALID_PARAMETER;
- }
-
- r_u->info = TALLOC_ARRAY(p->mem_ctx, struct unixinfo_getpwuid,
- q_u->count);
-
- if ((r_u->count > 0) && (r_u->info == NULL)) {
- return NT_STATUS_NO_MEMORY;
- }
- r_u->status = NT_STATUS_OK;
- r_u->count = q_u->count;
+ status = NT_STATUS_OK;
- for (i=0; i<r_u->count; i++) {
+ for (i=0; i<*count; i++) {
struct passwd *pw;
char *homedir, *shell;
ssize_t len1, len2;
- r_u->info[i].status = NT_STATUS_NO_SUCH_USER;
- r_u->info[i].homedir = "";
- r_u->info[i].shell = "";
+ infos[i].status = NT_STATUS_NO_SUCH_USER;
+ infos[i].homedir = "";
+ infos[i].shell = "";
- pw = getpwuid(q_u->uid[i]);
+ pw = getpwuid(uids[i]);
if (pw == NULL) {
- DEBUG(10, ("Did not find uid %lld\n", q_u->uid[i]));
+ DEBUG(10, ("Did not find uid %lld\n", uids[i]));
continue;
}
@@ -146,14 +118,14 @@ NTSTATUS _unixinfo_getpwuid(pipes_struct *p,
if ((len1 < 0) || (len2 < 0) || (homedir == NULL) ||
(shell == NULL)) {
DEBUG(3, ("push_utf8_talloc failed\n"));
- r_u->info[i].status = NT_STATUS_NO_MEMORY;
+ infos[i].status = NT_STATUS_NO_MEMORY;
continue;
}
- r_u->info[i].status = NT_STATUS_OK;
- r_u->info[i].homedir = homedir;
- r_u->info[i].shell = shell;
+ infos[i].status = NT_STATUS_OK;
+ infos[i].homedir = homedir;
+ infos[i].shell = shell;
}
- return r_u->status;
+ return status;
}