[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Sun May 22 14:18:03 MDT 2011


The branch, master has been updated
       via  df0e330 s3: Remove cli_send/receive_smb
       via  ce9d63d s3: Remove the smbtorture3 OPLOCK3 test
       via  9a787bb s3: Convert the OPEN4 test to async oplock handling
      from  feb1d9f s3: Remove clistr_align_out

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


- Log -----------------------------------------------------------------
commit df0e33008e516e0ae631a3760a4c5ff2a1237834
Author: Volker Lendecke <vl at samba.org>
Date:   Sun May 22 19:00:50 2011 +0200

    s3: Remove cli_send/receive_smb
    
    A moment of silence is due here, R.I.P.
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sun May 22 22:17:12 CEST 2011 on sn-devel-104

commit ce9d63d1618e1cd803e68a0d97ec352a8d125070
Author: Volker Lendecke <vl at samba.org>
Date:   Sun May 22 14:16:46 2011 +0200

    s3: Remove the smbtorture3 OPLOCK3 test
    
    This is the last user of cli_receive_smb. Oplocks are nowadays tested
    in smbtorture4, this mainly has historic value

commit 9a787bbad1f8a5b19242118fe7a37de76562edf8
Author: Volker Lendecke <vl at samba.org>
Date:   Sun May 22 18:50:16 2011 +0200

    s3: Convert the OPEN4 test to async oplock handling
    
    This removes a caller of cli_receive_smb

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

Summary of changes:
 source3/libsmb/clientgen.c                |  282 -----------------------------
 source3/libsmb/proto.h                    |    2 -
 source3/selftest/tests.py                 |    2 +-
 source3/torture/torture.c                 |  184 ++++++++++---------
 testsuite/build_farm/runlist              |    2 +-
 testsuite/build_farm/torture-OPLOCK3.test |    2 -
 6 files changed, 97 insertions(+), 377 deletions(-)
 delete mode 100644 testsuite/build_farm/torture-OPLOCK3.test


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index d6f909c..6bfc3cd 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -68,101 +68,6 @@ bool cli_ucs2(struct cli_state *cli)
 	return ((cli->capabilities & CAP_UNICODE) != 0);
 }
 
-
-/****************************************************************************
- Read an smb from a fd ignoring all keepalive packets.
- The timeout is in milliseconds
-
- This is exactly the same as receive_smb except that it never returns
- a session keepalive packet (just as receive_smb used to do).
- receive_smb was changed to return keepalives as the oplock processing means this call
- should never go into a blocking read.
-****************************************************************************/
-
-static ssize_t client_receive_smb(struct cli_state *cli, size_t maxlen)
-{
-	size_t len;
-
-	for(;;) {
-		NTSTATUS status;
-
-		set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK);
-
-		status = receive_smb_raw(cli->fd, cli->inbuf, cli->bufsize,
-					cli->timeout, maxlen, &len);
-		if (!NT_STATUS_IS_OK(status)) {
-			DEBUG(10,("client_receive_smb failed\n"));
-			show_msg(cli->inbuf);
-
-			if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
-				set_smb_read_error(&cli->smb_rw_error,
-						   SMB_READ_EOF);
-				return -1;
-			}
-
-			if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
-				set_smb_read_error(&cli->smb_rw_error,
-						   SMB_READ_TIMEOUT);
-				return -1;
-			}
-
-			set_smb_read_error(&cli->smb_rw_error, SMB_READ_ERROR);
-			return -1;
-		}
-
-		/*
-		 * I don't believe len can be < 0 with NT_STATUS_OK
-		 * returned above, but this check doesn't hurt. JRA.
-		 */
-
-		if ((ssize_t)len < 0) {
-			return len;
-		}
-
-		/* Ignore session keepalive packets. */
-		if(CVAL(cli->inbuf,0) != SMBkeepalive) {
-			break;
-		}
-	}
-
-	if (cli_encryption_on(cli)) {
-		NTSTATUS status = cli_decrypt_message(cli);
-		if (!NT_STATUS_IS_OK(status)) {
-			DEBUG(0, ("SMB decryption failed on incoming packet! Error %s\n",
-				nt_errstr(status)));
-			cli->smb_rw_error = SMB_READ_BAD_DECRYPT;
-			return -1;
-		}
-	}
-
-	show_msg(cli->inbuf);
-	return len;
-}
-
-static bool cli_state_set_seqnum(struct cli_state *cli, uint16_t mid, uint32_t seqnum)
-{
-	struct cli_state_seqnum *c;
-
-	for (c = cli->seqnum; c; c = c->next) {
-		if (c->mid == mid) {
-			c->seqnum = seqnum;
-			return true;
-		}
-	}
-
-	c = talloc_zero(cli, struct cli_state_seqnum);
-	if (!c) {
-		return false;
-	}
-
-	c->mid = mid;
-	c->seqnum = seqnum;
-	c->persistent = false;
-	DLIST_ADD_END(cli->seqnum, c, struct cli_state_seqnum *);
-
-	return true;
-}
-
 bool cli_state_seqnum_persistent(struct cli_state *cli,
 				 uint16_t mid)
 {
@@ -194,193 +99,6 @@ bool cli_state_seqnum_remove(struct cli_state *cli,
 	return false;
 }
 
-static uint32_t cli_state_get_seqnum(struct cli_state *cli, uint16_t mid)
-{
-	struct cli_state_seqnum *c;
-
-	for (c = cli->seqnum; c; c = c->next) {
-		if (c->mid == mid) {
-			uint32_t seqnum = c->seqnum;
-			if (!c->persistent) {
-				DLIST_REMOVE(cli->seqnum, c);
-				TALLOC_FREE(c);
-			}
-			return seqnum;
-		}
-	}
-
-	return 0;
-}
-
-/****************************************************************************
- Recv an smb.
-****************************************************************************/
-
-bool cli_receive_smb(struct cli_state *cli)
-{
-	ssize_t len;
-	uint16_t mid;
-	uint32_t seqnum;
-
-	/* fd == -1 causes segfaults -- Tom (tom at ninja.nl) */
-	if (cli->fd == -1)
-		return false; 
-
- again:
-	len = client_receive_smb(cli, 0);
-	
-	if (len > 0) {
-		/* it might be an oplock break request */
-		if (!(CVAL(cli->inbuf, smb_flg) & FLAG_REPLY) &&
-		    CVAL(cli->inbuf,smb_com) == SMBlockingX &&
-		    SVAL(cli->inbuf,smb_vwv6) == 0 &&
-		    SVAL(cli->inbuf,smb_vwv7) == 0) {
-			if (cli->oplock_handler) {
-				int fnum = SVAL(cli->inbuf,smb_vwv2);
-				unsigned char level = CVAL(cli->inbuf,smb_vwv3+1);
-				if (!NT_STATUS_IS_OK(cli->oplock_handler(cli, fnum, level))) {
-					return false;
-				}
-			}
-			/* try to prevent loops */
-			SCVAL(cli->inbuf,smb_com,0xFF);
-			goto again;
-		}
-	}
-
-	/* If the server is not responding, note that now */
-	if (len < 0) {
-		/*
-		 * only log if the connection should still be open and not when
-		 * the connection was closed due to a dropped ip message
-		 */
-		if (cli->fd != -1) {
-			char addr[INET6_ADDRSTRLEN];
-			print_sockaddr(addr, sizeof(addr), &cli->dest_ss);
-			DEBUG(0, ("Receiving SMB: Server %s stopped responding\n",
-				addr));
-			close(cli->fd);
-			cli->fd = -1;
-		}
-		return false;
-	}
-
-	mid = SVAL(cli->inbuf,smb_mid);
-	seqnum = cli_state_get_seqnum(cli, mid);
-
-	if (!cli_check_sign_mac(cli, cli->inbuf, seqnum+1)) {
-		/*
-		 * If we get a signature failure in sessionsetup, then
-		 * the server sometimes just reflects the sent signature
-		 * back to us. Detect this and allow the upper layer to
-		 * retrieve the correct Windows error message.
-		 */
-		if (CVAL(cli->outbuf,smb_com) == SMBsesssetupX &&
-			(smb_len(cli->inbuf) > (smb_ss_field + 8 - 4)) &&
-			(SVAL(cli->inbuf,smb_flg2) & FLAGS2_SMB_SECURITY_SIGNATURES) &&
-			memcmp(&cli->outbuf[smb_ss_field],&cli->inbuf[smb_ss_field],8) == 0 &&
-			cli_is_error(cli)) {
-
-			/*
-			 * Reflected signature on login error. 
-			 * Set bad sig but don't close fd.
-			 */
-			cli->smb_rw_error = SMB_READ_BAD_SIG;
-			return true;
-		}
-
-		DEBUG(0, ("SMB Signature verification failed on incoming packet!\n"));
-		cli->smb_rw_error = SMB_READ_BAD_SIG;
-		close(cli->fd);
-		cli->fd = -1;
-		return false;
-	};
-	return true;
-}
-
-static ssize_t write_socket(int fd, const char *buf, size_t len)
-{
-        ssize_t ret=0;
-
-        DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
-        ret = write_data(fd,buf,len);
-
-        DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
-        if(ret <= 0)
-                DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
-                        (int)len, fd, strerror(errno) ));
-
-        return(ret);
-}
-
-/****************************************************************************
- Send an smb to a fd.
-****************************************************************************/
-
-bool cli_send_smb(struct cli_state *cli)
-{
-	size_t len;
-	size_t nwritten=0;
-	ssize_t ret;
-	char *buf_out = cli->outbuf;
-	bool enc_on = cli_encryption_on(cli);
-	uint32_t seqnum;
-
-	/* fd == -1 causes segfaults -- Tom (tom at ninja.nl) */
-	if (cli->fd == -1)
-		return false;
-
-	cli_calculate_sign_mac(cli, cli->outbuf, &seqnum);
-
-	if (!cli_state_set_seqnum(cli, cli->mid, seqnum)) {
-		DEBUG(0,("Failed to store mid[%u]/seqnum[%u]\n",
-			(unsigned int)cli->mid,
-			(unsigned int)seqnum));
-		return false;
-	}
-
-	if (enc_on) {
-		NTSTATUS status = cli_encrypt_message(cli, cli->outbuf,
-						      &buf_out);
-		if (!NT_STATUS_IS_OK(status)) {
-			close(cli->fd);
-			cli->fd = -1;
-			cli->smb_rw_error = SMB_WRITE_ERROR;
-			DEBUG(0,("Error in encrypting client message. Error %s\n",
-				nt_errstr(status) ));
-			return false;
-		}
-	}
-
-	len = smb_len(buf_out) + 4;
-
-	while (nwritten < len) {
-		ret = write_socket(cli->fd,buf_out+nwritten,len - nwritten);
-		if (ret <= 0) {
-			if (enc_on) {
-				cli_free_enc_buffer(cli, buf_out);
-			}
-			close(cli->fd);
-			cli->fd = -1;
-			cli->smb_rw_error = SMB_WRITE_ERROR;
-			DEBUG(0,("Error writing %d bytes to client. %d (%s)\n",
-				(int)len,(int)ret, strerror(errno) ));
-			return false;
-		}
-		nwritten += ret;
-	}
-
-	if (enc_on) {
-		cli_free_enc_buffer(cli, buf_out);
-	}
-
-	/* Increment the mid so we can tell between responses. */
-	cli->mid++;
-	if (!cli->mid)
-		cli->mid++;
-	return true;
-}
-
 /****************************************************************************
  Setup basics in a outgoing packet.
 ****************************************************************************/
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index dd97e7c..089a88a 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -154,8 +154,6 @@ bool cli_state_seqnum_persistent(struct cli_state *cli,
 				 uint16_t mid);
 bool cli_state_seqnum_remove(struct cli_state *cli,
 			     uint16_t mid);
-bool cli_receive_smb(struct cli_state *cli);
-bool cli_send_smb(struct cli_state *cli);
 void cli_setup_packet_buf(struct cli_state *cli, char *buf);
 NTSTATUS cli_set_domain(struct cli_state *cli, const char *domain);
 NTSTATUS cli_set_username(struct cli_state *cli, const char *username);
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 08e62eb..962ea7f 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -53,7 +53,7 @@ plantestsuite("samba3.local_s3", "s3dc:local", [os.path.join(samba3srcdir, "scri
 
 tests=[ "FDPASS", "LOCK1", "LOCK2", "LOCK3", "LOCK4", "LOCK5", "LOCK6", "LOCK7", "LOCK9",
         "UNLINK", "BROWSE", "ATTR", "TRANS2", "TORTURE",
-        "OPLOCK1", "OPLOCK2", "OPLOCK3", "OPLOCK4", "STREAMERROR",
+        "OPLOCK1", "OPLOCK2", "OPLOCK4", "STREAMERROR",
         "DIR", "DIR1", "DIR-CREATETIME", "TCON", "TCONDEV", "RW1", "RW2", "RW3", "RW-SIGNING",
         "OPEN", "XCOPY", "RENAME", "DELETE", "DELETE-LN", "PROPERTIES", "W2K",
         "TCON2", "IOCTL", "CHKPATH", "FDSESS", "LOCAL-SUBSTITUTE", "CHAIN1",
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index a28078f..64ba543 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -3520,78 +3520,21 @@ static bool run_oplock2(int dummy)
 	return correct;
 }
 
-/* handler for oplock 3 tests */
-static NTSTATUS oplock3_handler(struct cli_state *cli, uint16_t fnum, unsigned char level)
-{
-	printf("got oplock break fnum=%d level=%d\n",
-	       fnum, level);
-	return cli_oplock_ack(cli, fnum, level);
-}
-
-static bool run_oplock3(int dummy)
-{
+struct oplock4_state {
+	struct tevent_context *ev;
 	struct cli_state *cli;
-	const char *fname = "\\oplockt3.dat";
-	uint16_t fnum;
-	char buf[4] = "abcd";
-	bool correct = True;
-	volatile bool *shared_correct;
-
-	shared_correct = (volatile bool *)shm_setup(sizeof(bool));
-	*shared_correct = True;
-
-	printf("starting oplock test 3\n");
-
-	if (fork() == 0) {
-		/* Child code */
-		use_oplocks = True;
-		use_level_II_oplocks = True;
-		if (!torture_open_connection(&cli, 0)) {
-			*shared_correct = False;
-			exit(0);
-		} 
-		sleep(2);
-		/* try to trigger a oplock break in parent */
-		cli_open(cli, fname, O_RDWR, DENY_NONE, &fnum);
-		cli_writeall(cli, fnum, 0, (uint8_t *)buf, 0, 4, NULL);
-		exit(0);
-	}
-
-	/* parent code */
-	use_oplocks = True;
-	use_level_II_oplocks = True;
-	if (!torture_open_connection(&cli, 1)) { /* other is forked */
-		return False;
-	}
-	cli_oplock_handler(cli, oplock3_handler);
-	cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE, &fnum);
-	cli_writeall(cli, fnum, 0, (uint8_t *)buf, 0, 4, NULL);
-	cli_close(cli, fnum);
-	cli_open(cli, fname, O_RDWR, DENY_NONE, &fnum);
-	cli->timeout = 20000;
-	cli_receive_smb(cli);
-	printf("finished oplock test 3\n");
-
-	return (correct && *shared_correct);
-
-/* What are we looking for here?  What's sucess and what's FAILURE? */
-}
+	bool *got_break;
+	uint16_t *fnum2;
+};
 
-/* handler for oplock 4 tests */
-bool *oplock4_shared_correct;
-
-static NTSTATUS oplock4_handler(struct cli_state *cli, uint16_t fnum, unsigned char level)
-{
-	printf("got oplock break fnum=%d level=%d\n",
-	       fnum, level);
-	*oplock4_shared_correct = true;
-	cli_oplock_ack(cli, fnum, level);
-	return NT_STATUS_UNSUCCESSFUL; /* Cause cli_receive_smb to return. */
-}
+static void oplock4_got_break(struct tevent_req *req);
+static void oplock4_got_open(struct tevent_req *req);
 
 static bool run_oplock4(int dummy)
 {
+	struct tevent_context *ev;
 	struct cli_state *cli1, *cli2;
+	struct tevent_req *oplock_req, *open_req;
 	const char *fname = "\\lockt4.lck";
 	const char *fname_ln = "\\lockt4_ln.lck";
 	uint16_t fnum1, fnum2;
@@ -3599,8 +3542,9 @@ static bool run_oplock4(int dummy)
 	NTSTATUS status;
 	bool correct = true;
 
-	oplock4_shared_correct = (bool *)shm_setup(sizeof(bool));
-	*oplock4_shared_correct = false;
+	bool got_break;
+
+	struct oplock4_state *state;
 
 	printf("starting oplock test 4\n");
 
@@ -3675,36 +3619,62 @@ static bool run_oplock4(int dummy)
 	cli2->use_oplocks = true;
 	cli2->use_level_II_oplocks = true;
 
-	cli_oplock_handler(cli1, oplock4_handler);
-
 	status = cli_open(cli1, fname, O_RDWR, DENY_NONE, &fnum1);
 	if (!NT_STATUS_IS_OK(status)) {
 		printf("open of %s failed (%s)\n", fname, nt_errstr(status));
 		return false;
 	}
 
-	if (fork() == 0) {
-		/* Child code */
-		status = cli_open(cli2, fname_ln, O_RDWR, DENY_NONE, &fnum2);
-		if (!NT_STATUS_IS_OK(status)) {
-			printf("open of %s failed (%s)\n", fname_ln, nt_errstr(status));
-			*oplock4_shared_correct = false;
-			exit(0);
-		}
+	ev = tevent_context_init(talloc_tos());
+	if (ev == NULL) {
+		printf("tevent_req_create failed\n");
+		return false;
+	}
 
-		status = cli_close(cli2, fnum2);
-		if (!NT_STATUS_IS_OK(status)) {
-			printf("close2 failed (%s)\n", nt_errstr(status));
-			*oplock4_shared_correct = false;
-		}
+	state = talloc(ev, struct oplock4_state);
+	if (state == NULL) {
+		printf("talloc failed\n");
+		return false;
+	}
+	state->ev = ev;
+	state->cli = cli1;
+	state->got_break = &got_break;
+	state->fnum2 = &fnum2;
+
+	oplock_req = cli_smb_oplock_break_waiter_send(
+		talloc_tos(), ev, cli1);
+	if (oplock_req == NULL) {
+		printf("cli_smb_oplock_break_waiter_send failed\n");
+		return false;
+	}
+	tevent_req_set_callback(oplock_req, oplock4_got_break, state);
 
-		exit(0);
+	open_req = cli_open_send(
+		talloc_tos(), ev, cli2, fname_ln, O_RDWR, DENY_NONE);
+	if (oplock_req == NULL) {
+		printf("cli_open_send failed\n");
+		return false;
 	}
+	tevent_req_set_callback(open_req, oplock4_got_open, state);
 
-	sleep(2);
+	got_break = false;
+	fnum2 = 0xffff;
 
-	/* Process the oplock break. */
-	cli_receive_smb(cli1);
+	while (!got_break || fnum2 == 0xffff) {
+		int ret;
+		ret = tevent_loop_once(ev);
+		if (ret == -1) {
+			printf("tevent_loop_once failed: %s\n",
+			       strerror(errno));


-- 
Samba Shared Repository


More information about the samba-cvs mailing list