From 977aa660f452d8ebc8f3a2f4bfbf0dda0bc230a2 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 18 Mar 2010 09:23:48 +0100 Subject: s3:smbd: smbd_[un]lock_socket() while accessing the socket to the client metze --- source3/smbd/process.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'source3') diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 3e27c0fa53..aaafad4167 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -65,6 +65,12 @@ bool srv_send_smb(int fd, char *buffer, size_t nwritten=0; ssize_t ret; char *buf_out = buffer; + bool ok; + + ok = smbd_lock_socket(smbd_server_conn); + if (!ok) { + exit_server_cleanly("failed to lock socket"); + } if (do_signing) { /* Sign the outgoing packet if required. */ @@ -95,6 +101,12 @@ bool srv_send_smb(int fd, char *buffer, srv_free_enc_buffer(buf_out); out: SMB_PERFCOUNT_END(pcd); + + ok = smbd_unlock_socket(smbd_server_conn); + if (!ok) { + exit_server_cleanly("failed to unlock socket"); + } + return true; } @@ -2113,14 +2125,25 @@ static void smbd_server_connection_read_handler(struct smbd_server_connection *c NTSTATUS status; uint32_t seqnum; - /* TODO: make this completely nonblocking */ + bool ok; + ok = smbd_lock_socket(conn); + if (!ok) { + exit_server_cleanly("failed to lock socket"); + } + + /* TODO: make this completely nonblocking */ status = receive_smb_talloc(mem_ctx, smbd_server_fd(), (char **)(void *)&inbuf, 0, /* timeout */ &unread_bytes, &encrypted, &inbuf_len, &seqnum); + ok = smbd_unlock_socket(conn); + if (!ok) { + exit_server_cleanly("failed to unlock"); + } + if (NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) { goto process; } -- cgit