svn commit: samba r16657 - in branches/SAMBA_4_0/source/torture: . basic raw

vlendec at samba.org vlendec at samba.org
Wed Jun 28 22:09:04 GMT 2006


Author: vlendec
Date: 2006-06-28 22:09:03 +0000 (Wed, 28 Jun 2006)
New Revision: 16657

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16657

Log:
Test Jerry's iTunes bug, along with some more error conditions

Volker

Added:
   branches/SAMBA_4_0/source/torture/raw/samba3misc.c
Modified:
   branches/SAMBA_4_0/source/torture/basic/base.c
   branches/SAMBA_4_0/source/torture/config.mk
   branches/SAMBA_4_0/source/torture/raw/raw.c
   branches/SAMBA_4_0/source/torture/raw/samba3hide.c
   branches/SAMBA_4_0/source/torture/util.c


Changeset:
Modified: branches/SAMBA_4_0/source/torture/basic/base.c
===================================================================
--- branches/SAMBA_4_0/source/torture/basic/base.c	2006-06-28 21:56:03 UTC (rev 16656)
+++ branches/SAMBA_4_0/source/torture/basic/base.c	2006-06-28 22:09:03 UTC (rev 16657)
@@ -1621,7 +1621,7 @@
 	const char *os2_fname = ".+,;=[].";
 	const char *dname = "samba3_errordir";
 	union smb_open io;
-	TALLOC_CTX *mem_ctx = talloc_init(NULL);
+	TALLOC_CTX *mem_ctx = talloc_init("samba3_errorpaths");
 	NTSTATUS status;
 
 	if (mem_ctx == NULL) {
@@ -1707,6 +1707,23 @@
 		goto fail;
 	}
 
+	io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
+	status = smb_raw_open(cli_nt->tree, mem_ctx, &io);
+	if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+		printf("(%s) incorrect status %s should be %s\n",
+		       __location__, nt_errstr(status),
+		       nt_errstr(NT_STATUS_OBJECT_NAME_COLLISION));
+		goto fail;
+	}
+
+	status = smb_raw_open(cli_dos->tree, mem_ctx, &io);
+	if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS, ERRfilexists))) {
+		printf("(%s) incorrect status %s should be %s\n",
+		       __location__, nt_errstr(status),
+		       nt_errstr(NT_STATUS_DOS(ERRDOS, ERRfilexists)));
+		goto fail;
+	}
+
 	{
 		/* Test an invalid DOS deny mode */
 		const char *fname = "test.txt";

Modified: branches/SAMBA_4_0/source/torture/config.mk
===================================================================
--- branches/SAMBA_4_0/source/torture/config.mk	2006-06-28 21:56:03 UTC (rev 16656)
+++ branches/SAMBA_4_0/source/torture/config.mk	2006-06-28 22:09:03 UTC (rev 16657)
@@ -83,6 +83,7 @@
 		raw/acls.o \
 		raw/seek.o \
 		raw/samba3hide.o \
+		raw/samba3misc.o \
 		raw/composite.o \
 		raw/raw.o
 PUBLIC_DEPENDENCIES = \

Modified: branches/SAMBA_4_0/source/torture/raw/raw.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/raw.c	2006-06-28 21:56:03 UTC (rev 16656)
+++ branches/SAMBA_4_0/source/torture/raw/raw.c	2006-06-28 22:09:03 UTC (rev 16657)
@@ -53,6 +53,7 @@
 	register_torture_op("RAW-ACLS", torture_raw_acls);
 	register_torture_op("RAW-COMPOSITE", torture_raw_composite);
 	register_torture_op("RAW-SAMBA3HIDE", torture_samba3_hide);
+	register_torture_op("RAW-SAMBA3CHECKFSP", torture_samba3_checkfsp);
 	register_torture_op("SCAN-EAMAX", torture_max_eas);
 
 	return NT_STATUS_OK;

Modified: branches/SAMBA_4_0/source/torture/raw/samba3hide.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/samba3hide.c	2006-06-28 21:56:03 UTC (rev 16656)
+++ branches/SAMBA_4_0/source/torture/raw/samba3hide.c	2006-06-28 22:09:03 UTC (rev 16657)
@@ -126,46 +126,6 @@
 	return smb_raw_setpathinfo(tree, &sfinfo);
 }
 
-static NTSTATUS second_tcon(TALLOC_CTX *mem_ctx,
-			    struct smbcli_session *session,
-			    const char *sharename,
-			    struct smbcli_tree **res)
-{
-	union smb_tcon tcon;
-	struct smbcli_tree *result;
-	TALLOC_CTX *tmp_ctx;
-	NTSTATUS status;
-
-	if ((tmp_ctx = talloc_new(mem_ctx)) == NULL) {
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	result = smbcli_tree_init(session, tmp_ctx, False);
-	if (result == NULL) {
-		talloc_free(tmp_ctx);
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	tcon.generic.level = RAW_TCON_TCONX;
-	tcon.tconx.in.flags = 0;
-
-	/* Ignore share mode security here */
-	tcon.tconx.in.password = data_blob(NULL, 0);
-	tcon.tconx.in.path = sharename;
-	tcon.tconx.in.device = "????";
-
-	status = smb_raw_tcon(result, tmp_ctx, &tcon);
-	if (!NT_STATUS_IS_OK(status)) {
-		talloc_free(tmp_ctx);
-		return status;
-	}
-
-	result->tid = tcon.tconx.out.tid;
-	*res = talloc_steal(mem_ctx, result);
-	talloc_free(tmp_ctx);
-	return NT_STATUS_OK;
-}
-
 BOOL torture_samba3_hide(struct torture_context *torture)
 {
 	struct smbcli_state *cli;
@@ -182,16 +142,16 @@
 		return False;
 	}
 
-	status = second_tcon(torture, cli->session, "hideunread",
-			     &hideunread);
+	status = torture_second_tcon(torture, cli->session, "hideunread",
+				     &hideunread);
 	if (!NT_STATUS_IS_OK(status)) {
 		d_printf("second_tcon(hideunread) failed: %s\n",
 			 nt_errstr(status));
 		return False;
 	}
 
-	status = second_tcon(torture, cli->session, "hideunwrite",
-			     &hideunwrite);
+	status = torture_second_tcon(torture, cli->session, "hideunwrite",
+				     &hideunwrite);
 	if (!NT_STATUS_IS_OK(status)) {
 		d_printf("second_tcon(hideunwrite) failed: %s\n",
 			 nt_errstr(status));
@@ -305,4 +265,3 @@
 
 	return True;
 }
-

Added: branches/SAMBA_4_0/source/torture/raw/samba3misc.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/samba3misc.c	2006-06-28 21:56:03 UTC (rev 16656)
+++ branches/SAMBA_4_0/source/torture/raw/samba3misc.c	2006-06-28 22:09:03 UTC (rev 16657)
@@ -0,0 +1,157 @@
+/* 
+   Unix SMB/CIFS implementation.
+   Test some misc Samba3 code paths
+   Copyright (C) Volker Lendecke 2006
+   
+   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"
+#include "torture/torture.h"
+#include "libcli/raw/libcliraw.h"
+#include "system/time.h"
+#include "system/filesys.h"
+#include "libcli/libcli.h"
+#include "torture/util.h"
+
+#define CHECK_STATUS(status, correct) do { \
+	if (!NT_STATUS_EQUAL(status, correct)) { \
+		printf("(%s) Incorrect status %s - should be %s\n", \
+		       __location__, nt_errstr(status), nt_errstr(correct)); \
+		ret = False; \
+	} \
+} while (0)
+
+BOOL torture_samba3_checkfsp(struct torture_context *torture)
+{
+	struct smbcli_state *cli;
+	const char *fname = "test.txt";
+	const char *dirname = "testdir";
+	int fnum;
+	NTSTATUS status;
+	BOOL ret = True;
+	TALLOC_CTX *mem_ctx;
+	ssize_t nread;
+	char buf[16];
+	struct smbcli_tree *tree2;
+
+	if ((mem_ctx = talloc_init("torture_samba3_checkfsp")) == NULL) {
+		d_printf("talloc_init failed\n");
+		return False;
+	}
+
+	if (!torture_open_connection_share(
+		    torture, &cli, lp_parm_string(-1, "torture", "host"),
+		    lp_parm_string(-1, "torture", "share"), NULL)) {
+		d_printf("torture_open_connection_share failed\n");
+		ret = False;
+		goto done;
+	}
+
+	smbcli_deltree(cli->tree, dirname);
+
+	status = torture_second_tcon(torture, cli->session,
+				     lp_parm_string(-1, "torture", "share"),
+				     &tree2);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	if (!NT_STATUS_IS_OK(status))
+		goto done;
+
+	/* Try a read on an invalid FID */
+
+	nread = smbcli_read(cli->tree, 4711, buf, 0, sizeof(buf));
+	CHECK_STATUS(smbcli_nt_error(cli->tree), NT_STATUS_INVALID_HANDLE);
+
+	/* Try a read on a directory handle */
+
+	status = smbcli_mkdir(cli->tree, dirname);
+	if (!NT_STATUS_IS_OK(status)) {
+		d_printf("smbcli_mkdir failed: %s\n", nt_errstr(status));
+		ret = False;
+		goto done;
+	}
+
+	/* Open the directory */
+	{
+		union smb_open io;
+		io.generic.level = RAW_OPEN_NTCREATEX;
+		io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
+		io.ntcreatex.in.root_fid = 0;
+		io.ntcreatex.in.security_flags = 0;
+		io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
+		io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
+		io.ntcreatex.in.alloc_size = 0;
+		io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;
+		io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
+		io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
+		io.ntcreatex.in.create_options = 0;
+		io.ntcreatex.in.fname = dirname;
+		status = smb_raw_open(cli->tree, mem_ctx, &io);
+		if (!NT_STATUS_IS_OK(status)) {
+			d_printf("smb_open on the directory failed: %s\n",
+				 nt_errstr(status));
+			ret = False;
+			goto done;
+		}
+		fnum = io.ntcreatex.out.file.fnum;
+	}
+
+	/* Try a read on the directory */
+
+	nread = smbcli_read(cli->tree, fnum, buf, 0, sizeof(buf));
+	if (nread >= 0) {
+		d_printf("smbcli_read on a directory succeeded, expected "
+			 "failure\n");
+		ret = False;
+	}
+
+	CHECK_STATUS(smbcli_nt_error(cli->tree),
+		     NT_STATUS_INVALID_DEVICE_REQUEST);
+
+	/* Same test on the second tcon */
+
+	nread = smbcli_read(tree2, fnum, buf, 0, sizeof(buf));
+	if (nread >= 0) {
+		d_printf("smbcli_read on a directory succeeded, expected "
+			 "failure\n");
+		ret = False;
+	}
+
+	CHECK_STATUS(smbcli_nt_error(tree2), NT_STATUS_INVALID_HANDLE);
+
+	smbcli_close(cli->tree, fnum);
+
+	/* Try a normal file read on a second tcon */
+
+	fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
+	if (fnum == -1) {
+		d_printf("Failed to create %s - %s\n", fname,
+			 smbcli_errstr(cli->tree));
+		ret = False;
+		goto done;
+	}
+
+	nread = smbcli_read(tree2, fnum, buf, 0, sizeof(buf));
+	CHECK_STATUS(smbcli_nt_error(tree2), NT_STATUS_INVALID_HANDLE);
+
+	smbcli_close(cli->tree, fnum);
+
+ done:
+	smbcli_deltree(cli->tree, dirname);
+	torture_close_connection(cli);
+	talloc_free(mem_ctx);
+
+	return ret;
+}

Modified: branches/SAMBA_4_0/source/torture/util.c
===================================================================
--- branches/SAMBA_4_0/source/torture/util.c	2006-06-28 21:56:03 UTC (rev 16656)
+++ branches/SAMBA_4_0/source/torture/util.c	2006-06-28 22:09:03 UTC (rev 16657)
@@ -22,6 +22,8 @@
 #include "system/filesys.h"
 #include "system/wait.h"
 #include "torture/torture.h"
+#include "libcli/raw/interfaces.h"
+#include "libcli/raw/libcliraw.h"
 
 /**
  create a temporary directory.
@@ -115,3 +117,43 @@
 
 	return NT_STATUS_OK;
 }
+
+NTSTATUS torture_second_tcon(TALLOC_CTX *mem_ctx,
+			     struct smbcli_session *session,
+			     const char *sharename,
+			     struct smbcli_tree **res)
+{
+	union smb_tcon tcon;
+	struct smbcli_tree *result;
+	TALLOC_CTX *tmp_ctx;
+	NTSTATUS status;
+
+	if ((tmp_ctx = talloc_new(mem_ctx)) == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	result = smbcli_tree_init(session, tmp_ctx, False);
+	if (result == NULL) {
+		talloc_free(tmp_ctx);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	tcon.generic.level = RAW_TCON_TCONX;
+	tcon.tconx.in.flags = 0;
+
+	/* Ignore share mode security here */
+	tcon.tconx.in.password = data_blob(NULL, 0);
+	tcon.tconx.in.path = sharename;
+	tcon.tconx.in.device = "?????";
+
+	status = smb_raw_tcon(result, tmp_ctx, &tcon);
+	if (!NT_STATUS_IS_OK(status)) {
+		talloc_free(tmp_ctx);
+		return status;
+	}
+
+	result->tid = tcon.tconx.out.tid;
+	*res = talloc_steal(mem_ctx, result);
+	talloc_free(tmp_ctx);
+	return NT_STATUS_OK;
+}



More information about the samba-cvs mailing list