[SCM] Samba Shared Repository - branch master updated

[email protected] (Jeremy Allison)
Newsgroups gmane.network.samba.cvs
Message-ID <[email protected]>
The branch, master has been updated
       via  b1ade58 s4:torture: Add tortue test for AddPrinterDriverEx with COPY_FROM_DIRECTORY
       via  9c0f257 lib:torture: Make variables const
       via  95b738b s3:spoolss: Add some useful debug messages on error
       via  4d9f4bf s3:spoolss: Add support for COPY_FROM_DIRECTORY in AddPrinterDriverEx
       via  4f702e4 ntlm_auth: Avoid some statics
      from  df9e7c7 lib: Remove global xfile.h includes

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b1ade58ffeb56a0238c820797905caa107b08265
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 15 18:34:22 2016 +0100

    s4:torture: Add tortue test for AddPrinterDriverEx with COPY_FROM_DIRECTORY
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12415
    
    Pair-Programmed-With: Guenther Deschner <[email protected]>
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Sun Nov 20 21:21:32 CET 2016 on sn-devel-144

commit 9c0f2576d8aa3dd95be1c5ddda2b10d891add0bc
Author: Andreas Schneider <[email protected]>
Date:   Fri Nov 18 10:51:57 2016 +0100

    lib:torture: Make variables const
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12415
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 95b738badbf0f2344db13eb1e0d80891240998e4
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 15 14:33:05 2016 +0100

    s3:spoolss: Add some useful debug messages on error
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12415
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 4d9f4bfc69a5899bdf91406dfb7efb70a530446c
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 15 14:29:29 2016 +0100

    s3:spoolss: Add support for COPY_FROM_DIRECTORY in AddPrinterDriverEx
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12415
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 4f702e4b4463319db6d7638901834611a665b884
Author: Volker Lendecke <[email protected]>
Date:   Wed Nov 16 15:22:46 2016 +0000

    ntlm_auth: Avoid some statics
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

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

Summary of changes:
 lib/torture/torture.h                       |   8 +-
 source3/include/nt_printing.h               |   7 +-
 source3/printing/nt_printing.c              |  96 +++++++++++++---
 source3/rpc_server/spoolss/srv_spoolss_nt.c |  24 +++-
 source3/utils/ntlm_auth.c                   |  10 +-
 source4/torture/rpc/spoolss.c               | 167 +++++++++++++++++++++++++++-
 6 files changed, 280 insertions(+), 32 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/torture/torture.h b/lib/torture/torture.h
index 5b957fa..45332b2 100644
--- a/lib/torture/torture.h
+++ b/lib/torture/torture.h
@@ -547,7 +547,7 @@ static inline void torture_dump_data_str_cb(const char *buf, void *private_data)
 	} while(0)
 
 #define torture_assert_guid_equal(torture_ctx,got,expected,cmt)\
-	do { struct GUID __got = (got), __expected = (expected); \
+	do {const struct GUID __got = (got), __expected = (expected); \
 	if (!GUID_equal(&__got, &__expected)) { \
 		torture_result(torture_ctx, TORTURE_FAIL, \
 			__location__": "#got" was %s, expected %s: %s", \
@@ -565,7 +565,7 @@ static inline void torture_dump_data_str_cb(const char *buf, void *private_data)
 	} while(0)
 
 #define torture_assert_sid_equal(torture_ctx,got,expected,cmt)\
-	do { struct dom_sid *__got = (got), *__expected = (expected); \
+	do {const struct dom_sid *__got = (got), *__expected = (expected); \
 	if (!dom_sid_equal(__got, __expected)) { \
 		torture_result(torture_ctx, TORTURE_FAIL, \
 					   __location__": "#got" was %s, expected %s: %s", \
@@ -575,7 +575,7 @@ static inline void torture_dump_data_str_cb(const char *buf, void *private_data)
 	} while(0)
 
 #define torture_assert_not_null(torture_ctx,got,cmt)\
-	do { void *__got = (got); \
+	do {const void *__got = (got); \
 	if (__got == NULL) { \
 		torture_result(torture_ctx, TORTURE_FAIL, \
 			__location__": "#got" was NULL, expected != NULL: %s", \
@@ -585,7 +585,7 @@ static inline void torture_dump_data_str_cb(const char *buf, void *private_data)
 	} while(0)
 
 #define torture_assert_not_null_goto(torture_ctx,got,ret,label,cmt)\
-	do { void *__got = (got); \
+	do {const void *__got = (got); \
 	if (__got == NULL) { \
 		torture_result(torture_ctx, TORTURE_FAIL, \
 			__location__": "#got" was NULL, expected != NULL: %s", \
diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h
index e253658..e0003f9 100644
--- a/source3/include/nt_printing.h
+++ b/source3/include/nt_printing.h
@@ -170,11 +170,14 @@ bool delete_driver_files(const struct auth_session_info *server_info,
 			 const struct spoolss_DriverInfo8 *r);
 
 WERROR move_driver_to_download_area(struct auth_session_info *session_info,
-				    struct spoolss_AddDriverInfoCtr *r);
+				    struct spoolss_AddDriverInfoCtr *r,
+				    const char *driver_directory);
 
 WERROR clean_up_driver_struct(TALLOC_CTX *mem_ctx,
 			      struct auth_session_info *session_info,
-			      struct spoolss_AddDriverInfoCtr *r);
+			      struct spoolss_AddDriverInfoCtr *r,
+			      uint32_t flags,
+			      const char **driver_directory);
 
 void map_printer_permissions(struct security_descriptor *sd);
 
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 334a56e..394a3e5 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -864,7 +864,9 @@ static WERROR clean_up_driver_struct_level(TALLOC_CTX *mem_ctx,
 					   const char **config_file,
 					   const char **help_file,
 					   struct spoolss_StringArray *dependent_files,
-					   enum spoolss_DriverOSVersion *version)
+					   enum spoolss_DriverOSVersion *version,
+					   uint32_t flags,
+					   const char **driver_directory)
 {
 	const char *short_architecture;
 	int i;
@@ -879,6 +881,43 @@ static WERROR clean_up_driver_struct_level(TALLOC_CTX *mem_ctx,
 		return WERR_INVALID_PARAMETER;
 	}
 
+	if (flags & APD_COPY_FROM_DIRECTORY) {
+		char *path;
+		char *q;
+
+		/*
+		 * driver_path is set to:
+		 *
+		 * \\PRINTSRV\print$\x64\{279245b0-a8bd-4431-bf6f-baee92ac15c0}\pscript5.dll
+		 */
+		path = talloc_strdup(mem_ctx, *driver_path);
+		if (path == NULL) {
+			return WERR_NOT_ENOUGH_MEMORY;
+		}
+
+		/* Remove pscript5.dll */
+		q = strrchr_m(path, '\\');
+		if (q == NULL) {
+			return WERR_INVALID_PARAMETER;
+		}
+		*q = '\0';
+
+		/* Get \{279245b0-a8bd-4431-bf6f-baee92ac15c0} */
+		q = strrchr_m(path, '\\');
+		if (q == NULL) {
+			return WERR_INVALID_PARAMETER;
+		}
+
+		/*
+		 * Set driver_directory to:
+		 *
+		 * {279245b0-a8bd-4431-bf6f-baee92ac15c0}
+		 *
+		 * This is the directory where all the files have been uploaded
+		 */
+		*driver_directory = q + 1;
+	}
+
 	/* clean up the driver name.
 	 * we can get .\driver.dll
 	 * or worse c:\windows\system\driver.dll !
@@ -931,7 +970,9 @@ static WERROR clean_up_driver_struct_level(TALLOC_CTX *mem_ctx,
 
 WERROR clean_up_driver_struct(TALLOC_CTX *mem_ctx,
 			      struct auth_session_info *session_info,
-			      struct spoolss_AddDriverInfoCtr *r)
+			      struct spoolss_AddDriverInfoCtr *r,
+			      uint32_t flags,
+			      const char **driver_directory)
 {
 	switch (r->level) {
 	case 3:
@@ -942,7 +983,9 @@ WERROR clean_up_driver_struct(TALLOC_CTX *mem_ctx,
 						    &r->info.info3->config_file,
 						    &r->info.info3->help_file,
 						    r->info.info3->dependent_files,
-						    &r->info.info3->version);
+						    &r->info.info3->version,
+						    flags,
+						    driver_directory);
 	case 6:
 		return clean_up_driver_struct_level(mem_ctx, session_info,
 						    r->info.info6->architecture,
@@ -951,7 +994,9 @@ WERROR clean_up_driver_struct(TALLOC_CTX *mem_ctx,
 						    &r->info.info6->config_file,
 						    &r->info.info6->help_file,
 						    r->info.info6->dependent_files,
-						    &r->info.info6->version);
+						    &r->info.info6->version,
+						    flags,
+						    driver_directory);
 	case 8:
 		return clean_up_driver_struct_level(mem_ctx, session_info,
 						    r->info.info8->architecture,
@@ -960,7 +1005,9 @@ WERROR clean_up_driver_struct(TALLOC_CTX *mem_ctx,
 						    &r->info.info8->config_file,
 						    &r->info.info8->help_file,
 						    r->info.info8->dependent_files,
-						    &r->info.info8->version);
+						    &r->info.info8->version,
+						    flags,
+						    driver_directory);
 	default:
 		return WERR_NOT_SUPPORTED;
 	}
@@ -1012,7 +1059,8 @@ static WERROR move_driver_file_to_download_area(TALLOC_CTX *mem_ctx,
 						const char *driver_file,
 						const char *short_architecture,
 						uint32_t driver_version,
-						uint32_t version)
+						uint32_t version,
+						const char *driver_directory)
 {
 	struct smb_filename *smb_fname_old = NULL;
 	struct smb_filename *smb_fname_new = NULL;
@@ -1021,9 +1069,21 @@ static WERROR move_driver_file_to_download_area(TALLOC_CTX *mem_ctx,
 	NTSTATUS status;
 	WERROR ret;
 
-	old_name = talloc_asprintf(mem_ctx, "%s/%s",
-				   short_architecture, driver_file);
-	W_ERROR_HAVE_NO_MEMORY(old_name);
+	if (driver_directory != NULL) {
+		old_name = talloc_asprintf(mem_ctx,
+					   "%s/%s/%s",
+					   short_architecture,
+					   driver_directory,
+					   driver_file);
+	} else {
+		old_name = talloc_asprintf(mem_ctx,
+					   "%s/%s",
+					   short_architecture,
+					   driver_file);
+	}
+	if (old_name == NULL) {
+		return WERR_NOT_ENOUGH_MEMORY;
+	}
 
 	new_name = talloc_asprintf(mem_ctx, "%s/%d/%s",
 				   short_architecture, driver_version, driver_file);
@@ -1076,7 +1136,8 @@ static WERROR move_driver_file_to_download_area(TALLOC_CTX *mem_ctx,
 }
 
 WERROR move_driver_to_download_area(struct auth_session_info *session_info,
-				    struct spoolss_AddDriverInfoCtr *r)
+				    struct spoolss_AddDriverInfoCtr *r,
+				    const char *driver_directory)
 {
 	struct spoolss_AddDriverInfo3 *driver;
 	struct spoolss_AddDriverInfo3 converted_driver;
@@ -1201,7 +1262,8 @@ WERROR move_driver_to_download_area(struct auth_session_info *session_info,
 							driver->driver_path,
 							short_architecture,
 							driver->version,
-							ver);
+							ver,
+							driver_directory);
 		if (!W_ERROR_IS_OK(err)) {
 			goto err_exit;
 		}
@@ -1215,7 +1277,8 @@ WERROR move_driver_to_download_area(struct auth_session_info *session_info,
 								driver->data_file,
 								short_architecture,
 								driver->version,
-								ver);
+								ver,
+								driver_directory);
 			if (!W_ERROR_IS_OK(err)) {
 				goto err_exit;
 			}
@@ -1231,7 +1294,8 @@ WERROR move_driver_to_download_area(struct auth_session_info *session_info,
 								driver->config_file,
 								short_architecture,
 								driver->version,
-								ver);
+								ver,
+								driver_directory);
 			if (!W_ERROR_IS_OK(err)) {
 				goto err_exit;
 			}
@@ -1248,7 +1312,8 @@ WERROR move_driver_to_download_area(struct auth_session_info *session_info,
 								driver->help_file,
 								short_architecture,
 								driver->version,
-								ver);
+								ver,
+								driver_directory);
 			if (!W_ERROR_IS_OK(err)) {
 				goto err_exit;
 			}
@@ -1273,7 +1338,8 @@ WERROR move_driver_to_download_area(struct auth_session_info *session_info,
 									driver->dependent_files->string[i],
 									short_architecture,
 									driver->version,
-									ver);
+									ver,
+									driver_directory);
 				if (!W_ERROR_IS_OK(err)) {
 					goto err_exit;
 				}
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index 2b28332..45061b6 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -8567,7 +8567,9 @@ WERROR _spoolss_AddPrinterDriverEx(struct pipes_struct *p,
 {
 	WERROR err = WERR_OK;
 	const char *driver_name = NULL;
+	const char *driver_directory = NULL;
 	uint32_t version;
+
 	/*
 	 * we only support the semantics of AddPrinterDriver()
 	 * i.e. only copy files that are newer than existing ones
@@ -8577,7 +8579,8 @@ WERROR _spoolss_AddPrinterDriverEx(struct pipes_struct *p,
 		return WERR_INVALID_PARAMETER;
 	}
 
-	if (r->in.flags != APD_COPY_NEW_FILES) {
+	if (!(r->in.flags & APD_COPY_ALL_FILES) &&
+	    !(r->in.flags & APD_COPY_NEW_FILES)) {
 		return WERR_ACCESS_DENIED;
 	}
 
@@ -8591,13 +8594,24 @@ WERROR _spoolss_AddPrinterDriverEx(struct pipes_struct *p,
 	}
 
 	DEBUG(5,("Cleaning driver's information\n"));
-	err = clean_up_driver_struct(p->mem_ctx, p->session_info, r->in.info_ctr);
-	if (!W_ERROR_IS_OK(err))
+	err = clean_up_driver_struct(p->mem_ctx,
+				     p->session_info,
+				     r->in.info_ctr,
+				     r->in.flags,
+				     &driver_directory);
+	if (!W_ERROR_IS_OK(err)) {
+		DBG_ERR("clean_up_driver_struct failed - %s\n",
+			win_errstr(err));
 		goto done;
+	}
 
 	DEBUG(5,("Moving driver to final destination\n"));
-	err = move_driver_to_download_area(p->session_info, r->in.info_ctr);
+	err = move_driver_to_download_area(p->session_info,
+					   r->in.info_ctr,
+					   driver_directory);
 	if (!W_ERROR_IS_OK(err)) {
+		DBG_ERR("move_driver_to_download_area failed - %s\n",
+			win_errstr(err));
 		goto done;
 	}
 
@@ -8608,6 +8622,8 @@ WERROR _spoolss_AddPrinterDriverEx(struct pipes_struct *p,
 				&driver_name,
 				&version);
 	if (!W_ERROR_IS_OK(err)) {
+		DBG_ERR("winreg_add_driver_internal failed - %s\n",
+			win_errstr(err));
 		goto done;
 	}
 
diff --git a/source3/utils/ntlm_auth.c b/source3/utils/ntlm_auth.c
index 4f67b90..9888dbc 100644
--- a/source3/utils/ntlm_auth.c
+++ b/source3/utils/ntlm_auth.c
@@ -2255,12 +2255,12 @@ enum {
 {
 	TALLOC_CTX *frame = talloc_stackframe();
 	int opt;
-	static const char *helper_protocol;
-	static int diagnostics;
+	const char *helper_protocol = NULL;
+	int diagnostics = 0;
 
-	static const char *hex_challenge;
-	static const char *hex_lm_response;
-	static const char *hex_nt_response;
+	const char *hex_challenge = NULL;
+	const char *hex_lm_response = NULL;
+	const char *hex_nt_response = NULL;
 	struct loadparm_context *lp_ctx;
 	poptContext pc;
 
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 178feb7..751a3b2 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -53,6 +53,7 @@
 #define TORTURE_DRIVER_ADOBE_CUPSADDSMB	"torture_driver_adobe_cupsaddsmb"
 #define TORTURE_DRIVER_TIMESTAMPS	"torture_driver_timestamps"
 #define TORTURE_DRIVER_DELETER		"torture_driver_deleter"
+#define TORTURE_DRIVER_COPY_DIR		"torture_driver_copy_from_directory"
 #define TORTURE_DRIVER_DELETERIN	"torture_driver_deleterin"
 #define TORTURE_PRINTER_STATIC1		"print1"
 
@@ -100,6 +101,7 @@ struct torture_driver_context {
 	} local;
 	struct {
 		const char *driver_directory;
+		const char *driver_upload_directory;
 		const char *environment;
 	} remote;
 	struct spoolss_AddDriverInfo8 info8;
@@ -10380,6 +10382,38 @@ static const char *driver_directory_share(struct torture_context *tctx,
 	return tok;
 }
 
+#define CREATE_PRINTER_DRIVER_PATH(_d, _file) \
+	talloc_asprintf((_d), "%s\\%s\\%s", (_d)->remote.driver_directory, (_d)->remote.driver_upload_directory, (_file))
+
+
+static bool create_printer_driver_directory(struct torture_context *tctx,
+					    struct smbcli_state *cli,
+					    struct torture_driver_context *d)
+{
+	char *driver_dir;
+
+	if (d->remote.driver_upload_directory == NULL) {
+		return true;
+	}
+
+	driver_dir = talloc_asprintf(tctx,
+				     "%s\\%s",
+				     driver_directory_dir(d->remote.driver_directory),
+				     d->remote.driver_upload_directory);
+	torture_assert_not_null(tctx, driver_dir, "ENOMEM");
+
+	torture_comment(tctx,
+			"Create remote driver directory: %s\n",
+			driver_dir);
+
+	torture_assert_ntstatus_ok(tctx,
+				   smbcli_mkdir(cli->tree,
+				                driver_dir),
+				   "Failed to create driver directory");
+
+	return true;
+}
+
 static bool upload_printer_driver_file(struct torture_context *tctx,
 				       struct smbcli_state *cli,
 				       struct torture_driver_context *d,
@@ -10392,13 +10426,34 @@ static bool upload_printer_driver_file(struct torture_context *tctx,
 	off_t nread = 0;
 	size_t start = 0;
 	const char *remote_dir = driver_directory_dir(d->remote.driver_directory);
-	const char *local_name = talloc_asprintf(tctx, "%s/%s", d->local.driver_directory, file_name);
-	const char *remote_name = talloc_asprintf(tctx, "%s\\%s", remote_dir, file_name);
+	const char *remote_name;
+	const char *local_name;
+	const char *p;
 
 	if (!file_name || strlen(file_name) == 0) {
 		return true;
 	}
 
+	p = strrchr(file_name, '\\');
+	if (p == NULL) {
+		p = file_name;
+	} else {
+		p++;
+	}
+
+	local_name = talloc_asprintf(tctx, "%s/%s", d->local.driver_directory, p);
+	torture_assert_not_null(tctx, local_name, "ENOMEM");
+	if (d->remote.driver_upload_directory != NULL) {
+		remote_name = talloc_asprintf(tctx,
+					      "%s\\%s\\%s",
+					      remote_dir,
+					      d->remote.driver_upload_directory,
+					      p);
+	} else {
+		remote_name = talloc_asprintf(tctx, "%s\\%s", remote_dir, p);
+	}
+	torture_assert_not_null(tctx, remote_name, "ENOMEM");
+
 	torture_comment(tctx, "Uploading %s to %s\n", local_name, remote_name);
 
 	fnum = smbcli_open(cli->tree, remote_name, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE);
@@ -10496,6 +10551,10 @@ static bool upload_printer_driver(struct torture_context *tctx,
 		server_name, share_name);
 
 	torture_assert(tctx,
+		       create_printer_driver_directory(tctx, cli, d),
+		       "failed to create driver directory");
+
+	torture_assert(tctx,
 		upload_printer_driver_file(tctx, cli, d, d->info8.driver_path),
 		"failed to upload driver_path");
 	torture_assert(tctx,
@@ -11048,6 +11107,106 @@ static bool test_multiple_drivers(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_driver_copy_from_directory(struct torture_context *tctx,
+					    struct dcerpc_pipe *p)
+{
+	struct torture_driver_context *d;
+	struct spoolss_StringArray *a;
+	uint32_t add_flags = APD_COPY_NEW_FILES|APD_COPY_FROM_DIRECTORY|APD_RETURN_BLOCKING_STATUS_CODE;
+	uint32_t delete_flags = DPD_DELETE_ALL_FILES;
+	struct dcerpc_binding_handle *b = p->binding_handle;
+	const char *server_name_slash = talloc_asprintf(tctx,
+							"\\\\%s",
+							dcerpc_server_name(p));
+	struct GUID guid = GUID_random();
+	bool ok = false;
+
+	d = talloc_zero(tctx, struct torture_driver_context);
+	torture_assert_not_null(tctx, d, "ENOMEM");
+
+	d->local.environment		=
+		talloc_asprintf(d, SPOOLSS_ARCHITECTURE_x64);
+	torture_assert_not_null_goto(tctx, d->local.environment, ok, done, "ENOMEM");
+
+	d->local.driver_directory	=
+		talloc_asprintf(d, "/usr/share/cups/drivers/x64");
+	torture_assert_not_null_goto(tctx, d->local.driver_directory, ok, done, "ENOMEM");
+
+	d->remote.driver_upload_directory = GUID_string2(d, &guid);
+	torture_assert_not_null_goto(tctx, d->remote.driver_upload_directory, ok, done, "ENOMEM");
+
+	torture_assert(tctx,
+		       fillup_printserver_info(tctx, p, d),
+		       "failed to fillup printserver info");
+
+	d->ex				= true;
+	d->info8.version		= SPOOLSS_DRIVER_VERSION_200X;
+	d->info8.driver_name		= TORTURE_DRIVER_COPY_DIR;
+	d->info8.architecture		= d->local.environment;
+
+	d->info8.driver_path		= CREATE_PRINTER_DRIVER_PATH(d, "pscript5.dll");
+	torture_assert_not_null_goto(tctx, d->info8.driver_path, ok, done, "ENOMEM");
+	d->info8.data_file		= CREATE_PRINTER_DRIVER_PATH(d, "cups6.ppd");
+	torture_assert_not_null_goto(tctx, d->info8.data_file, ok, done, "ENOMEM");
+	d->info8.config_file		= CREATE_PRINTER_DRIVER_PATH(d, "cupsui6.dll");
+	torture_assert_not_null_goto(tctx, d->info8.config_file, ok, done, "ENOMEM");
+	d->info8.help_file		= CREATE_PRINTER_DRIVER_PATH(d, "pscript.hlp");
+	torture_assert_not_null_goto(tctx, d->info8.help_file, ok, done, "ENOMEM");
+
+	a				= talloc_zero(d, struct spoolss_StringArray);


-- 
Samba Shared Repository
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.