[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-194-g255c2ad

Jeremy Allison jra at samba.org
Mon Nov 5 19:20:29 GMT 2007


The branch, v3-2-test has been updated
       via  255c2adf7b6ef30932b5bb9f142ccef4a5d3d0db (commit)
      from  5721a511d8dd327717bcd9c2053c4bd08f01185c (commit)

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


- Log -----------------------------------------------------------------
commit 255c2adf7b6ef30932b5bb9f142ccef4a5d3d0db
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 5 11:12:56 2007 -0800

    Remove the horror that was the global smb_rw_error.
    Each cli struct has it's own local copy of this variable,
    so use that in client code. In the smbd server, add one
    static to smbd/proccess.c and use that inside smbd. Fix
    a bunch of places where smb_rw_error could be set by
    calling read_data() in places where we weren't reading
    from the SMB client socket (ie. winbindd).
    Jeremy.

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

Summary of changes:
 source/client/client.c          |    2 +-
 source/include/client.h         |    2 +-
 source/lib/util_sock.c          |   87 ++++++++++++++++++++-------------------
 source/libsmb/clientgen.c       |   23 +++++-----
 source/nmbd/asyncdns.c          |    4 +-
 source/smbd/chgpasswd.c         |    2 +-
 source/smbd/process.c           |   59 +++++++++++++++++---------
 source/smbd/reply.c             |    5 +-
 source/winbindd/winbindd_dual.c |    4 +-
 9 files changed, 104 insertions(+), 84 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/client/client.c b/source/client/client.c
index 27f120c..94dc52d 100644
--- a/source/client/client.c
+++ b/source/client/client.c
@@ -3711,7 +3711,7 @@ static void readline_callback(void)
 	   session keepalives and then drop them here.
 	*/
 	if (FD_ISSET(cli->fd,&fds)) {
-		if (!receive_smb(cli->fd,cli->inbuf,0)) {
+		if (!receive_smb(cli->fd,cli->inbuf,0,&cli->smb_rw_error)) {
 			DEBUG(0, ("Read from server failed, maybe it closed the "
 				"connection\n"));
 			return;
diff --git a/source/include/client.h b/source/include/client.h
index d8c3578..dd8bb0d 100644
--- a/source/include/client.h
+++ b/source/include/client.h
@@ -82,7 +82,7 @@ struct rpc_pipe_client {
 struct cli_state {
 	int port;
 	int fd;
-	/* Copy of last read or write error. */
+	/* Last read or write error. */
 	enum smb_read_errors smb_rw_error;
 	uint16 cnum;
 	uint16 pid;
diff --git a/source/lib/util_sock.c b/source/lib/util_sock.c
index 0209723..4a870b7 100644
--- a/source/lib/util_sock.c
+++ b/source/lib/util_sock.c
@@ -654,22 +654,19 @@ int client_socket_port(int fd)
  Accessor functions to make thread-safe code easier later...
 ****************************************************************************/
 
-static enum smb_read_errors smb_read_error = SMB_READ_OK;
-
-enum smb_read_errors get_smb_read_error(void)
-{
-	return smb_read_error;
-}
-
-void set_smb_read_error(enum smb_read_errors newerr)
+void set_smb_read_error(enum smb_read_errors *pre,
+			enum smb_read_errors newerr)
 {
-	smb_read_error = newerr;
+	if (pre) {
+		*pre = newerr;
+	}
 }
 
-void cond_set_smb_read_error(enum smb_read_errors newerr)
+void cond_set_smb_read_error(enum smb_read_errors *pre,
+			enum smb_read_errors newerr)
 {
-	if (smb_read_error == SMB_READ_OK) {
-		smb_read_error = newerr;
+	if (pre && *pre == SMB_READ_OK) {
+		*pre = newerr;
 	}
 }
 
@@ -883,7 +880,8 @@ ssize_t read_socket_with_timeout(int fd,
 				char *buf,
 				size_t mincnt,
 				size_t maxcnt,
-				unsigned int time_out)
+				unsigned int time_out,
+				enum smb_read_errors *pre)
 {
 	fd_set fds;
 	int selrtn;
@@ -896,7 +894,7 @@ ssize_t read_socket_with_timeout(int fd,
 	if (maxcnt <= 0)
 		return(0);
 
-	set_smb_read_error(SMB_READ_OK);
+	set_smb_read_error(pre,SMB_READ_OK);
 
 	/* Blocking read */
 	if (time_out == 0) {
@@ -910,7 +908,7 @@ ssize_t read_socket_with_timeout(int fd,
 			if (readret == 0) {
 				DEBUG(5,("read_socket_with_timeout: "
 					"blocking read. EOF from client.\n"));
-				set_smb_read_error(SMB_READ_EOF);
+				set_smb_read_error(pre,SMB_READ_EOF);
 				return -1;
 			}
 
@@ -927,7 +925,7 @@ ssize_t read_socket_with_timeout(int fd,
 						"read error = %s.\n",
 						strerror(errno) ));
 				}
-				set_smb_read_error(SMB_READ_ERROR);
+				set_smb_read_error(pre,SMB_READ_ERROR);
 				return -1;
 			}
 			nread += readret;
@@ -966,7 +964,7 @@ ssize_t read_socket_with_timeout(int fd,
 				"read. select error = %s.\n",
 				strerror(errno) ));
 			}
-			set_smb_read_error(SMB_READ_ERROR);
+			set_smb_read_error(pre,SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -974,7 +972,7 @@ ssize_t read_socket_with_timeout(int fd,
 		if (selrtn == 0) {
 			DEBUG(10,("read_socket_with_timeout: timeout read. "
 				"select timed out.\n"));
-			set_smb_read_error(SMB_READ_TIMEOUT);
+			set_smb_read_error(pre,SMB_READ_TIMEOUT);
 			return -1;
 		}
 
@@ -984,7 +982,7 @@ ssize_t read_socket_with_timeout(int fd,
 			/* we got EOF on the file descriptor */
 			DEBUG(5,("read_socket_with_timeout: timeout read. "
 				"EOF from client.\n"));
-			set_smb_read_error(SMB_READ_EOF);
+			set_smb_read_error(pre,SMB_READ_EOF);
 			return -1;
 		}
 
@@ -1002,7 +1000,7 @@ ssize_t read_socket_with_timeout(int fd,
 					"read. read error = %s.\n",
 					strerror(errno) ));
 			}
-			set_smb_read_error(SMB_READ_ERROR);
+			set_smb_read_error(pre,SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -1017,13 +1015,13 @@ ssize_t read_socket_with_timeout(int fd,
  Read data from the client, reading exactly N bytes.
 ****************************************************************************/
 
-ssize_t read_data(int fd,char *buffer,size_t N)
+ssize_t read_data(int fd,char *buffer,size_t N, enum smb_read_errors *pre)
 {
 	ssize_t ret;
 	size_t total=0;
 	char addr[INET6_ADDRSTRLEN];
 
-	set_smb_read_error(SMB_READ_OK);
+	set_smb_read_error(pre,SMB_READ_OK);
 
 	while (total < N) {
 		ret = sys_read(fd,buffer + total,N - total);
@@ -1032,7 +1030,7 @@ ssize_t read_data(int fd,char *buffer,size_t N)
 			DEBUG(10,("read_data: read of %d returned 0. "
 				"Error = %s\n",
 				(int)(N - total), strerror(errno) ));
-			set_smb_read_error(SMB_READ_EOF);
+			set_smb_read_error(pre,SMB_READ_EOF);
 			return 0;
 		}
 
@@ -1051,7 +1049,7 @@ ssize_t read_data(int fd,char *buffer,size_t N)
 					(int)(N - total),
 					strerror(errno) ));
 			}
-			set_smb_read_error(SMB_READ_ERROR);
+			set_smb_read_error(pre,SMB_READ_ERROR);
 			return -1;
 		}
 		total += ret;
@@ -1119,8 +1117,9 @@ bool send_keepalive(int client)
 ****************************************************************************/
 
 ssize_t read_smb_length_return_keepalive(int fd,
-						char *inbuf,
-						unsigned int timeout)
+					char *inbuf,
+					unsigned int timeout,
+					enum smb_read_errors *pre)
 {
 	ssize_t len=0;
 	int msg_type;
@@ -1128,10 +1127,10 @@ ssize_t read_smb_length_return_keepalive(int fd,
 
 	while (!ok) {
 		if (timeout > 0) {
-			ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout)
-					== 4);
+			ok = (read_socket_with_timeout(fd,inbuf,4,4,
+						timeout,pre) == 4);
 		} else {
-			ok = (read_data(fd,inbuf,4) == 4);
+			ok = (read_data(fd,inbuf,4,pre) == 4);
 		}
 		if (!ok) {
 			return -1;
@@ -1147,7 +1146,7 @@ ssize_t read_smb_length_return_keepalive(int fd,
 
 	DEBUG(10,("got smb length of %lu\n",(unsigned long)len));
 
-	return(len);
+	return len;
 }
 
 /****************************************************************************
@@ -1157,12 +1156,12 @@ ssize_t read_smb_length_return_keepalive(int fd,
  Timeout is in milliseconds.
 ****************************************************************************/
 
-ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout)
+ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout, enum smb_read_errors *pre)
 {
 	ssize_t len;
 
 	for(;;) {
-		len = read_smb_length_return_keepalive(fd, inbuf, timeout);
+		len = read_smb_length_return_keepalive(fd, inbuf, timeout, pre);
 
 		if(len < 0)
 			return len;
@@ -1191,13 +1190,14 @@ ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout)
 ssize_t receive_smb_raw(int fd,
 			char *buffer,
 			unsigned int timeout,
-			size_t maxlen)
+			size_t maxlen,
+			enum smb_read_errors *pre)
 {
 	ssize_t len,ret;
 
-	set_smb_read_error(SMB_READ_OK);
+	set_smb_read_error(pre,SMB_READ_OK);
 
-	len = read_smb_length_return_keepalive(fd,buffer,timeout);
+	len = read_smb_length_return_keepalive(fd,buffer,timeout,pre);
 	if (len < 0) {
 		DEBUG(10,("receive_smb_raw: length < 0!\n"));
 
@@ -1207,7 +1207,7 @@ ssize_t receive_smb_raw(int fd,
 		 * variables still suck :-). JRA.
 		 */
 
-		cond_set_smb_read_error(SMB_READ_ERROR);
+		cond_set_smb_read_error(pre,SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -1227,7 +1227,7 @@ ssize_t receive_smb_raw(int fd,
 			 * variables still suck :-). JRA.
 			 */
 
-			cond_set_smb_read_error(SMB_READ_ERROR);
+			cond_set_smb_read_error(pre,SMB_READ_ERROR);
 			return -1;
 		}
 	}
@@ -1242,13 +1242,14 @@ ssize_t receive_smb_raw(int fd,
 					buffer+4,
 					len,
 					len,
-					timeout);
+					timeout,
+					pre);
 		} else {
-			ret = read_data(fd,buffer+4,len);
+			ret = read_data(fd,buffer+4,len,pre);
 		}
 
 		if (ret != len) {
-			cond_set_smb_read_error(SMB_READ_ERROR);
+			cond_set_smb_read_error(pre,SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -1266,9 +1267,9 @@ ssize_t receive_smb_raw(int fd,
  Checks the MAC on signed packets.
 ****************************************************************************/
 
-bool receive_smb(int fd, char *buffer, unsigned int timeout)
+bool receive_smb(int fd, char *buffer, unsigned int timeout, enum smb_read_errors *pre)
 {
-	if (receive_smb_raw(fd, buffer, timeout, 0) < 0) {
+	if (receive_smb_raw(fd, buffer, timeout, 0, pre) < 0) {
 		return false;
 	}
 
@@ -1276,7 +1277,7 @@ bool receive_smb(int fd, char *buffer, unsigned int timeout)
 	if (!srv_check_sign_mac(buffer, true)) {
 		DEBUG(0, ("receive_smb: SMB Signature verification "
 			"failed on incoming packet!\n"));
-		cond_set_smb_read_error(SMB_READ_BAD_SIG);
+		cond_set_smb_read_error(pre,SMB_READ_BAD_SIG);
 		return false;
 	}
 
diff --git a/source/libsmb/clientgen.c b/source/libsmb/clientgen.c
index 0a8ff4e..ee1a0fe 100644
--- a/source/libsmb/clientgen.c
+++ b/source/libsmb/clientgen.c
@@ -52,24 +52,26 @@ int cli_set_port(struct cli_state *cli, int port)
  should never go into a blocking read.
 ****************************************************************************/
 
-static ssize_t client_receive_smb(int fd,char *buffer, unsigned int timeout, size_t maxlen)
+static ssize_t client_receive_smb(struct cli_state *cli, size_t maxlen)
 {
 	ssize_t len;
 
 	for(;;) {
-		len = receive_smb_raw(fd, buffer, timeout, maxlen);
+		len = receive_smb_raw(cli->fd, cli->inbuf, cli->timeout,
+				maxlen, &cli->smb_rw_error);
 
 		if (len < 0) {
 			DEBUG(10,("client_receive_smb failed\n"));
-			show_msg(buffer);
+			show_msg(cli->inbuf);
 			return len;
 		}
 
 		/* Ignore session keepalive packets. */
-		if(CVAL(buffer,0) != SMBkeepalive)
+		if(CVAL(cli->inbuf,0) != SMBkeepalive) {
 			break;
+		}
 	}
-	show_msg(buffer);
+	show_msg(cli->inbuf);
 	return len;
 }
 
@@ -86,7 +88,7 @@ bool cli_receive_smb(struct cli_state *cli)
 		return False; 
 
  again:
-	len = client_receive_smb(cli->fd,cli->inbuf,cli->timeout, 0);
+	len = client_receive_smb(cli, 0);
 	
 	if (len > 0) {
 		/* it might be an oplock break request */
@@ -110,7 +112,6 @@ bool cli_receive_smb(struct cli_state *cli)
 	/* If the server is not responding, note that now */
 	if (len < 0) {
                 DEBUG(0, ("Receiving SMB: Server stopped responding\n"));
-		cli->smb_rw_error = get_smb_read_error();
 		close(cli->fd);
 		cli->fd = -1;
 		return False;
@@ -154,9 +155,10 @@ bool cli_receive_smb(struct cli_state *cli)
 ssize_t cli_receive_smb_data(struct cli_state *cli, char *buffer, size_t len)
 {
 	if (cli->timeout > 0) {
-		return read_socket_with_timeout(cli->fd, buffer, len, len, cli->timeout);
+		return read_socket_with_timeout(cli->fd, buffer, len,
+						len, cli->timeout, &cli->smb_rw_error);
 	} else {
-		return read_data(cli->fd, buffer, len);
+		return read_data(cli->fd, buffer, len, &cli->smb_rw_error);
 	}
 }
 
@@ -174,7 +176,7 @@ bool cli_receive_smb_readX_header(struct cli_state *cli)
  again:
 
 	/* Read up to the size of a readX header reply. */
-	len = client_receive_smb(cli->fd, cli->inbuf, cli->timeout, (smb_size - 4) + 24);
+	len = client_receive_smb(cli, (smb_size - 4) + 24);
 	
 	if (len > 0) {
 		/* it might be an oplock break request */
@@ -240,7 +242,6 @@ bool cli_receive_smb_readX_header(struct cli_state *cli)
 
   read_err:
 
-	set_smb_read_error(SMB_READ_ERROR);
 	cli->smb_rw_error = SMB_READ_ERROR;
 	close(cli->fd);
 	cli->fd = -1;
diff --git a/source/nmbd/asyncdns.c b/source/nmbd/asyncdns.c
index b9c9ffb..33c1cb6 100644
--- a/source/nmbd/asyncdns.c
+++ b/source/nmbd/asyncdns.c
@@ -87,7 +87,7 @@ static void asyncdns_process(void)
 	DEBUGLEVEL = -1;
 
 	while (1) {
-		if (read_data(fd_in, (char *)&r, sizeof(r)) != sizeof(r)) 
+		if (read_data(fd_in, (char *)&r, sizeof(r), NULL) != sizeof(r)) 
 			break;
 
 		pull_ascii_nstring( qname, sizeof(qname), r.name.name);
@@ -208,7 +208,7 @@ void run_dns_queue(void)
 		start_async_dns();
 	}
 
-	if ((size=read_data(fd_in, (char *)&r, sizeof(r))) != sizeof(r)) {
+	if ((size=read_data(fd_in, (char *)&r, sizeof(r), NULL)) != sizeof(r)) {
 		if (size) {
 			DEBUG(0,("Incomplete DNS answer from child!\n"));
 			fd_in = -1;
diff --git a/source/smbd/chgpasswd.c b/source/smbd/chgpasswd.c
index fb6e6c0..d894421 100644
--- a/source/smbd/chgpasswd.c
+++ b/source/smbd/chgpasswd.c
@@ -256,7 +256,7 @@ static int expect(int master, char *issue, char *expected)
 
 		while ((len = read_socket_with_timeout(master, buffer + nread, 1,
 						       sizeof(buffer) - nread - 1,
-						       timeout)) > 0) {
+						       timeout, NULL)) > 0) {
 			nread += len;
 			buffer[nread] = 0;
 
diff --git a/source/smbd/process.c b/source/smbd/process.c
index 7d64556..24497de 100644
--- a/source/smbd/process.c
+++ b/source/smbd/process.c
@@ -24,6 +24,7 @@ extern struct auth_context *negprot_global_auth_context;
 extern int smb_echo_count;
 
 const int total_buffer_size = (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
+static enum smb_read_errors smb_read_error = SMB_READ_OK;
 
 /*
  * Size of data we can send to client. Set
@@ -43,6 +44,13 @@ SIG_ATOMIC_T got_sig_term = 0;
 extern bool global_machine_password_needs_changing;
 extern int max_send;
 
+/* Accessor function for smb_read_error for smbd functions. */
+
+enum smb_read_errors *get_srv_read_error(void)
+{
+	return &smb_read_error;
+}
+
 /* Socket functions for smbd packet processing. */
 
 static bool valid_packet_size(size_t len)
@@ -63,7 +71,8 @@ static bool valid_packet_size(size_t len)
 			 * variables still suck :-). JRA.
 			 */
 
-			cond_set_smb_read_error(SMB_READ_ERROR);
+			cond_set_smb_read_error(get_srv_read_error(),
+						SMB_READ_ERROR);
 			return false;
 		}
 	}
@@ -86,13 +95,15 @@ static ssize_t read_packet_remainder(int fd,
 						buffer,
 						len,
 						len,
-						timeout);
+						timeout,
+						get_srv_read_error());
 	} else {
-		ret = read_data(fd, buffer, len);
+		ret = read_data(fd, buffer, len, get_srv_read_error());
 	}
 
 	if (ret != len) {
-		cond_set_smb_read_error(SMB_READ_ERROR);
+		cond_set_smb_read_error(get_srv_read_error(),
+					SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -135,15 +146,18 @@ ssize_t receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
 					writeX_header + 4,
 					STANDARD_WRITE_AND_X_HEADER_SIZE,
 					STANDARD_WRITE_AND_X_HEADER_SIZE,
-					timeout);
+					timeout,
+					get_srv_read_error());
 	} else {
 		ret = read_data(fd,
 				writeX_header+4,
-				STANDARD_WRITE_AND_X_HEADER_SIZE);
+				STANDARD_WRITE_AND_X_HEADER_SIZE,
+				get_srv_read_error());
 	}
 
 	if (ret != STANDARD_WRITE_AND_X_HEADER_SIZE) {
-		cond_set_smb_read_error(SMB_READ_ERROR);
+		cond_set_smb_read_error(get_srv_read_error(),
+					SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -183,7 +197,8 @@ ssize_t receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
 		if (*buffer == NULL) {
 			DEBUG(0, ("Could not allocate inbuf of length %d\n",
 				  (int)sizeof(writeX_header)));
-			cond_set_smb_read_error(SMB_READ_ERROR);
+			cond_set_smb_read_error(get_srv_read_error(),
+						SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -207,7 +222,8 @@ ssize_t receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list