[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-3044-gd3facf4

Volker Lendecke vlendec at samba.org
Sat Jun 28 08:55:12 GMT 2008


The branch, v3-3-test has been updated
       via  d3facf4cbdb2915168e91d64c2d8320f67524df8 (commit)
       via  50427cbf6345d3f671e9ea321089c4b4244df972 (commit)
      from  242077f714c738642edd125449ab5c89748bcecd (commit)

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


- Log -----------------------------------------------------------------
commit d3facf4cbdb2915168e91d64c2d8320f67524df8
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Apr 2 15:55:10 2008 +0200

    Let send_trans_reply work on only the inbuf
    
    It does not really need the whole smb_request

commit 50427cbf6345d3f671e9ea321089c4b4244df972
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Apr 2 15:34:29 2008 +0200

    Factor out create_outbuf, creating an outbuf just given an inbuf

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

Summary of changes:
 source/include/proto.h |    4 +-
 source/smbd/ipc.c      |  107 ++++++++++++++++++++++++-----------------------
 source/smbd/lanman.c   |    2 +-
 source/smbd/process.c  |   29 +++++++++----
 4 files changed, 79 insertions(+), 63 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/proto.h b/source/include/proto.h
index 81cf2db..13f392d 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -9727,7 +9727,7 @@ NTSTATUS dup_file_fsp(files_struct *fsp,
 /* The following definitions come from smbd/ipc.c  */
 
 void send_trans_reply(connection_struct *conn,
-			struct smb_request *req,
+		      const uint8_t *inbuf,
 		      char *rparam, int rparam_len,
 		      char *rdata, int rdata_len,
 		      bool buffer_too_large);
@@ -10066,6 +10066,8 @@ struct idle_event *event_add_idle(struct event_context *event_ctx,
 				  void *private_data);
 NTSTATUS allow_new_trans(struct trans_state *list, int mid);
 void respond_to_all_remaining_local_messages(void);
+bool create_outbuf(TALLOC_CTX *mem_ctx, const char *inbuf, char **outbuf,
+		   uint8_t num_words, uint32_t num_bytes);
 void reply_outbuf(struct smb_request *req, uint8 num_words, uint32 num_bytes);
 const char *smb_fn_name(int type);
 void add_to_common_flags2(uint32 v);
diff --git a/source/smbd/ipc.c b/source/smbd/ipc.c
index 59a5dfd..f4c4599 100644
--- a/source/smbd/ipc.c
+++ b/source/smbd/ipc.c
@@ -81,8 +81,7 @@ static void copy_trans_params_and_data(char *outbuf, int align,
  Send a trans reply.
  ****************************************************************************/
 
-void send_trans_reply(connection_struct *conn,
-			struct smb_request *req,
+void send_trans_reply(connection_struct *conn, const uint8_t *inbuf,
 		      char *rparam, int rparam_len,
 		      char *rdata, int rdata_len,
 		      bool buffer_too_large)
@@ -91,6 +90,7 @@ void send_trans_reply(connection_struct *conn,
 	int tot_data_sent = 0;
 	int tot_param_sent = 0;
 	int align;
+	char *outbuf;
 
 	int ldata  = rdata  ? rdata_len : 0;
 	int lparam = rparam ? rparam_len : 0;
@@ -103,47 +103,48 @@ void send_trans_reply(connection_struct *conn,
 
 	align = ((this_lparam)%4);
 
-	reply_outbuf(req, 10, 1+align+this_ldata+this_lparam);
+	if (!create_outbuf(talloc_tos(), (char *)inbuf, &outbuf,
+			   10, 1+align+this_ldata+this_lparam)) {
+		smb_panic("could not allocate outbuf");
+	}
 
-	copy_trans_params_and_data((char *)req->outbuf, align,
+	copy_trans_params_and_data(outbuf, align,
 				rparam, tot_param_sent, this_lparam,
 				rdata, tot_data_sent, this_ldata);
 
-	SSVAL(req->outbuf,smb_vwv0,lparam);
-	SSVAL(req->outbuf,smb_vwv1,ldata);
-	SSVAL(req->outbuf,smb_vwv3,this_lparam);
-	SSVAL(req->outbuf,smb_vwv4,smb_offset(smb_buf(req->outbuf)+1,
-					      req->outbuf));
-	SSVAL(req->outbuf,smb_vwv5,0);
-	SSVAL(req->outbuf,smb_vwv6,this_ldata);
-	SSVAL(req->outbuf,smb_vwv7,smb_offset(smb_buf(req->outbuf)+1+
-					      this_lparam+align,
-					      req->outbuf));
-	SSVAL(req->outbuf,smb_vwv8,0);
-	SSVAL(req->outbuf,smb_vwv9,0);
+	SSVAL(outbuf,smb_vwv0,lparam);
+	SSVAL(outbuf,smb_vwv1,ldata);
+	SSVAL(outbuf,smb_vwv3,this_lparam);
+	SSVAL(outbuf,smb_vwv4,smb_offset(smb_buf(outbuf)+1,outbuf));
+	SSVAL(outbuf,smb_vwv5,0);
+	SSVAL(outbuf,smb_vwv6,this_ldata);
+	SSVAL(outbuf,smb_vwv7,smb_offset(smb_buf(outbuf)+1+this_lparam+align,
+					 outbuf));
+	SSVAL(outbuf,smb_vwv8,0);
+	SSVAL(outbuf,smb_vwv9,0);
 
 	if (buffer_too_large) {
-		error_packet_set((char *)req->outbuf,
-				 ERRDOS, ERRmoredata,
-				 STATUS_BUFFER_OVERFLOW,
-				 __LINE__, __FILE__);
+		error_packet_set((char *)outbuf, ERRDOS, ERRmoredata,
+				 STATUS_BUFFER_OVERFLOW, __LINE__, __FILE__);
 	}
 
-	show_msg((char *)req->outbuf);
-	if (!srv_send_smb(smbd_server_fd(),
-			(char *)req->outbuf,
-			IS_CONN_ENCRYPTED(conn)))
+	show_msg(outbuf);
+	if (!srv_send_smb(smbd_server_fd(), (char *)outbuf,
+			  IS_CONN_ENCRYPTED(conn))) {
 		exit_server_cleanly("send_trans_reply: srv_send_smb failed.");
+	}
 
-	TALLOC_FREE(req->outbuf);
+	TALLOC_FREE(outbuf);
 
 	tot_data_sent = this_ldata;
 	tot_param_sent = this_lparam;
 
 	while (tot_data_sent < ldata || tot_param_sent < lparam)
 	{
-		this_lparam = MIN(lparam-tot_param_sent, max_send - 500); /* hack */
-		this_ldata  = MIN(ldata -tot_data_sent, max_send - (500+this_lparam));
+		this_lparam = MIN(lparam-tot_param_sent,
+				  max_send - 500); /* hack */
+		this_ldata  = MIN(ldata -tot_data_sent,
+				  max_send - (500+this_lparam));
 
 		if(this_lparam < 0)
 			this_lparam = 0;
@@ -153,39 +154,39 @@ void send_trans_reply(connection_struct *conn,
 
 		align = (this_lparam%4);
 
-		reply_outbuf(req, 10, 1+this_ldata+this_lparam+align);
+		if (!create_outbuf(talloc_tos(), (char *)inbuf, &outbuf,
+				   10, 1+align+this_ldata+this_lparam)) {
+			smb_panic("could not allocate outbuf");
+		}
 
-		copy_trans_params_and_data((char *)req->outbuf, align,
+		copy_trans_params_and_data(outbuf, align,
 					   rparam, tot_param_sent, this_lparam,
 					   rdata, tot_data_sent, this_ldata);
 		
-		SSVAL(req->outbuf,smb_vwv3,this_lparam);
-		SSVAL(req->outbuf,smb_vwv4,smb_offset(smb_buf(req->outbuf)+1,
-						      req->outbuf));
-		SSVAL(req->outbuf,smb_vwv5,tot_param_sent);
-		SSVAL(req->outbuf,smb_vwv6,this_ldata);
-		SSVAL(req->outbuf,smb_vwv7,smb_offset(smb_buf(req->outbuf)+1+
-						      this_lparam+align,
-						      req->outbuf));
-		SSVAL(req->outbuf,smb_vwv8,tot_data_sent);
-		SSVAL(req->outbuf,smb_vwv9,0);
+		SSVAL(outbuf,smb_vwv3,this_lparam);
+		SSVAL(outbuf,smb_vwv4,smb_offset(smb_buf(outbuf)+1,outbuf));
+		SSVAL(outbuf,smb_vwv5,tot_param_sent);
+		SSVAL(outbuf,smb_vwv6,this_ldata);
+		SSVAL(outbuf,smb_vwv7,
+		      smb_offset(smb_buf(outbuf)+1+this_lparam+align, outbuf));
+		SSVAL(outbuf,smb_vwv8,tot_data_sent);
+		SSVAL(outbuf,smb_vwv9,0);
 
 		if (buffer_too_large) {
-			error_packet_set((char *)req->outbuf,
-					 ERRDOS, ERRmoredata,
+			error_packet_set(outbuf, ERRDOS, ERRmoredata,
 					 STATUS_BUFFER_OVERFLOW,
 					 __LINE__, __FILE__);
 		}
 
-		show_msg((char *)req->outbuf);
-		if (!srv_send_smb(smbd_server_fd(),
-				(char *)req->outbuf,
-				IS_CONN_ENCRYPTED(conn)))
-			exit_server_cleanly("send_trans_reply: srv_send_smb failed.");
+		show_msg(outbuf);
+		if (!srv_send_smb(smbd_server_fd(), outbuf,
+				  IS_CONN_ENCRYPTED(conn)))
+			exit_server_cleanly("send_trans_reply: srv_send_smb "
+					    "failed.");
 
 		tot_data_sent  += this_ldata;
 		tot_param_sent += this_lparam;
-		TALLOC_FREE(req->outbuf);
+		TALLOC_FREE(outbuf);
 	}
 }
 
@@ -212,7 +213,8 @@ static void api_rpc_trans_reply(connection_struct *conn, struct smb_request *req
 		return;
 	}
 
-	send_trans_reply(conn, req, NULL, 0, rdata, data_len, is_data_outstanding);
+	send_trans_reply(conn, req->inbuf, NULL, 0, rdata, data_len,
+			 is_data_outstanding);
 	SAFE_FREE(rdata);
 	return;
 }
@@ -236,7 +238,7 @@ static void api_WNPHS(connection_struct *conn, struct smb_request *req, smb_np_s
 
 	if (wait_rpc_pipe_hnd_state(p, priority)) {
 		/* now send the reply */
-		send_trans_reply(conn, req, NULL, 0, NULL, 0, False);
+		send_trans_reply(conn, req->inbuf, NULL, 0, NULL, 0, False);
 		return;
 	}
 	api_no_reply(conn,req);
@@ -262,7 +264,7 @@ static void api_SNPHS(connection_struct *conn, struct smb_request *req, smb_np_s
 
 	if (set_rpc_pipe_hnd_state(p, id)) {
 		/* now send the reply */
-		send_trans_reply(conn, req, NULL, 0, NULL, 0, False);
+		send_trans_reply(conn, req->inbuf, NULL, 0, NULL, 0, False);
 		return;
 	}
 	api_no_reply(conn,req);
@@ -284,7 +286,7 @@ static void api_no_reply(connection_struct *conn, struct smb_request *req)
 	DEBUG(3,("Unsupported API fd command\n"));
 
 	/* now send the reply */
-	send_trans_reply(conn, req, rparam, 4, NULL, 0, False);
+	send_trans_reply(conn, req->inbuf, rparam, 4, NULL, 0, False);
 
 	return;
 }
@@ -326,7 +328,8 @@ static void api_fd_reply(connection_struct *conn, uint16 vuid,
 			/* Win9x does this call with a unicode pipe name, not a pnum. */
 			/* Just return success for now... */
 			DEBUG(3,("Got TRANSACT_WAITNAMEDPIPEHANDLESTATE on text pipe name\n"));
-			send_trans_reply(conn, req, NULL, 0, NULL, 0, False);
+			send_trans_reply(conn, req->inbuf, NULL, 0, NULL, 0,
+					 False);
 			return;
 		}
 
diff --git a/source/smbd/lanman.c b/source/smbd/lanman.c
index 03a48f5..fe1d766 100644
--- a/source/smbd/lanman.c
+++ b/source/smbd/lanman.c
@@ -4632,7 +4632,7 @@ void api_reply(connection_struct *conn, uint16 vuid,
 
 	/* If api_Unsupported returns false we can't return anything. */
 	if (reply) {
-		send_trans_reply(conn, req, rparam, rparam_len,
+		send_trans_reply(conn, req->inbuf, rparam, rparam_len,
 				 rdata, rdata_len, False);
 	}
 
diff --git a/source/smbd/process.c b/source/smbd/process.c
index 71e3863..da11652 100644
--- a/source/smbd/process.c
+++ b/source/smbd/process.c
@@ -1245,7 +1245,8 @@ static const struct smb_message_struct {
  allocate and initialize a reply packet
 ********************************************************************/
 
-void reply_outbuf(struct smb_request *req, uint8 num_words, uint32 num_bytes)
+bool create_outbuf(TALLOC_CTX *mem_ctx, const char *inbuf, char **outbuf,
+		   uint8_t num_words, uint32_t num_bytes)
 {
 	/*
          * Protect against integer wrap
@@ -1260,23 +1261,33 @@ void reply_outbuf(struct smb_request *req, uint8 num_words, uint32 num_bytes)
 		smb_panic(msg);
 	}
 
-	if (!(req->outbuf = TALLOC_ARRAY(
-		      req, uint8,
-		      smb_size + num_words*2 + num_bytes))) {
-		smb_panic("could not allocate output buffer\n");
+	*outbuf = TALLOC_ARRAY(mem_ctx, char,
+			       smb_size + num_words*2 + num_bytes);
+	if (*outbuf == NULL) {
+		return false;
 	}
 
-	construct_reply_common((char *)req->inbuf, (char *)req->outbuf);
-	srv_set_message((char *)req->outbuf, num_words, num_bytes, false);
+	construct_reply_common(inbuf, *outbuf);
+	srv_set_message(*outbuf, num_words, num_bytes, false);
 	/*
 	 * Zero out the word area, the caller has to take care of the bcc area
 	 * himself
 	 */
 	if (num_words != 0) {
-		memset(req->outbuf + smb_vwv0, 0, num_words*2);
+		memset(*outbuf + smb_vwv0, 0, num_words*2);
 	}
 
-	return;
+	return true;
+}
+
+void reply_outbuf(struct smb_request *req, uint8 num_words, uint32 num_bytes)
+{
+	char *outbuf;
+	if (!create_outbuf(req, (char *)req->inbuf, &outbuf, num_words,
+			   num_bytes)) {
+		smb_panic("could not allocate output buffer\n");
+	}
+	req->outbuf = (uint8_t *)outbuf;
 }
 
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list