[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-test-2389-ge0a8818

Günther Deschner gd at samba.org
Mon Feb 18 11:59:53 GMT 2008


The branch, v3-2-test has been updated
       via  e0a8818af0e3e82e9b70ff6c485090986b435fed (commit)
       via  1537a2ff36841fea7bd5d49283667dd02bae84b8 (commit)
       via  b2fa41072ddd2aba000a33eb32ccee408d8304db (commit)
      from  1162b8a02d365b79f5a3e86c936bae80092f1869 (commit)

http://gitweb.samba.org/?samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit e0a8818af0e3e82e9b70ff6c485090986b435fed
Author: Günther Deschner <gd at samba.org>
Date:   Mon Feb 18 12:48:43 2008 +0100

    Remove unused marshalling for SVCCTL_OPEN_SERVICE.
    
    Guenther

commit 1537a2ff36841fea7bd5d49283667dd02bae84b8
Author: Günther Deschner <gd at samba.org>
Date:   Mon Feb 18 12:45:13 2008 +0100

    Use rpccli_svcctl_OpenServiceW() in net.
    
    Guenther

commit b2fa41072ddd2aba000a33eb32ccee408d8304db
Author: Günther Deschner <gd at samba.org>
Date:   Mon Feb 18 12:55:35 2008 +0100

    Use pidl for _svcctl_OpenServiceW().
    
    Note that this call did and still does panic in registry access.
    Michael has an idea how to fix this.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source/include/rpc_svcctl.h       |   13 --------
 source/rpc_client/cli_svcctl.c    |   33 ---------------------
 source/rpc_parse/parse_svcctl.c   |   52 ---------------------------------
 source/rpc_server/srv_svcctl.c    |   18 +-----------
 source/rpc_server/srv_svcctl_nt.c |   32 ++++++++-------------
 source/utils/net_rpc_service.c    |   57 ++++++++++++++++++++++---------------
 6 files changed, 47 insertions(+), 158 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/rpc_svcctl.h b/source/include/rpc_svcctl.h
index 17e2590..14a9dd6 100644
--- a/source/include/rpc_svcctl.h
+++ b/source/include/rpc_svcctl.h
@@ -212,19 +212,6 @@ typedef struct {
 
 typedef struct {
 	POLICY_HND handle;
-	UNISTR2 servicename;
-	uint32 access;
-} SVCCTL_Q_OPEN_SERVICE;
-
-typedef struct {
-	POLICY_HND handle;
-	WERROR status;
-} SVCCTL_R_OPEN_SERVICE;
-
-/**************************/
-
-typedef struct {
-	POLICY_HND handle;
 	uint32 parmcount;
 	UNISTR4_ARRAY *parameters;
 } SVCCTL_Q_START_SERVICE;
diff --git a/source/rpc_client/cli_svcctl.c b/source/rpc_client/cli_svcctl.c
index 699db6c..0a5cf76 100644
--- a/source/rpc_client/cli_svcctl.c
+++ b/source/rpc_client/cli_svcctl.c
@@ -57,39 +57,6 @@ const char* svc_status_string( uint32 state )
 	return talloc_strdup(talloc_tos(), msg);
 }
 
-/********************************************************************
-********************************************************************/
-
-WERROR rpccli_svcctl_open_service( struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, 
-                                POLICY_HND *hSCM, POLICY_HND *hService, 
-				const char *servicename, uint32 access_desired )
-{
-	SVCCTL_Q_OPEN_SERVICE in;
-	SVCCTL_R_OPEN_SERVICE out;
-	prs_struct qbuf, rbuf;
-	
-	ZERO_STRUCT(in);
-	ZERO_STRUCT(out);
-	
-	memcpy( &in.handle, hSCM, sizeof(POLICY_HND) );
-	init_unistr2( &in.servicename, servicename, UNI_STR_TERMINATE );
-	in.access = access_desired;
-	
-	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SVCCTL, SVCCTL_OPEN_SERVICE_W, 
-	            in, out, 
-	            qbuf, rbuf,
-	            svcctl_io_q_open_service,
-	            svcctl_io_r_open_service, 
-	            WERR_GENERAL_FAILURE );
-	
-	if ( !W_ERROR_IS_OK( out.status ) )
-		return out.status;
-
-	memcpy( hService, &out.handle, sizeof(POLICY_HND) );
-	
-	return out.status;
-}
-
 /*******************************************************************
 *******************************************************************/
 
diff --git a/source/rpc_parse/parse_svcctl.c b/source/rpc_parse/parse_svcctl.c
index 488f060..7fd13e8 100644
--- a/source/rpc_parse/parse_svcctl.c
+++ b/source/rpc_parse/parse_svcctl.c
@@ -269,58 +269,6 @@ bool svcctl_io_r_get_display_name(const char *desc, SVCCTL_R_GET_DISPLAY_NAME *r
 /*******************************************************************
 ********************************************************************/
 
-bool svcctl_io_q_open_service(const char *desc, SVCCTL_Q_OPEN_SERVICE *q_u, prs_struct *ps, int depth)
-{
-	if (q_u == NULL)
-		return False;
-
-	prs_debug(ps, depth, desc, "svcctl_io_q_open_service");
-	depth++;
-
-	if(!prs_align(ps))
-		return False;
-
-	if(!smb_io_pol_hnd("scm_pol", &q_u->handle, ps, depth))
-		return False;
-
-	if(!smb_io_unistr2("servicename", &q_u->servicename, 1, ps, depth))
-		return False;
-
-	if(!prs_align(ps))
-		return False;
-
-	if(!prs_uint32("access", ps, depth, &q_u->access))
-		return False;
-	
-	return True;
-}
-
-/*******************************************************************
-********************************************************************/
-
-bool svcctl_io_r_open_service(const char *desc, SVCCTL_R_OPEN_SERVICE *r_u, prs_struct *ps, int depth)
-{
-	if (r_u == NULL)
-		return False;
-
-	prs_debug(ps, depth, desc, "svcctl_io_r_open_service");
-	depth++;
-
-	if(!prs_align(ps))
-		return False;
-
-	if(!smb_io_pol_hnd("service_pol", &r_u->handle, ps, depth))
-		return False;
-
-	if(!prs_werror("status", ps, depth, &r_u->status))
-		return False;
-
-	return True;
-}
-
-/*******************************************************************
-********************************************************************/
-
 bool svcctl_io_q_query_status(const char *desc, SVCCTL_Q_QUERY_STATUS *q_u, prs_struct *ps, int depth)
 {
 	if (q_u == NULL)
diff --git a/source/rpc_server/srv_svcctl.c b/source/rpc_server/srv_svcctl.c
index ba939ac..a134df8 100644
--- a/source/rpc_server/srv_svcctl.c
+++ b/source/rpc_server/srv_svcctl.c
@@ -61,23 +61,7 @@ static bool api_svcctl_open_scmanager(pipes_struct *p)
 
 static bool api_svcctl_open_service(pipes_struct *p)
 {
-	SVCCTL_Q_OPEN_SERVICE q_u;
-	SVCCTL_R_OPEN_SERVICE 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(!svcctl_io_q_open_service("", &q_u, data, 0))
-		return False;
-
-	r_u.status = _svcctl_open_service(p, &q_u, &r_u);
-
-	if(!svcctl_io_r_open_service("", &r_u, rdata, 0))
-		return False;
-
-	return True;
+	return proxy_svcctl_call(p, NDR_SVCCTL_OPENSERVICEW);
 }
 
 /*******************************************************************
diff --git a/source/rpc_server/srv_svcctl_nt.c b/source/rpc_server/srv_svcctl_nt.c
index 459def1..40f3584 100644
--- a/source/rpc_server/srv_svcctl_nt.c
+++ b/source/rpc_server/srv_svcctl_nt.c
@@ -284,28 +284,26 @@ WERROR _svcctl_OpenSCManagerW(pipes_struct *p,
 }
 
 /********************************************************************
+ _svcctl_OpenServiceW
 ********************************************************************/
 
-WERROR _svcctl_open_service(pipes_struct *p, SVCCTL_Q_OPEN_SERVICE *q_u, SVCCTL_R_OPEN_SERVICE *r_u)
+WERROR _svcctl_OpenServiceW(pipes_struct *p,
+			    struct svcctl_OpenServiceW *r)
 {
 	SEC_DESC *sec_desc;
 	uint32 access_granted = 0;
 	NTSTATUS status;
-	char *service = NULL;
-	size_t ret = rpcstr_pull_talloc(p->mem_ctx,
-					&service,
-					q_u->servicename.buffer,
-					q_u->servicename.uni_str_len*2,
-					0);
-
-	if (ret == (size_t)-1 || !service) {
+	const char *service = NULL;
+
+	service = r->in.ServiceName;
+	if (!service) {
 		return WERR_NOMEM;
 	}
-  	DEBUG(5, ("_svcctl_open_service: Attempting to open Service [%s], \n", service));
+	DEBUG(5, ("_svcctl_OpenServiceW: Attempting to open Service [%s], \n", service));
 
 	/* based on my tests you can open a service if you have a valid scm handle */
 
-	if ( !find_service_info_by_hnd( p, &q_u->handle ) )
+	if ( !find_service_info_by_hnd( p, r->in.scmanager_handle) )
 		return WERR_BADFID;
 
 	/* perform access checks.  Use the root token in order to ensure that we
@@ -314,12 +312,12 @@ WERROR _svcctl_open_service(pipes_struct *p, SVCCTL_Q_OPEN_SERVICE *q_u, SVCCTL_
 	if ( !(sec_desc = svcctl_get_secdesc( p->mem_ctx, service, get_root_nt_token() )) )
 		return WERR_NOMEM;
 
-	se_map_generic( &q_u->access, &svc_generic_map );
-	status = svcctl_access_check( sec_desc, p->pipe_user.nt_user_token, q_u->access, &access_granted );
+	se_map_generic( &r->in.access_mask, &svc_generic_map );
+	status = svcctl_access_check( sec_desc, p->pipe_user.nt_user_token, r->in.access_mask, &access_granted );
 	if ( !NT_STATUS_IS_OK(status) )
 		return ntstatus_to_werror( status );
 
-	return create_open_service_handle( p, &r_u->handle, SVC_HANDLE_IS_SERVICE, service, access_granted );
+	return create_open_service_handle( p, r->out.handle, SVC_HANDLE_IS_SERVICE, service, access_granted );
 }
 
 /********************************************************************
@@ -965,12 +963,6 @@ WERROR _svcctl_EnumServicesStatusW(pipes_struct *p, struct svcctl_EnumServicesSt
 	return WERR_NOT_SUPPORTED;
 }
 
-WERROR _svcctl_OpenServiceW(pipes_struct *p, struct svcctl_OpenServiceW *r)
-{
-	p->rng_fault_state = True;
-	return WERR_NOT_SUPPORTED;
-}
-
 WERROR _svcctl_QueryServiceConfigW(pipes_struct *p, struct svcctl_QueryServiceConfigW *r)
 {
 	p->rng_fault_state = True;
diff --git a/source/utils/net_rpc_service.c b/source/utils/net_rpc_service.c
index 789afe2..74848b2 100644
--- a/source/utils/net_rpc_service.c
+++ b/source/utils/net_rpc_service.c
@@ -35,13 +35,17 @@ static WERROR query_service_state(struct rpc_pipe_client *pipe_hnd,
 	POLICY_HND hService;
 	SERVICE_STATUS service_status;
 	WERROR result = WERR_GENERAL_FAILURE;
+	NTSTATUS status;
 
 	/* now cycle until the status is actually 'watch_state' */
 
-	result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, hSCM, &hService,
-		service, SC_RIGHT_SVC_QUERY_STATUS );
-
-	if ( !W_ERROR_IS_OK(result) ) {
+	status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+					    hSCM,
+					    service,
+					    SC_RIGHT_SVC_QUERY_STATUS,
+					    &hService,
+					    &result);
+	if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
 		d_fprintf(stderr, "Failed to open service.  [%s]\n", dos_errstr(result));
 		return result;
 	}
@@ -103,15 +107,20 @@ static WERROR control_service(struct rpc_pipe_client *pipe_hnd,
 {
 	POLICY_HND hService;
 	WERROR result = WERR_GENERAL_FAILURE;
+	NTSTATUS status;
 	SERVICE_STATUS service_status;
 	uint32 state = 0;
 
 	/* Open the Service */
 
-	result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, hSCM, &hService,
-		service, (SC_RIGHT_SVC_STOP|SC_RIGHT_SVC_PAUSE_CONTINUE) );
+	status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+					    hSCM,
+					    service,
+					    (SC_RIGHT_SVC_STOP|SC_RIGHT_SVC_PAUSE_CONTINUE),
+					    &hService,
+					    &result);
 
-	if ( !W_ERROR_IS_OK(result) ) {
+	if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
 		d_fprintf(stderr, "Failed to open service.  [%s]\n", dos_errstr(result));
 		goto done;
 	}
@@ -216,7 +225,6 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
 	POLICY_HND hSCM, hService;
 	WERROR result = WERR_GENERAL_FAILURE;
 	NTSTATUS status;
-	fstring servicename;
 	SERVICE_STATUS service_status;
 	SERVICE_CONFIG config;
 	fstring ascii_string;
@@ -227,8 +235,6 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
 		return NT_STATUS_OK;
 	}
 
-	fstrcpy( servicename, argv[0] );
-
 	/* Open the Service Control Manager */
 	CLI_SERVER_NAME_SLASH(mem_ctx, server_name, pipe_hnd);
 	NT_STATUS_HAVE_NO_MEMORY(server_name);
@@ -246,10 +252,14 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
 
 	/* Open the Service */
 
-	result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, &hSCM, &hService, servicename,
-		(SC_RIGHT_SVC_QUERY_STATUS|SC_RIGHT_SVC_QUERY_CONFIG) );
+	status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+					    &hSCM,
+					    argv[0],
+					    (SC_RIGHT_SVC_QUERY_STATUS|SC_RIGHT_SVC_QUERY_CONFIG),
+					    &hService,
+					    &result);
 
-	if ( !W_ERROR_IS_OK(result) ) {
+	if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
 		d_fprintf(stderr, "Failed to open service.  [%s]\n", dos_errstr(result));
 		goto done;
 	}
@@ -262,7 +272,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid,
 		goto done;
 	}
 
-	d_printf("%s service is %s.\n", servicename, svc_status_string(service_status.state));
+	d_printf("%s service is %s.\n", argv[0], svc_status_string(service_status.state));
 
 	/* get the config */
 
@@ -468,7 +478,6 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
 	POLICY_HND hSCM, hService;
 	WERROR result = WERR_GENERAL_FAILURE;
 	NTSTATUS status;
-	fstring servicename;
 	uint32 state = 0;
 	const char *server_name;
 
@@ -477,8 +486,6 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
 		return NT_STATUS_OK;
 	}
 
-	fstrcpy( servicename, argv[0] );
-
 	/* Open the Service Control Manager */
 	CLI_SERVER_NAME_SLASH(mem_ctx, server_name, pipe_hnd);
 	NT_STATUS_HAVE_NO_MEMORY(server_name);
@@ -496,10 +503,14 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
 
 	/* Open the Service */
 
-	result = rpccli_svcctl_open_service(pipe_hnd, mem_ctx, &hSCM, &hService,
-		servicename, SC_RIGHT_SVC_START );
+	status = rpccli_svcctl_OpenServiceW(pipe_hnd, mem_ctx,
+					    &hSCM,
+					    argv[0],
+					    SC_RIGHT_SVC_START,
+					    &hService,
+					    &result);
 
-	if ( !W_ERROR_IS_OK(result) ) {
+	if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(result) ) {
 		d_fprintf(stderr, "Failed to open service.  [%s]\n", dos_errstr(result));
 		goto done;
 	}
@@ -512,12 +523,12 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid,
 		goto done;
 	}
 
-	result = watch_service_state(pipe_hnd, mem_ctx, &hSCM, servicename, SVCCTL_RUNNING, &state  );
+	result = watch_service_state(pipe_hnd, mem_ctx, &hSCM, argv[0], SVCCTL_RUNNING, &state  );
 
 	if ( W_ERROR_IS_OK(result) && (state == SVCCTL_RUNNING) )
-		d_printf("Successfully started service: %s\n", servicename );
+		d_printf("Successfully started service: %s\n", argv[0] );
 	else
-		d_fprintf(stderr, "Failed to start service: %s [%s]\n", servicename, dos_errstr(result) );
+		d_fprintf(stderr, "Failed to start service: %s [%s]\n", argv[0], dos_errstr(result) );
 
 done:
 	rpccli_svcctl_CloseServiceHandle(pipe_hnd, mem_ctx, &hService, NULL);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list