summaryrefslogtreecommitdiff
path: root/source3/lsarpcd
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lsarpcd')
-rw-r--r--source3/lsarpcd/lsarpcd.c3
-rw-r--r--source3/lsarpcd/lsarpcd_process.c58
-rw-r--r--source3/lsarpcd/srv_lsa.c20
3 files changed, 57 insertions, 24 deletions
diff --git a/source3/lsarpcd/lsarpcd.c b/source3/lsarpcd/lsarpcd.c
index 3c883029f0..ed665e85c5 100644
--- a/source3/lsarpcd/lsarpcd.c
+++ b/source3/lsarpcd/lsarpcd.c
@@ -40,6 +40,7 @@ extern int DEBUGLEVEL;
extern fstring remote_machine;
extern pstring myhostname;
+extern pstring OriginalDir;
/****************************************************************************
when exiting, take the whole family
@@ -456,6 +457,8 @@ static void usage(char *pname)
so set our umask to 0 */
umask(0);
+ dos_GetWd(OriginalDir);
+
init_uid();
/* this is for people who can't start the program correctly */
diff --git a/source3/lsarpcd/lsarpcd_process.c b/source3/lsarpcd/lsarpcd_process.c
index 47a4f9a86c..e33de5ce57 100644
--- a/source3/lsarpcd/lsarpcd_process.c
+++ b/source3/lsarpcd/lsarpcd_process.c
@@ -181,7 +181,7 @@ do a switch on the message type, and return the response size
****************************************************************************/
static int do_message(char *inbuf,char *outbuf,int size,int bufsize)
{
- static int pid= -1;
+ static int pid= -1;
pipes_struct *p = &static_pipe;
prs_struct pd;
@@ -195,24 +195,16 @@ static int do_message(char *inbuf,char *outbuf,int size,int bufsize)
pid = getpid();
/* dce/rpc command */
- if (rpc_command(p, &pd))
+ if (rpc_to_smb(p, smb_base(inbuf), smb_len(inbuf)))
{
char *copy_into = smb_base(outbuf);
- outsize = mem_buf_len(p->rhdr.data);
- if (!mem_buf_copy(copy_into, p->rhdr.data, 0, outsize))
+ outsize = mem_buf_len(p->rsmb_pdu.data);
+ if (!mem_buf_copy(copy_into, p->rsmb_pdu.data, 0, outsize))
{
return -1;
}
+ mem_free_data(p->rsmb_pdu.data);
}
- mem_free_data(pd.data);
-
- mem_free_data(p->rhdr .data);
- mem_free_data(p->rfault .data);
- mem_free_data(p->rdata .data);
- mem_free_data(p->rdata_i.data);
- mem_free_data(p->rauth .data);
- mem_free_data(p->rverf .data);
- mem_free_data(p->rntlm .data);
return outsize;
}
@@ -393,6 +385,7 @@ BOOL get_user_creds(struct user_creds *usr)
void lsarpcd_process(void)
{
struct user_creds usr;
+ gid_t *groups = NULL;
ZERO_STRUCT(static_pipe);
@@ -405,8 +398,45 @@ void lsarpcd_process(void)
return;
}
+ if (usr.uxs.num_grps != 0)
+ {
+ int i;
+ groups = malloc(usr.uxs.num_grps * sizeof(groups[0]));
+ if (groups == NULL)
+ {
+ return;
+ }
+ for (i = 0; i < usr.uxs.num_grps; i++)
+ {
+ groups[i] = (gid_t)usr.uxs.grps[i];
+ }
+ }
+
+ static_pipe.vuid = create_vuid(usr.uxs.uid, usr.uxs.gid,
+ usr.uxs.num_grps, groups,
+ usr.uxc.user_name,
+ usr.uxc.requested_name,
+ usr.uxc.real_name,
+ usr.uxc.guest,
+ usr.ntc.pwd.sess_key);
+
+ if (static_pipe.vuid == UID_FIELD_INVALID)
+ {
+ return;
+ }
+
free_user_creds(&usr);
+ become_vuser(static_pipe.vuid);
+
+ static_pipe.l = malloc(sizeof(*static_pipe.l));
+ if (static_pipe.l == NULL)
+ {
+ return;
+ }
+
+ ZERO_STRUCTP(static_pipe.l);
+
InBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
OutBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
if ((InBuffer == NULL) || (OutBuffer == NULL))
@@ -457,7 +487,7 @@ void lsarpcd_process(void)
t = time(NULL);
/* become root again if waiting */
- unbecome_user();
+ unbecome_vuser();
/* check for smb.conf reload */
if (counter >= service_load_counter + SMBD_RELOAD_CHECK)
diff --git a/source3/lsarpcd/srv_lsa.c b/source3/lsarpcd/srv_lsa.c
index 9b6a98e9a6..fbe83b02c8 100644
--- a/source3/lsarpcd/srv_lsa.c
+++ b/source3/lsarpcd/srv_lsa.c
@@ -140,7 +140,7 @@ static void lsa_reply_query_info(LSA_Q_QUERY_INFO *q_q, prs_struct *rdata,
{
/* set up the LSA QUERY INFO response */
- r_q.undoc_buffer = 0x1; /* bizarre */
+ r_q.undoc_buffer = 0x1;
r_q.info_class = q_q->info_class;
make_dom_query(&r_q.dom.id5, dom_name, dom_sid);
@@ -448,7 +448,7 @@ static void lsa_reply_lookup_names(prs_struct *rdata,
/***************************************************************************
api_lsa_open_policy
***************************************************************************/
-static void api_lsa_open_policy2( pipes_struct *p, prs_struct *data,
+static void api_lsa_open_policy2( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata )
{
LSA_Q_OPEN_POL2 q_o;
@@ -467,7 +467,7 @@ static void api_lsa_open_policy2( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_open_policy
***************************************************************************/
-static void api_lsa_open_policy( pipes_struct *p, prs_struct *data,
+static void api_lsa_open_policy( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata )
{
LSA_Q_OPEN_POL q_o;
@@ -486,7 +486,7 @@ static void api_lsa_open_policy( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_enum_trust_dom
***************************************************************************/
-static void api_lsa_enum_trust_dom( pipes_struct *p, prs_struct *data,
+static void api_lsa_enum_trust_dom( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata )
{
LSA_Q_ENUM_TRUST_DOM q_e;
@@ -503,7 +503,7 @@ static void api_lsa_enum_trust_dom( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_query_info
***************************************************************************/
-static void api_lsa_query_info( pipes_struct *p, prs_struct *data,
+static void api_lsa_query_info( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata )
{
LSA_Q_QUERY_INFO q_i;
@@ -545,7 +545,7 @@ static void api_lsa_query_info( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_lookup_sids
***************************************************************************/
-static void api_lsa_lookup_sids( pipes_struct *p, prs_struct *data,
+static void api_lsa_lookup_sids( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata )
{
LSA_Q_LOOKUP_SIDS q_l;
@@ -561,7 +561,7 @@ static void api_lsa_lookup_sids( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_lookup_names
***************************************************************************/
-static void api_lsa_lookup_names( pipes_struct *p, prs_struct *data,
+static void api_lsa_lookup_names( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata )
{
LSA_Q_LOOKUP_NAMES q_l;
@@ -578,7 +578,7 @@ static void api_lsa_lookup_names( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_close
***************************************************************************/
-static void api_lsa_close( pipes_struct *p, prs_struct *data,
+static void api_lsa_close( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata)
{
LSA_R_CLOSE r_c;
@@ -607,7 +607,7 @@ static void api_lsa_close( pipes_struct *p, prs_struct *data,
/***************************************************************************
api_lsa_open_secret
***************************************************************************/
-static void api_lsa_open_secret( pipes_struct *p, prs_struct *data,
+static void api_lsa_open_secret( rpcsrv_struct *p, prs_struct *data,
prs_struct *rdata)
{
/* XXXX this is NOT good */
@@ -648,7 +648,7 @@ static struct api_struct api_lsa_cmds[] =
/***************************************************************************
api_ntLsarpcTNP
***************************************************************************/
-BOOL api_ntlsa_rpc(pipes_struct *p, prs_struct *data)
+BOOL api_ntlsa_rpc(rpcsrv_struct *p, prs_struct *data)
{
return api_rpcTNP(p, "api_ntlsa_rpc", api_lsa_cmds, data);
}