From ebda529b59105e9b70cc74377fe4d54cc16b4f37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=BCnther=20Deschner?= Date: Wed, 4 Mar 2020 15:23:43 +0100 Subject: [PATCH] librpc: fix IDL for svcctl_ChangeServiceConfigW Found while trying to run winexe against Windows Server 2019. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14313 Guenther Signed-off-by: Guenther Deschner Reviewed-by: Andreas Schneider --- examples/winexe/winexe.c | 2 ++ librpc/idl/svcctl.idl | 23 ++++++++++++++++++----- selftest/knownfail | 5 ----- source4/torture/ndr/svcctl.c | 3 +++ source4/torture/rpc/svcctl.c | 3 +++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/examples/winexe/winexe.c b/examples/winexe/winexe.c index 22f748b1d45..fc6b15f8e52 100644 --- a/examples/winexe/winexe.c +++ b/examples/winexe/winexe.c @@ -625,8 +625,10 @@ static NTSTATUS winexe_svc_install( NULL, /* load_order_group */ NULL, /* tag_id */ NULL, /* dependencies */ + 0, /* dwDependSize */ NULL, /* service_start_name */ NULL, /* password */ + 0, /* dwPwSize */ NULL, /* display_name */ &werr); diff --git a/librpc/idl/svcctl.idl b/librpc/idl/svcctl.idl index e909bf2dbed..a9dd3dec990 100644 --- a/librpc/idl/svcctl.idl +++ b/librpc/idl/svcctl.idl @@ -13,6 +13,17 @@ import "misc.idl", "security.idl"; helpstring("Service Control") ] interface svcctl { + const int MAX_SERVICE_NAME_LENGTH = 256; + const short SC_MAX_DEPEND_SIZE = 4 * 1024; + const short SC_MAX_NAME_LENGTH = MAX_SERVICE_NAME_LENGTH + 1; + const short SC_MAX_PATH_LENGTH = 32 * 1024; + const short SC_MAX_PWD_SIZE = 514; + const short SC_MAX_COMPUTER_NAME_LENGTH = 1024; + const short SC_MAX_ACCOUNT_NAME_LENGTH = 2 * 1024; + const short SC_MAX_COMMENT_LENGTH = 128; + const short SC_MAX_ARGUMENT_LENGTH = 1024; + const short SC_MAX_ARGUMENTS = 1024; + typedef struct { uint32 is_locked; [string,charset(UTF16)] uint16 *lock_owner; @@ -195,11 +206,13 @@ import "misc.idl", "security.idl"; [in] svcctl_ErrorControl error_control, [in,unique] [string,charset(UTF16)] uint16 *binary_path, [in,unique] [string,charset(UTF16)] uint16 *load_order_group, - [out,ref] uint32 *tag_id, - [in,unique] [string,charset(UTF16)] uint16 *dependencies, - [in,unique] [string,charset(UTF16)] uint16 *service_start_name, - [in,unique] [string,charset(UTF16)] uint16 *password, - [in,unique] [string,charset(UTF16)] uint16 *display_name + [in,out,unique] uint32 *tag_id, + [in,unique,size_is(dwDependSize)] [string,charset(UTF16)] uint16 *dependencies, + [in,range(0, SC_MAX_DEPEND_SIZE)] uint32 dwDependSize, + [in,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] [string,charset(UTF16)] uint16 *service_start_name, + [in,unique,size_is(dwPwSize)] [string,charset(UTF16)] uint16 *password, + [in,range(0, SC_MAX_PWD_SIZE)] uint32 dwPwSize, + [in,unique,range(0, SC_MAX_NAME_LENGTH)] [string,charset(UTF16)] uint16 *display_name ); /*****************/ diff --git a/selftest/knownfail b/selftest/knownfail index b9c4b8de547..d4381b39a84 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -238,11 +238,6 @@ # not implemented ^samba3.rpc.svcctl.svcctl.ChangeServiceConfigW\(ad_dc\) ^samba3.rpc.svcctl.svcctl.ChangeServiceConfigW\(nt4_dc\) -# broken IDL -^samba4.local.ndr.svcctl_ChangeServiceConfigW_NDR_IN -^samba4.local.ndr.svcctl_ChangeServiceConfigW_NDR_OUT -^samba4.local.ndr.system.iconv.svcctl_ChangeServiceConfigW_NDR_IN -^samba4.local.ndr.system.iconv.svcctl_ChangeServiceConfigW_NDR_OUT # # This makes less sense when not running against an AD DC # diff --git a/source4/torture/ndr/svcctl.c b/source4/torture/ndr/svcctl.c index 1c9404597cd..6592beda02e 100644 --- a/source4/torture/ndr/svcctl.c +++ b/source4/torture/ndr/svcctl.c @@ -45,9 +45,12 @@ static bool svcctl_ChangeServiceConfigW_req_check(struct torture_context *tctx, torture_assert_u32_equal(tctx, r->in.error_control, SVCCTL_SVC_ERROR_NORMAL, "error_control"); torture_assert_str_equal(tctx, r->in.binary_path, NULL, "binary_path"); torture_assert_str_equal(tctx, r->in.load_order_group, NULL, "load_order_group"); + torture_assert(tctx, r->in.tag_id == NULL, "tag_id"); torture_assert_str_equal(tctx, r->in.dependencies, NULL, "dependencies"); + torture_assert_u32_equal(tctx, r->in.dwDependSize, 0, "dwDependSize"); torture_assert_str_equal(tctx, r->in.service_start_name, NULL, "service_start_name"); torture_assert_str_equal(tctx, r->in.password, NULL, "password"); + torture_assert_u32_equal(tctx, r->in.dwPwSize, 0, "dwPwSize"); torture_assert_str_equal(tctx, r->in.display_name, NULL, "display_name"); return true; diff --git a/source4/torture/rpc/svcctl.c b/source4/torture/rpc/svcctl.c index bd16ed4627d..746b399360e 100644 --- a/source4/torture/rpc/svcctl.c +++ b/source4/torture/rpc/svcctl.c @@ -675,9 +675,12 @@ static bool test_ChangeServiceConfigW(struct torture_context *tctx, r.in.binary_path = NULL; r.in.load_order_group = NULL; r.in.dependencies = NULL; + r.in.dwDependSize = 0; r.in.service_start_name = NULL; r.in.password = NULL; + r.in.dwPwSize = 0; r.in.display_name = NULL; + r.in.tag_id = NULL; r.out.tag_id = NULL; status = dcerpc_svcctl_ChangeServiceConfigW_r(b, tctx, &r); -- 2.25.1