2 Unix SMB/CIFS implementation.
3 process incoming packets - main loop
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Volker Lendecke 2005-2007
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "smbd/globals.h"
23 #include "../librpc/gen_ndr/srv_dfs.h"
24 #include "../librpc/gen_ndr/srv_dssetup.h"
25 #include "../librpc/gen_ndr/srv_echo.h"
26 #include "../librpc/gen_ndr/srv_eventlog.h"
27 #include "../librpc/gen_ndr/srv_initshutdown.h"
28 #include "../librpc/gen_ndr/srv_lsa.h"
29 #include "../librpc/gen_ndr/srv_netlogon.h"
30 #include "../librpc/gen_ndr/srv_ntsvcs.h"
31 #include "../librpc/gen_ndr/srv_samr.h"
32 #include "../librpc/gen_ndr/srv_spoolss.h"
33 #include "../librpc/gen_ndr/srv_srvsvc.h"
34 #include "../librpc/gen_ndr/srv_svcctl.h"
35 #include "../librpc/gen_ndr/srv_winreg.h"
36 #include "../librpc/gen_ndr/srv_wkssvc.h"
37 #include "librpc/gen_ndr/messaging.h"
38 #include "printing/nt_printing_migrate.h"
40 extern bool global_machine_password_needs_changing;
42 static void construct_reply_common(struct smb_request *req, const char *inbuf,
44 static struct pending_message_list *get_deferred_open_message_smb(uint64_t mid);
46 static bool smbd_lock_socket_internal(struct smbd_server_connection *sconn)
50 if (sconn->smb1.echo_handler.socket_lock_fd == -1) {
54 sconn->smb1.echo_handler.ref_count++;
56 if (sconn->smb1.echo_handler.ref_count > 1) {
60 DEBUG(10,("pid[%d] wait for socket lock\n", (int)sys_getpid()));
62 ok = fcntl_lock(sconn->smb1.echo_handler.socket_lock_fd,
63 SMB_F_SETLKW, 0, 0, F_WRLCK);
68 DEBUG(10,("pid[%d] got for socket lock\n", (int)sys_getpid()));
73 void smbd_lock_socket(struct smbd_server_connection *sconn)
75 if (!smbd_lock_socket_internal(sconn)) {
76 exit_server_cleanly("failed to lock socket");
80 static bool smbd_unlock_socket_internal(struct smbd_server_connection *sconn)
84 if (sconn->smb1.echo_handler.socket_lock_fd == -1) {
88 sconn->smb1.echo_handler.ref_count--;
90 if (sconn->smb1.echo_handler.ref_count > 0) {
94 ok = fcntl_lock(sconn->smb1.echo_handler.socket_lock_fd,
95 SMB_F_SETLKW, 0, 0, F_UNLCK);
100 DEBUG(10,("pid[%d] unlocked socket\n", (int)sys_getpid()));
105 void smbd_unlock_socket(struct smbd_server_connection *sconn)
107 if (!smbd_unlock_socket_internal(sconn)) {
108 exit_server_cleanly("failed to unlock socket");
112 /* Accessor function for smb_read_error for smbd functions. */
114 /****************************************************************************
116 ****************************************************************************/
118 bool srv_send_smb(int fd, char *buffer,
119 bool do_signing, uint32_t seqnum,
121 struct smb_perfcount_data *pcd)
126 char *buf_out = buffer;
128 smbd_lock_socket(smbd_server_conn);
131 /* Sign the outgoing packet if required. */
132 srv_calculate_sign_mac(smbd_server_conn, buf_out, seqnum);
136 NTSTATUS status = srv_encrypt_buffer(buffer, &buf_out);
137 if (!NT_STATUS_IS_OK(status)) {
138 DEBUG(0, ("send_smb: SMB encryption failed "
139 "on outgoing packet! Error %s\n",
140 nt_errstr(status) ));
145 len = smb_len(buf_out) + 4;
147 ret = write_data(fd,buf_out+nwritten,len - nwritten);
149 DEBUG(0,("pid[%d] Error writing %d bytes to client. %d. (%s)\n",
150 (int)sys_getpid(), (int)len,(int)ret, strerror(errno) ));
151 srv_free_enc_buffer(buf_out);
155 SMB_PERFCOUNT_SET_MSGLEN_OUT(pcd, len);
156 srv_free_enc_buffer(buf_out);
158 SMB_PERFCOUNT_END(pcd);
160 smbd_unlock_socket(smbd_server_conn);
164 /*******************************************************************
165 Setup the word count and byte count for a smb message.
166 ********************************************************************/
168 int srv_set_message(char *buf,
173 if (zero && (num_words || num_bytes)) {
174 memset(buf + smb_size,'\0',num_words*2 + num_bytes);
176 SCVAL(buf,smb_wct,num_words);
177 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
178 smb_setlen(buf,(smb_size + num_words*2 + num_bytes - 4));
179 return (smb_size + num_words*2 + num_bytes);
182 static bool valid_smb_header(const uint8_t *inbuf)
184 if (is_encrypted_packet(inbuf)) {
188 * This used to be (strncmp(smb_base(inbuf),"\377SMB",4) == 0)
189 * but it just looks weird to call strncmp for this one.
191 return (IVAL(smb_base(inbuf), 0) == 0x424D53FF);
194 /* Socket functions for smbd packet processing. */
196 static bool valid_packet_size(size_t len)
199 * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
200 * of header. Don't print the error if this fits.... JRA.
203 if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
204 DEBUG(0,("Invalid packet length! (%lu bytes).\n",
205 (unsigned long)len));
211 static NTSTATUS read_packet_remainder(int fd, char *buffer,
212 unsigned int timeout, ssize_t len)
218 return read_fd_with_timeout(fd, buffer, len, len, timeout, NULL);
221 /****************************************************************************
222 Attempt a zerocopy writeX read. We know here that len > smb_size-4
223 ****************************************************************************/
226 * Unfortunately, earlier versions of smbclient/libsmbclient
227 * don't send this "standard" writeX header. I've fixed this
228 * for 3.2 but we'll use the old method with earlier versions.
229 * Windows and CIFSFS at least use this standard size. Not
233 #define STANDARD_WRITE_AND_X_HEADER_SIZE (smb_size - 4 + /* basic header */ \
234 (2*14) + /* word count (including bcc) */ \
237 static NTSTATUS receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
238 const char lenbuf[4],
239 int fd, char **buffer,
240 unsigned int timeout,
244 /* Size of a WRITEX call (+4 byte len). */
245 char writeX_header[4 + STANDARD_WRITE_AND_X_HEADER_SIZE];
246 ssize_t len = smb_len_large(lenbuf); /* Could be a UNIX large writeX. */
250 memcpy(writeX_header, lenbuf, 4);
252 status = read_fd_with_timeout(
253 fd, writeX_header + 4,
254 STANDARD_WRITE_AND_X_HEADER_SIZE,
255 STANDARD_WRITE_AND_X_HEADER_SIZE,
258 if (!NT_STATUS_IS_OK(status)) {
263 * Ok - now try and see if this is a possible
267 if (is_valid_writeX_buffer(smbd_server_conn,
268 (uint8_t *)writeX_header)) {
270 * If the data offset is beyond what
271 * we've read, drain the extra bytes.
273 uint16_t doff = SVAL(writeX_header,smb_vwv11);
276 if (doff > STANDARD_WRITE_AND_X_HEADER_SIZE) {
277 size_t drain = doff - STANDARD_WRITE_AND_X_HEADER_SIZE;
278 if (drain_socket(smbd_server_fd(), drain) != drain) {
279 smb_panic("receive_smb_raw_talloc_partial_read:"
280 " failed to drain pending bytes");
283 doff = STANDARD_WRITE_AND_X_HEADER_SIZE;
286 /* Spoof down the length and null out the bcc. */
287 set_message_bcc(writeX_header, 0);
288 newlen = smb_len(writeX_header);
290 /* Copy the header we've written. */
292 *buffer = (char *)TALLOC_MEMDUP(mem_ctx,
294 sizeof(writeX_header));
296 if (*buffer == NULL) {
297 DEBUG(0, ("Could not allocate inbuf of length %d\n",
298 (int)sizeof(writeX_header)));
299 return NT_STATUS_NO_MEMORY;
302 /* Work out the remaining bytes. */
303 *p_unread = len - STANDARD_WRITE_AND_X_HEADER_SIZE;
304 *len_ret = newlen + 4;
308 if (!valid_packet_size(len)) {
309 return NT_STATUS_INVALID_PARAMETER;
313 * Not a valid writeX call. Just do the standard
317 *buffer = TALLOC_ARRAY(mem_ctx, char, len+4);
319 if (*buffer == NULL) {
320 DEBUG(0, ("Could not allocate inbuf of length %d\n",
322 return NT_STATUS_NO_MEMORY;
325 /* Copy in what we already read. */
328 4 + STANDARD_WRITE_AND_X_HEADER_SIZE);
329 toread = len - STANDARD_WRITE_AND_X_HEADER_SIZE;
332 status = read_packet_remainder(
333 fd, (*buffer) + 4 + STANDARD_WRITE_AND_X_HEADER_SIZE,
336 if (!NT_STATUS_IS_OK(status)) {
337 DEBUG(10, ("receive_smb_raw_talloc_partial_read: %s\n",
347 static NTSTATUS receive_smb_raw_talloc(TALLOC_CTX *mem_ctx, int fd,
348 char **buffer, unsigned int timeout,
349 size_t *p_unread, size_t *plen)
353 int min_recv_size = lp_min_receive_file_size();
358 status = read_smb_length_return_keepalive(fd, lenbuf, timeout, &len);
359 if (!NT_STATUS_IS_OK(status)) {
360 DEBUG(10, ("receive_smb_raw: %s\n", nt_errstr(status)));
364 if (CVAL(lenbuf,0) == 0 && min_recv_size &&
365 (smb_len_large(lenbuf) > /* Could be a UNIX large writeX. */
366 (min_recv_size + STANDARD_WRITE_AND_X_HEADER_SIZE)) &&
367 !srv_is_signing_active(smbd_server_conn) &&
368 smbd_server_conn->smb1.echo_handler.trusted_fde == NULL) {
370 return receive_smb_raw_talloc_partial_read(
371 mem_ctx, lenbuf, fd, buffer, timeout, p_unread, plen);
374 if (!valid_packet_size(len)) {
375 return NT_STATUS_INVALID_PARAMETER;
379 * The +4 here can't wrap, we've checked the length above already.
382 *buffer = TALLOC_ARRAY(mem_ctx, char, len+4);
384 if (*buffer == NULL) {
385 DEBUG(0, ("Could not allocate inbuf of length %d\n",
387 return NT_STATUS_NO_MEMORY;
390 memcpy(*buffer, lenbuf, sizeof(lenbuf));
392 status = read_packet_remainder(fd, (*buffer)+4, timeout, len);
393 if (!NT_STATUS_IS_OK(status)) {
401 static NTSTATUS receive_smb_talloc(TALLOC_CTX *mem_ctx, int fd,
402 char **buffer, unsigned int timeout,
403 size_t *p_unread, bool *p_encrypted,
406 bool trusted_channel)
411 *p_encrypted = false;
413 status = receive_smb_raw_talloc(mem_ctx, fd, buffer, timeout,
415 if (!NT_STATUS_IS_OK(status)) {
419 if (is_encrypted_packet((uint8_t *)*buffer)) {
420 status = srv_decrypt_buffer(*buffer);
421 if (!NT_STATUS_IS_OK(status)) {
422 DEBUG(0, ("receive_smb_talloc: SMB decryption failed on "
423 "incoming packet! Error %s\n",
424 nt_errstr(status) ));
430 /* Check the incoming SMB signature. */
431 if (!srv_check_sign_mac(smbd_server_conn, *buffer, seqnum, trusted_channel)) {
432 DEBUG(0, ("receive_smb: SMB Signature verification failed on "
433 "incoming packet!\n"));
434 return NT_STATUS_INVALID_NETWORK_RESPONSE;
442 * Initialize a struct smb_request from an inbuf
445 static bool init_smb_request(struct smb_request *req,
446 struct smbd_server_connection *sconn,
448 size_t unread_bytes, bool encrypted,
451 size_t req_size = smb_len(inbuf) + 4;
452 /* Ensure we have at least smb_size bytes. */
453 if (req_size < smb_size) {
454 DEBUG(0,("init_smb_request: invalid request size %u\n",
455 (unsigned int)req_size ));
458 req->cmd = CVAL(inbuf, smb_com);
459 req->flags2 = SVAL(inbuf, smb_flg2);
460 req->smbpid = SVAL(inbuf, smb_pid);
461 req->mid = (uint64_t)SVAL(inbuf, smb_mid);
462 req->seqnum = seqnum;
463 req->vuid = SVAL(inbuf, smb_uid);
464 req->tid = SVAL(inbuf, smb_tid);
465 req->wct = CVAL(inbuf, smb_wct);
466 req->vwv = (uint16_t *)(inbuf+smb_vwv);
467 req->buflen = smb_buflen(inbuf);
468 req->buf = (const uint8_t *)smb_buf(inbuf);
469 req->unread_bytes = unread_bytes;
470 req->encrypted = encrypted;
472 req->conn = conn_find(sconn,req->tid);
473 req->chain_fsp = NULL;
474 req->chain_outbuf = NULL;
477 smb_init_perfcount_data(&req->pcd);
479 /* Ensure we have at least wct words and 2 bytes of bcc. */
480 if (smb_size + req->wct*2 > req_size) {
481 DEBUG(0,("init_smb_request: invalid wct number %u (size %u)\n",
482 (unsigned int)req->wct,
483 (unsigned int)req_size));
486 /* Ensure bcc is correct. */
487 if (((uint8 *)smb_buf(inbuf)) + req->buflen > inbuf + req_size) {
488 DEBUG(0,("init_smb_request: invalid bcc number %u "
489 "(wct = %u, size %u)\n",
490 (unsigned int)req->buflen,
491 (unsigned int)req->wct,
492 (unsigned int)req_size));
500 static void process_smb(struct smbd_server_connection *conn,
501 uint8_t *inbuf, size_t nread, size_t unread_bytes,
502 uint32_t seqnum, bool encrypted,
503 struct smb_perfcount_data *deferred_pcd);
505 static void smbd_deferred_open_timer(struct event_context *ev,
506 struct timed_event *te,
507 struct timeval _tval,
510 struct pending_message_list *msg = talloc_get_type(private_data,
511 struct pending_message_list);
512 TALLOC_CTX *mem_ctx = talloc_tos();
513 uint64_t mid = (uint64_t)SVAL(msg->buf.data,smb_mid);
516 inbuf = (uint8_t *)talloc_memdup(mem_ctx, msg->buf.data,
519 exit_server("smbd_deferred_open_timer: talloc failed\n");
523 /* We leave this message on the queue so the open code can
524 know this is a retry. */
525 DEBUG(5,("smbd_deferred_open_timer: trigger mid %llu.\n",
526 (unsigned long long)mid ));
528 /* Mark the message as processed so this is not
529 * re-processed in error. */
530 msg->processed = true;
532 process_smb(smbd_server_conn, inbuf,
534 msg->seqnum, msg->encrypted, &msg->pcd);
536 /* If it's still there and was processed, remove it. */
537 msg = get_deferred_open_message_smb(mid);
538 if (msg && msg->processed) {
539 remove_deferred_open_message_smb(mid);
543 /****************************************************************************
544 Function to push a message onto the tail of a linked list of smb messages ready
546 ****************************************************************************/
548 static bool push_queued_message(struct smb_request *req,
549 struct timeval request_time,
550 struct timeval end_time,
551 char *private_data, size_t private_len)
553 int msg_len = smb_len(req->inbuf) + 4;
554 struct pending_message_list *msg;
556 msg = TALLOC_ZERO_P(NULL, struct pending_message_list);
559 DEBUG(0,("push_message: malloc fail (1)\n"));
563 msg->buf = data_blob_talloc(msg, req->inbuf, msg_len);
564 if(msg->buf.data == NULL) {
565 DEBUG(0,("push_message: malloc fail (2)\n"));
570 msg->request_time = request_time;
571 msg->seqnum = req->seqnum;
572 msg->encrypted = req->encrypted;
573 msg->processed = false;
574 SMB_PERFCOUNT_DEFER_OP(&req->pcd, &msg->pcd);
577 msg->private_data = data_blob_talloc(msg, private_data,
579 if (msg->private_data.data == NULL) {
580 DEBUG(0,("push_message: malloc fail (3)\n"));
586 msg->te = event_add_timed(smbd_event_context(),
589 smbd_deferred_open_timer,
592 DEBUG(0,("push_message: event_add_timed failed\n"));
597 DLIST_ADD_END(deferred_open_queue, msg, struct pending_message_list *);
599 DEBUG(10,("push_message: pushed message length %u on "
600 "deferred_open_queue\n", (unsigned int)msg_len));
605 /****************************************************************************
606 Function to delete a sharing violation open message by mid.
607 ****************************************************************************/
609 void remove_deferred_open_message_smb(uint64_t mid)
611 struct pending_message_list *pml;
613 if (smbd_server_conn->using_smb2) {
614 remove_deferred_open_message_smb2(smbd_server_conn, mid);
618 for (pml = deferred_open_queue; pml; pml = pml->next) {
619 if (mid == (uint64_t)SVAL(pml->buf.data,smb_mid)) {
620 DEBUG(10,("remove_deferred_open_message_smb: "
621 "deleting mid %llu len %u\n",
622 (unsigned long long)mid,
623 (unsigned int)pml->buf.length ));
624 DLIST_REMOVE(deferred_open_queue, pml);
631 /****************************************************************************
632 Move a sharing violation open retry message to the front of the list and
633 schedule it for immediate processing.
634 ****************************************************************************/
636 void schedule_deferred_open_message_smb(uint64_t mid)
638 struct pending_message_list *pml;
641 if (smbd_server_conn->using_smb2) {
642 schedule_deferred_open_message_smb2(smbd_server_conn, mid);
646 for (pml = deferred_open_queue; pml; pml = pml->next) {
647 uint64_t msg_mid = (uint64_t)SVAL(pml->buf.data,smb_mid);
649 DEBUG(10,("schedule_deferred_open_message_smb: [%d] "
652 (unsigned long long)msg_mid ));
654 if (mid == msg_mid) {
655 struct timed_event *te;
657 if (pml->processed) {
658 /* A processed message should not be
660 DEBUG(0,("schedule_deferred_open_message_smb: LOGIC ERROR "
661 "message mid %llu was already processed\n",
662 (unsigned long long)msg_mid ));
666 DEBUG(10,("schedule_deferred_open_message_smb: "
667 "scheduling mid %llu\n",
668 (unsigned long long)mid ));
670 te = event_add_timed(smbd_event_context(),
673 smbd_deferred_open_timer,
676 DEBUG(10,("schedule_deferred_open_message_smb: "
677 "event_add_timed() failed, "
678 "skipping mid %llu\n",
679 (unsigned long long)msg_mid ));
682 TALLOC_FREE(pml->te);
684 DLIST_PROMOTE(deferred_open_queue, pml);
689 DEBUG(10,("schedule_deferred_open_message_smb: failed to "
690 "find message mid %llu\n",
691 (unsigned long long)mid ));
694 /****************************************************************************
695 Return true if this mid is on the deferred queue and was not yet processed.
696 ****************************************************************************/
698 bool open_was_deferred(uint64_t mid)
700 struct pending_message_list *pml;
702 if (smbd_server_conn->using_smb2) {
703 return open_was_deferred_smb2(smbd_server_conn, mid);
706 for (pml = deferred_open_queue; pml; pml = pml->next) {
707 if (((uint64_t)SVAL(pml->buf.data,smb_mid)) == mid && !pml->processed) {
714 /****************************************************************************
715 Return the message queued by this mid.
716 ****************************************************************************/
718 static struct pending_message_list *get_deferred_open_message_smb(uint64_t mid)
720 struct pending_message_list *pml;
722 for (pml = deferred_open_queue; pml; pml = pml->next) {
723 if (((uint64_t)SVAL(pml->buf.data,smb_mid)) == mid) {
730 /****************************************************************************
731 Get the state data queued by this mid.
732 ****************************************************************************/
734 bool get_deferred_open_message_state(struct smb_request *smbreq,
735 struct timeval *p_request_time,
738 struct pending_message_list *pml;
740 if (smbd_server_conn->using_smb2) {
741 return get_deferred_open_message_state_smb2(smbreq->smb2req,
746 pml = get_deferred_open_message_smb(smbreq->mid);
750 if (p_request_time) {
751 *p_request_time = pml->request_time;
754 *pp_state = (void *)pml->private_data.data;
759 /****************************************************************************
760 Function to push a deferred open smb message onto a linked list of local smb
761 messages ready for processing.
762 ****************************************************************************/
764 bool push_deferred_open_message_smb(struct smb_request *req,
765 struct timeval request_time,
766 struct timeval timeout,
768 char *private_data, size_t priv_len)
770 struct timeval end_time;
773 return push_deferred_open_message_smb2(req->smb2req,
781 if (req->unread_bytes) {
782 DEBUG(0,("push_deferred_open_message_smb: logic error ! "
783 "unread_bytes = %u\n",
784 (unsigned int)req->unread_bytes ));
785 smb_panic("push_deferred_open_message_smb: "
786 "logic error unread_bytes != 0" );
789 end_time = timeval_sum(&request_time, &timeout);
791 DEBUG(10,("push_deferred_open_message_smb: pushing message "
792 "len %u mid %llu timeout time [%u.%06u]\n",
793 (unsigned int) smb_len(req->inbuf)+4,
794 (unsigned long long)req->mid,
795 (unsigned int)end_time.tv_sec,
796 (unsigned int)end_time.tv_usec));
798 return push_queued_message(req, request_time, end_time,
799 private_data, priv_len);
803 struct timed_event *te;
804 struct timeval interval;
806 bool (*handler)(const struct timeval *now, void *private_data);
810 static void smbd_idle_event_handler(struct event_context *ctx,
811 struct timed_event *te,
815 struct idle_event *event =
816 talloc_get_type_abort(private_data, struct idle_event);
818 TALLOC_FREE(event->te);
820 DEBUG(10,("smbd_idle_event_handler: %s %p called\n",
821 event->name, event->te));
823 if (!event->handler(&now, event->private_data)) {
824 DEBUG(10,("smbd_idle_event_handler: %s %p stopped\n",
825 event->name, event->te));
826 /* Don't repeat, delete ourselves */
831 DEBUG(10,("smbd_idle_event_handler: %s %p rescheduled\n",
832 event->name, event->te));
834 event->te = event_add_timed(ctx, event,
835 timeval_sum(&now, &event->interval),
836 smbd_idle_event_handler, event);
838 /* We can't do much but fail here. */
839 SMB_ASSERT(event->te != NULL);
842 struct idle_event *event_add_idle(struct event_context *event_ctx,
844 struct timeval interval,
846 bool (*handler)(const struct timeval *now,
850 struct idle_event *result;
851 struct timeval now = timeval_current();
853 result = TALLOC_P(mem_ctx, struct idle_event);
854 if (result == NULL) {
855 DEBUG(0, ("talloc failed\n"));
859 result->interval = interval;
860 result->handler = handler;
861 result->private_data = private_data;
863 if (!(result->name = talloc_asprintf(result, "idle_evt(%s)", name))) {
864 DEBUG(0, ("talloc failed\n"));
869 result->te = event_add_timed(event_ctx, result,
870 timeval_sum(&now, &interval),
871 smbd_idle_event_handler, result);
872 if (result->te == NULL) {
873 DEBUG(0, ("event_add_timed failed\n"));
878 DEBUG(10,("event_add_idle: %s %p\n", result->name, result->te));
882 static void smbd_sig_term_handler(struct tevent_context *ev,
883 struct tevent_signal *se,
889 exit_server_cleanly("termination signal");
892 void smbd_setup_sig_term_handler(void)
894 struct tevent_signal *se;
896 se = tevent_add_signal(smbd_event_context(),
897 smbd_event_context(),
899 smbd_sig_term_handler,
902 exit_server("failed to setup SIGTERM handler");
906 static void smbd_sig_hup_handler(struct tevent_context *ev,
907 struct tevent_signal *se,
913 struct messaging_context *msg_ctx = talloc_get_type_abort(
914 private_data, struct messaging_context);
915 change_to_root_user();
916 DEBUG(1,("Reloading services after SIGHUP\n"));
917 reload_services(msg_ctx, False);
920 void smbd_setup_sig_hup_handler(void)
922 struct tevent_signal *se;
924 se = tevent_add_signal(smbd_event_context(),
925 smbd_event_context(),
927 smbd_sig_hup_handler,
928 smbd_messaging_context());
930 exit_server("failed to setup SIGHUP handler");
934 static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *conn)
941 to.tv_sec = SMBD_SELECT_TIMEOUT;
945 * Setup the select fd sets.
952 * Are there any timed events waiting ? If so, ensure we don't
953 * select for longer than it would take to wait for them.
960 event_add_to_select_args(smbd_event_context(), &now,
961 &r_fds, &w_fds, &to, &maxfd);
964 /* Process a signal and timed events now... */
965 if (run_events(smbd_event_context(), 0, NULL, NULL)) {
966 return NT_STATUS_RETRY;
971 START_PROFILE(smbd_idle);
973 selrtn = sys_select(maxfd+1,&r_fds,&w_fds,NULL,&to);
976 END_PROFILE(smbd_idle);
980 if ((conn->smb1.echo_handler.trusted_fd != -1)
981 && FD_ISSET(smbd_server_fd(), &r_fds)
982 && FD_ISSET(conn->smb1.echo_handler.trusted_fd, &r_fds)) {
984 * Prefer to read pending requests from the echo handler. To
985 * quote Jeremy (da70f8ab1): This is a hack of monstrous
988 FD_CLR(smbd_server_fd(), &r_fds);
991 if (run_events(smbd_event_context(), selrtn, &r_fds, &w_fds)) {
992 return NT_STATUS_RETRY;
997 /* something is wrong. Maybe the socket is dead? */
998 return map_nt_error_from_unix(errno);
1001 /* Did we timeout ? */
1003 return NT_STATUS_RETRY;
1006 /* should not be reached */
1007 return NT_STATUS_INTERNAL_ERROR;
1011 * Only allow 5 outstanding trans requests. We're allocating memory, so
1015 NTSTATUS allow_new_trans(struct trans_state *list, uint64_t mid)
1018 for (; list != NULL; list = list->next) {
1020 if (list->mid == mid) {
1021 return NT_STATUS_INVALID_PARAMETER;
1027 return NT_STATUS_INSUFFICIENT_RESOURCES;
1030 return NT_STATUS_OK;
1034 These flags determine some of the permissions required to do an operation
1036 Note that I don't set NEED_WRITE on some write operations because they
1037 are used by some brain-dead clients when printing, and I don't want to
1038 force write permissions on print services.
1040 #define AS_USER (1<<0)
1041 #define NEED_WRITE (1<<1) /* Must be paired with AS_USER */
1042 #define TIME_INIT (1<<2)
1043 #define CAN_IPC (1<<3) /* Must be paired with AS_USER */
1044 #define AS_GUEST (1<<5) /* Must *NOT* be paired with AS_USER */
1045 #define DO_CHDIR (1<<6)
1048 define a list of possible SMB messages and their corresponding
1049 functions. Any message that has a NULL function is unimplemented -
1050 please feel free to contribute implementations!
1052 static const struct smb_message_struct {
1054 void (*fn)(struct smb_request *req);
1056 } smb_messages[256] = {
1058 /* 0x00 */ { "SMBmkdir",reply_mkdir,AS_USER | NEED_WRITE},
1059 /* 0x01 */ { "SMBrmdir",reply_rmdir,AS_USER | NEED_WRITE},
1060 /* 0x02 */ { "SMBopen",reply_open,AS_USER },
1061 /* 0x03 */ { "SMBcreate",reply_mknew,AS_USER},
1062 /* 0x04 */ { "SMBclose",reply_close,AS_USER | CAN_IPC },
1063 /* 0x05 */ { "SMBflush",reply_flush,AS_USER},
1064 /* 0x06 */ { "SMBunlink",reply_unlink,AS_USER | NEED_WRITE },
1065 /* 0x07 */ { "SMBmv",reply_mv,AS_USER | NEED_WRITE },
1066 /* 0x08 */ { "SMBgetatr",reply_getatr,AS_USER},
1067 /* 0x09 */ { "SMBsetatr",reply_setatr,AS_USER | NEED_WRITE},
1068 /* 0x0a */ { "SMBread",reply_read,AS_USER},
1069 /* 0x0b */ { "SMBwrite",reply_write,AS_USER | CAN_IPC },
1070 /* 0x0c */ { "SMBlock",reply_lock,AS_USER},
1071 /* 0x0d */ { "SMBunlock",reply_unlock,AS_USER},
1072 /* 0x0e */ { "SMBctemp",reply_ctemp,AS_USER },
1073 /* 0x0f */ { "SMBmknew",reply_mknew,AS_USER},
1074 /* 0x10 */ { "SMBcheckpath",reply_checkpath,AS_USER},
1075 /* 0x11 */ { "SMBexit",reply_exit,DO_CHDIR},
1076 /* 0x12 */ { "SMBlseek",reply_lseek,AS_USER},
1077 /* 0x13 */ { "SMBlockread",reply_lockread,AS_USER},
1078 /* 0x14 */ { "SMBwriteunlock",reply_writeunlock,AS_USER},
1079 /* 0x15 */ { NULL, NULL, 0 },
1080 /* 0x16 */ { NULL, NULL, 0 },
1081 /* 0x17 */ { NULL, NULL, 0 },
1082 /* 0x18 */ { NULL, NULL, 0 },
1083 /* 0x19 */ { NULL, NULL, 0 },
1084 /* 0x1a */ { "SMBreadbraw",reply_readbraw,AS_USER},
1085 /* 0x1b */ { "SMBreadBmpx",reply_readbmpx,AS_USER},
1086 /* 0x1c */ { "SMBreadBs",reply_readbs,AS_USER },
1087 /* 0x1d */ { "SMBwritebraw",reply_writebraw,AS_USER},
1088 /* 0x1e */ { "SMBwriteBmpx",reply_writebmpx,AS_USER},
1089 /* 0x1f */ { "SMBwriteBs",reply_writebs,AS_USER},
1090 /* 0x20 */ { "SMBwritec", NULL,0},
1091 /* 0x21 */ { NULL, NULL, 0 },
1092 /* 0x22 */ { "SMBsetattrE",reply_setattrE,AS_USER | NEED_WRITE },
1093 /* 0x23 */ { "SMBgetattrE",reply_getattrE,AS_USER },
1094 /* 0x24 */ { "SMBlockingX",reply_lockingX,AS_USER },
1095 /* 0x25 */ { "SMBtrans",reply_trans,AS_USER | CAN_IPC },
1096 /* 0x26 */ { "SMBtranss",reply_transs,AS_USER | CAN_IPC},
1097 /* 0x27 */ { "SMBioctl",reply_ioctl,0},
1098 /* 0x28 */ { "SMBioctls", NULL,AS_USER},
1099 /* 0x29 */ { "SMBcopy",reply_copy,AS_USER | NEED_WRITE },
1100 /* 0x2a */ { "SMBmove", NULL,AS_USER | NEED_WRITE },
1101 /* 0x2b */ { "SMBecho",reply_echo,0},
1102 /* 0x2c */ { "SMBwriteclose",reply_writeclose,AS_USER},
1103 /* 0x2d */ { "SMBopenX",reply_open_and_X,AS_USER | CAN_IPC },
1104 /* 0x2e */ { "SMBreadX",reply_read_and_X,AS_USER | CAN_IPC },
1105 /* 0x2f */ { "SMBwriteX",reply_write_and_X,AS_USER | CAN_IPC },
1106 /* 0x30 */ { NULL, NULL, 0 },
1107 /* 0x31 */ { NULL, NULL, 0 },
1108 /* 0x32 */ { "SMBtrans2",reply_trans2, AS_USER | CAN_IPC },
1109 /* 0x33 */ { "SMBtranss2",reply_transs2, AS_USER | CAN_IPC },
1110 /* 0x34 */ { "SMBfindclose",reply_findclose,AS_USER},
1111 /* 0x35 */ { "SMBfindnclose",reply_findnclose,AS_USER},
1112 /* 0x36 */ { NULL, NULL, 0 },
1113 /* 0x37 */ { NULL, NULL, 0 },
1114 /* 0x38 */ { NULL, NULL, 0 },
1115 /* 0x39 */ { NULL, NULL, 0 },
1116 /* 0x3a */ { NULL, NULL, 0 },
1117 /* 0x3b */ { NULL, NULL, 0 },
1118 /* 0x3c */ { NULL, NULL, 0 },
1119 /* 0x3d */ { NULL, NULL, 0 },
1120 /* 0x3e */ { NULL, NULL, 0 },
1121 /* 0x3f */ { NULL, NULL, 0 },
1122 /* 0x40 */ { NULL, NULL, 0 },
1123 /* 0x41 */ { NULL, NULL, 0 },
1124 /* 0x42 */ { NULL, NULL, 0 },
1125 /* 0x43 */ { NULL, NULL, 0 },
1126 /* 0x44 */ { NULL, NULL, 0 },
1127 /* 0x45 */ { NULL, NULL, 0 },
1128 /* 0x46 */ { NULL, NULL, 0 },
1129 /* 0x47 */ { NULL, NULL, 0 },
1130 /* 0x48 */ { NULL, NULL, 0 },
1131 /* 0x49 */ { NULL, NULL, 0 },
1132 /* 0x4a */ { NULL, NULL, 0 },
1133 /* 0x4b */ { NULL, NULL, 0 },
1134 /* 0x4c */ { NULL, NULL, 0 },
1135 /* 0x4d */ { NULL, NULL, 0 },
1136 /* 0x4e */ { NULL, NULL, 0 },
1137 /* 0x4f */ { NULL, NULL, 0 },
1138 /* 0x50 */ { NULL, NULL, 0 },
1139 /* 0x51 */ { NULL, NULL, 0 },
1140 /* 0x52 */ { NULL, NULL, 0 },
1141 /* 0x53 */ { NULL, NULL, 0 },
1142 /* 0x54 */ { NULL, NULL, 0 },
1143 /* 0x55 */ { NULL, NULL, 0 },
1144 /* 0x56 */ { NULL, NULL, 0 },
1145 /* 0x57 */ { NULL, NULL, 0 },
1146 /* 0x58 */ { NULL, NULL, 0 },
1147 /* 0x59 */ { NULL, NULL, 0 },
1148 /* 0x5a */ { NULL, NULL, 0 },
1149 /* 0x5b */ { NULL, NULL, 0 },
1150 /* 0x5c */ { NULL, NULL, 0 },
1151 /* 0x5d */ { NULL, NULL, 0 },
1152 /* 0x5e */ { NULL, NULL, 0 },
1153 /* 0x5f */ { NULL, NULL, 0 },
1154 /* 0x60 */ { NULL, NULL, 0 },
1155 /* 0x61 */ { NULL, NULL, 0 },
1156 /* 0x62 */ { NULL, NULL, 0 },
1157 /* 0x63 */ { NULL, NULL, 0 },
1158 /* 0x64 */ { NULL, NULL, 0 },
1159 /* 0x65 */ { NULL, NULL, 0 },
1160 /* 0x66 */ { NULL, NULL, 0 },
1161 /* 0x67 */ { NULL, NULL, 0 },
1162 /* 0x68 */ { NULL, NULL, 0 },
1163 /* 0x69 */ { NULL, NULL, 0 },
1164 /* 0x6a */ { NULL, NULL, 0 },
1165 /* 0x6b */ { NULL, NULL, 0 },
1166 /* 0x6c */ { NULL, NULL, 0 },
1167 /* 0x6d */ { NULL, NULL, 0 },
1168 /* 0x6e */ { NULL, NULL, 0 },
1169 /* 0x6f */ { NULL, NULL, 0 },
1170 /* 0x70 */ { "SMBtcon",reply_tcon,0},
1171 /* 0x71 */ { "SMBtdis",reply_tdis,DO_CHDIR},
1172 /* 0x72 */ { "SMBnegprot",reply_negprot,0},
1173 /* 0x73 */ { "SMBsesssetupX",reply_sesssetup_and_X,0},
1174 /* 0x74 */ { "SMBulogoffX",reply_ulogoffX, 0}, /* ulogoff doesn't give a valid TID */
1175 /* 0x75 */ { "SMBtconX",reply_tcon_and_X,0},
1176 /* 0x76 */ { NULL, NULL, 0 },
1177 /* 0x77 */ { NULL, NULL, 0 },
1178 /* 0x78 */ { NULL, NULL, 0 },
1179 /* 0x79 */ { NULL, NULL, 0 },
1180 /* 0x7a */ { NULL, NULL, 0 },
1181 /* 0x7b */ { NULL, NULL, 0 },
1182 /* 0x7c */ { NULL, NULL, 0 },
1183 /* 0x7d */ { NULL, NULL, 0 },
1184 /* 0x7e */ { NULL, NULL, 0 },
1185 /* 0x7f */ { NULL, NULL, 0 },
1186 /* 0x80 */ { "SMBdskattr",reply_dskattr,AS_USER},
1187 /* 0x81 */ { "SMBsearch",reply_search,AS_USER},
1188 /* 0x82 */ { "SMBffirst",reply_search,AS_USER},
1189 /* 0x83 */ { "SMBfunique",reply_search,AS_USER},
1190 /* 0x84 */ { "SMBfclose",reply_fclose,AS_USER},
1191 /* 0x85 */ { NULL, NULL, 0 },
1192 /* 0x86 */ { NULL, NULL, 0 },
1193 /* 0x87 */ { NULL, NULL, 0 },
1194 /* 0x88 */ { NULL, NULL, 0 },
1195 /* 0x89 */ { NULL, NULL, 0 },
1196 /* 0x8a */ { NULL, NULL, 0 },
1197 /* 0x8b */ { NULL, NULL, 0 },
1198 /* 0x8c */ { NULL, NULL, 0 },
1199 /* 0x8d */ { NULL, NULL, 0 },
1200 /* 0x8e */ { NULL, NULL, 0 },
1201 /* 0x8f */ { NULL, NULL, 0 },
1202 /* 0x90 */ { NULL, NULL, 0 },
1203 /* 0x91 */ { NULL, NULL, 0 },
1204 /* 0x92 */ { NULL, NULL, 0 },
1205 /* 0x93 */ { NULL, NULL, 0 },
1206 /* 0x94 */ { NULL, NULL, 0 },
1207 /* 0x95 */ { NULL, NULL, 0 },
1208 /* 0x96 */ { NULL, NULL, 0 },
1209 /* 0x97 */ { NULL, NULL, 0 },
1210 /* 0x98 */ { NULL, NULL, 0 },
1211 /* 0x99 */ { NULL, NULL, 0 },
1212 /* 0x9a */ { NULL, NULL, 0 },
1213 /* 0x9b */ { NULL, NULL, 0 },
1214 /* 0x9c */ { NULL, NULL, 0 },
1215 /* 0x9d */ { NULL, NULL, 0 },
1216 /* 0x9e */ { NULL, NULL, 0 },
1217 /* 0x9f */ { NULL, NULL, 0 },
1218 /* 0xa0 */ { "SMBnttrans",reply_nttrans, AS_USER | CAN_IPC },
1219 /* 0xa1 */ { "SMBnttranss",reply_nttranss, AS_USER | CAN_IPC },
1220 /* 0xa2 */ { "SMBntcreateX",reply_ntcreate_and_X, AS_USER | CAN_IPC },
1221 /* 0xa3 */ { NULL, NULL, 0 },
1222 /* 0xa4 */ { "SMBntcancel",reply_ntcancel, 0 },
1223 /* 0xa5 */ { "SMBntrename",reply_ntrename, AS_USER | NEED_WRITE },
1224 /* 0xa6 */ { NULL, NULL, 0 },
1225 /* 0xa7 */ { NULL, NULL, 0 },
1226 /* 0xa8 */ { NULL, NULL, 0 },
1227 /* 0xa9 */ { NULL, NULL, 0 },
1228 /* 0xaa */ { NULL, NULL, 0 },
1229 /* 0xab */ { NULL, NULL, 0 },
1230 /* 0xac */ { NULL, NULL, 0 },
1231 /* 0xad */ { NULL, NULL, 0 },
1232 /* 0xae */ { NULL, NULL, 0 },
1233 /* 0xaf */ { NULL, NULL, 0 },
1234 /* 0xb0 */ { NULL, NULL, 0 },
1235 /* 0xb1 */ { NULL, NULL, 0 },
1236 /* 0xb2 */ { NULL, NULL, 0 },
1237 /* 0xb3 */ { NULL, NULL, 0 },
1238 /* 0xb4 */ { NULL, NULL, 0 },
1239 /* 0xb5 */ { NULL, NULL, 0 },
1240 /* 0xb6 */ { NULL, NULL, 0 },
1241 /* 0xb7 */ { NULL, NULL, 0 },
1242 /* 0xb8 */ { NULL, NULL, 0 },
1243 /* 0xb9 */ { NULL, NULL, 0 },
1244 /* 0xba */ { NULL, NULL, 0 },
1245 /* 0xbb */ { NULL, NULL, 0 },
1246 /* 0xbc */ { NULL, NULL, 0 },
1247 /* 0xbd */ { NULL, NULL, 0 },
1248 /* 0xbe */ { NULL, NULL, 0 },
1249 /* 0xbf */ { NULL, NULL, 0 },
1250 /* 0xc0 */ { "SMBsplopen",reply_printopen,AS_USER},
1251 /* 0xc1 */ { "SMBsplwr",reply_printwrite,AS_USER},
1252 /* 0xc2 */ { "SMBsplclose",reply_printclose,AS_USER},
1253 /* 0xc3 */ { "SMBsplretq",reply_printqueue,AS_USER},
1254 /* 0xc4 */ { NULL, NULL, 0 },
1255 /* 0xc5 */ { NULL, NULL, 0 },
1256 /* 0xc6 */ { NULL, NULL, 0 },
1257 /* 0xc7 */ { NULL, NULL, 0 },
1258 /* 0xc8 */ { NULL, NULL, 0 },
1259 /* 0xc9 */ { NULL, NULL, 0 },
1260 /* 0xca */ { NULL, NULL, 0 },
1261 /* 0xcb */ { NULL, NULL, 0 },
1262 /* 0xcc */ { NULL, NULL, 0 },
1263 /* 0xcd */ { NULL, NULL, 0 },
1264 /* 0xce */ { NULL, NULL, 0 },
1265 /* 0xcf */ { NULL, NULL, 0 },
1266 /* 0xd0 */ { "SMBsends",reply_sends,AS_GUEST},
1267 /* 0xd1 */ { "SMBsendb", NULL,AS_GUEST},
1268 /* 0xd2 */ { "SMBfwdname", NULL,AS_GUEST},
1269 /* 0xd3 */ { "SMBcancelf", NULL,AS_GUEST},
1270 /* 0xd4 */ { "SMBgetmac", NULL,AS_GUEST},
1271 /* 0xd5 */ { "SMBsendstrt",reply_sendstrt,AS_GUEST},
1272 /* 0xd6 */ { "SMBsendend",reply_sendend,AS_GUEST},
1273 /* 0xd7 */ { "SMBsendtxt",reply_sendtxt,AS_GUEST},
1274 /* 0xd8 */ { NULL, NULL, 0 },
1275 /* 0xd9 */ { NULL, NULL, 0 },
1276 /* 0xda */ { NULL, NULL, 0 },
1277 /* 0xdb */ { NULL, NULL, 0 },
1278 /* 0xdc */ { NULL, NULL, 0 },
1279 /* 0xdd */ { NULL, NULL, 0 },
1280 /* 0xde */ { NULL, NULL, 0 },
1281 /* 0xdf */ { NULL, NULL, 0 },
1282 /* 0xe0 */ { NULL, NULL, 0 },
1283 /* 0xe1 */ { NULL, NULL, 0 },
1284 /* 0xe2 */ { NULL, NULL, 0 },
1285 /* 0xe3 */ { NULL, NULL, 0 },
1286 /* 0xe4 */ { NULL, NULL, 0 },
1287 /* 0xe5 */ { NULL, NULL, 0 },
1288 /* 0xe6 */ { NULL, NULL, 0 },
1289 /* 0xe7 */ { NULL, NULL, 0 },
1290 /* 0xe8 */ { NULL, NULL, 0 },
1291 /* 0xe9 */ { NULL, NULL, 0 },
1292 /* 0xea */ { NULL, NULL, 0 },
1293 /* 0xeb */ { NULL, NULL, 0 },
1294 /* 0xec */ { NULL, NULL, 0 },
1295 /* 0xed */ { NULL, NULL, 0 },
1296 /* 0xee */ { NULL, NULL, 0 },
1297 /* 0xef */ { NULL, NULL, 0 },
1298 /* 0xf0 */ { NULL, NULL, 0 },
1299 /* 0xf1 */ { NULL, NULL, 0 },
1300 /* 0xf2 */ { NULL, NULL, 0 },
1301 /* 0xf3 */ { NULL, NULL, 0 },
1302 /* 0xf4 */ { NULL, NULL, 0 },
1303 /* 0xf5 */ { NULL, NULL, 0 },
1304 /* 0xf6 */ { NULL, NULL, 0 },
1305 /* 0xf7 */ { NULL, NULL, 0 },
1306 /* 0xf8 */ { NULL, NULL, 0 },
1307 /* 0xf9 */ { NULL, NULL, 0 },
1308 /* 0xfa */ { NULL, NULL, 0 },
1309 /* 0xfb */ { NULL, NULL, 0 },
1310 /* 0xfc */ { NULL, NULL, 0 },
1311 /* 0xfd */ { NULL, NULL, 0 },
1312 /* 0xfe */ { NULL, NULL, 0 },
1313 /* 0xff */ { NULL, NULL, 0 }
1317 /*******************************************************************
1318 allocate and initialize a reply packet
1319 ********************************************************************/
1321 static bool create_outbuf(TALLOC_CTX *mem_ctx, struct smb_request *req,
1322 const char *inbuf, char **outbuf, uint8_t num_words,
1326 * Protect against integer wrap
1328 if ((num_bytes > 0xffffff)
1329 || ((num_bytes + smb_size + num_words*2) > 0xffffff)) {
1331 if (asprintf(&msg, "num_bytes too large: %u",
1332 (unsigned)num_bytes) == -1) {
1333 msg = CONST_DISCARD(char *, "num_bytes too large");
1338 *outbuf = TALLOC_ARRAY(mem_ctx, char,
1339 smb_size + num_words*2 + num_bytes);
1340 if (*outbuf == NULL) {
1344 construct_reply_common(req, inbuf, *outbuf);
1345 srv_set_message(*outbuf, num_words, num_bytes, false);
1347 * Zero out the word area, the caller has to take care of the bcc area
1350 if (num_words != 0) {
1351 memset(*outbuf + smb_vwv0, 0, num_words*2);
1357 void reply_outbuf(struct smb_request *req, uint8 num_words, uint32 num_bytes)
1360 if (!create_outbuf(req, req, (char *)req->inbuf, &outbuf, num_words,
1362 smb_panic("could not allocate output buffer\n");
1364 req->outbuf = (uint8_t *)outbuf;
1368 /*******************************************************************
1369 Dump a packet to a file.
1370 ********************************************************************/
1372 static void smb_dump(const char *name, int type, const char *data, ssize_t len)
1376 if (DEBUGLEVEL < 50) {
1380 if (len < 4) len = smb_len(data)+4;
1381 for (i=1;i<100;i++) {
1382 if (asprintf(&fname, "/tmp/%s.%d.%s", name, i,
1383 type ? "req" : "resp") == -1) {
1386 fd = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0644);
1387 if (fd != -1 || errno != EEXIST) break;
1390 ssize_t ret = write(fd, data, len);
1392 DEBUG(0,("smb_dump: problem: write returned %d\n", (int)ret ));
1394 DEBUG(0,("created %s len %lu\n", fname, (unsigned long)len));
1399 /****************************************************************************
1400 Prepare everything for calling the actual request function, and potentially
1401 call the request function via the "new" interface.
1403 Return False if the "legacy" function needs to be called, everything is
1406 Return True if we're done.
1408 I know this API sucks, but it is the one with the least code change I could
1410 ****************************************************************************/
1412 static connection_struct *switch_message(uint8 type, struct smb_request *req, int size)
1416 connection_struct *conn = NULL;
1417 struct smbd_server_connection *sconn = req->sconn;
1421 /* Make sure this is an SMB packet. smb_size contains NetBIOS header
1422 * so subtract 4 from it. */
1423 if (!valid_smb_header(req->inbuf)
1424 || (size < (smb_size - 4))) {
1425 DEBUG(2,("Non-SMB packet of length %d. Terminating server\n",
1426 smb_len(req->inbuf)));
1427 exit_server_cleanly("Non-SMB packet");
1430 if (smb_messages[type].fn == NULL) {
1431 DEBUG(0,("Unknown message type %d!\n",type));
1432 smb_dump("Unknown", 1, (char *)req->inbuf, size);
1433 reply_unknown_new(req, type);
1437 flags = smb_messages[type].flags;
1439 /* In share mode security we must ignore the vuid. */
1440 session_tag = (lp_security() == SEC_SHARE)
1441 ? UID_FIELD_INVALID : req->vuid;
1444 DEBUG(3,("switch message %s (pid %d) conn 0x%lx\n", smb_fn_name(type),
1445 (int)sys_getpid(), (unsigned long)conn));
1447 smb_dump(smb_fn_name(type), 1, (char *)req->inbuf, size);
1449 /* Ensure this value is replaced in the incoming packet. */
1450 SSVAL(req->inbuf,smb_uid,session_tag);
1453 * Ensure the correct username is in current_user_info. This is a
1454 * really ugly bugfix for problems with multiple session_setup_and_X's
1455 * being done and allowing %U and %G substitutions to work correctly.
1456 * There is a reason this code is done here, don't move it unless you
1457 * know what you're doing... :-).
1461 if (session_tag != sconn->smb1.sessions.last_session_tag) {
1462 user_struct *vuser = NULL;
1464 sconn->smb1.sessions.last_session_tag = session_tag;
1465 if(session_tag != UID_FIELD_INVALID) {
1466 vuser = get_valid_user_struct(sconn, session_tag);
1468 set_current_user_info(
1469 vuser->server_info->sanitized_username,
1470 vuser->server_info->unix_name,
1471 vuser->server_info->info3->base.domain.string);
1476 /* Does this call need to be run as the connected user? */
1477 if (flags & AS_USER) {
1479 /* Does this call need a valid tree connection? */
1482 * Amazingly, the error code depends on the command
1485 if (type == SMBntcreateX) {
1486 reply_nterror(req, NT_STATUS_INVALID_HANDLE);
1488 reply_nterror(req, NT_STATUS_NETWORK_NAME_DELETED);
1493 if (!change_to_user(conn,session_tag)) {
1494 DEBUG(0, ("Error: Could not change to user. Removing "
1495 "deferred open, mid=%llu.\n",
1496 (unsigned long long)req->mid));
1497 reply_force_doserror(req, ERRSRV, ERRbaduid);
1501 /* All NEED_WRITE and CAN_IPC flags must also have AS_USER. */
1503 /* Does it need write permission? */
1504 if ((flags & NEED_WRITE) && !CAN_WRITE(conn)) {
1505 reply_nterror(req, NT_STATUS_MEDIA_WRITE_PROTECTED);
1509 /* IPC services are limited */
1510 if (IS_IPC(conn) && !(flags & CAN_IPC)) {
1511 reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1515 /* This call needs to be run as root */
1516 change_to_root_user();
1519 /* load service specific parameters */
1521 if (req->encrypted) {
1522 conn->encrypted_tid = true;
1523 /* encrypted required from now on. */
1524 conn->encrypt_level = Required;
1525 } else if (ENCRYPTION_REQUIRED(conn)) {
1526 if (req->cmd != SMBtrans2 && req->cmd != SMBtranss2) {
1527 exit_server_cleanly("encryption required "
1533 if (!set_current_service(conn,SVAL(req->inbuf,smb_flg),
1534 (flags & (AS_USER|DO_CHDIR)
1536 reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1539 conn->num_smb_operations++;
1542 /* does this protocol need to be run as guest? */
1543 if ((flags & AS_GUEST)
1544 && (!change_to_guest() ||
1545 !check_access(smbd_server_fd(), lp_hostsallow(-1),
1546 lp_hostsdeny(-1)))) {
1547 reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1551 smb_messages[type].fn(req);
1555 /****************************************************************************
1556 Construct a reply to the incoming packet.
1557 ****************************************************************************/
1559 static void construct_reply(char *inbuf, int size, size_t unread_bytes,
1560 uint32_t seqnum, bool encrypted,
1561 struct smb_perfcount_data *deferred_pcd)
1563 connection_struct *conn;
1564 struct smb_request *req;
1566 if (!(req = talloc(talloc_tos(), struct smb_request))) {
1567 smb_panic("could not allocate smb_request");
1570 if (!init_smb_request(req, smbd_server_conn, (uint8 *)inbuf,
1571 unread_bytes, encrypted, seqnum)) {
1572 exit_server_cleanly("Invalid SMB request");
1575 req->inbuf = (uint8_t *)talloc_move(req, &inbuf);
1577 /* we popped this message off the queue - keep original perf data */
1579 req->pcd = *deferred_pcd;
1581 SMB_PERFCOUNT_START(&req->pcd);
1582 SMB_PERFCOUNT_SET_OP(&req->pcd, req->cmd);
1583 SMB_PERFCOUNT_SET_MSGLEN_IN(&req->pcd, size);
1586 conn = switch_message(req->cmd, req, size);
1588 if (req->unread_bytes) {
1589 /* writeX failed. drain socket. */
1590 if (drain_socket(smbd_server_fd(), req->unread_bytes) !=
1591 req->unread_bytes) {
1592 smb_panic("failed to drain pending bytes");
1594 req->unread_bytes = 0;
1602 if (req->outbuf == NULL) {
1606 if (CVAL(req->outbuf,0) == 0) {
1607 show_msg((char *)req->outbuf);
1610 if (!srv_send_smb(smbd_server_fd(),
1611 (char *)req->outbuf,
1612 true, req->seqnum+1,
1613 IS_CONN_ENCRYPTED(conn)||req->encrypted,
1615 exit_server_cleanly("construct_reply: srv_send_smb failed.");
1623 /****************************************************************************
1624 Process an smb from the client
1625 ****************************************************************************/
1626 static void process_smb(struct smbd_server_connection *conn,
1627 uint8_t *inbuf, size_t nread, size_t unread_bytes,
1628 uint32_t seqnum, bool encrypted,
1629 struct smb_perfcount_data *deferred_pcd)
1631 int msg_type = CVAL(inbuf,0);
1633 DO_PROFILE_INC(smb_count);
1635 DEBUG( 6, ( "got message type 0x%x of len 0x%x\n", msg_type,
1637 DEBUG( 3, ( "Transaction %d of length %d (%u toread)\n", trans_num,
1639 (unsigned int)unread_bytes ));
1641 if (msg_type != 0) {
1643 * NetBIOS session request, keepalive, etc.
1645 reply_special(conn, (char *)inbuf);
1649 if (smbd_server_conn->using_smb2) {
1650 /* At this point we're not really using smb2,
1651 * we make the decision here.. */
1652 if (smbd_is_smb2_header(inbuf, nread)) {
1653 smbd_smb2_first_negprot(smbd_server_conn, inbuf, nread);
1655 } else if (nread >= smb_size && valid_smb_header(inbuf)
1656 && CVAL(inbuf, smb_com) != 0x72) {
1657 /* This is a non-negprot SMB1 packet.
1658 Disable SMB2 from now on. */
1659 smbd_server_conn->using_smb2 = false;
1663 show_msg((char *)inbuf);
1665 construct_reply((char *)inbuf,nread,unread_bytes,seqnum,encrypted,deferred_pcd);
1669 conn->smb1.num_requests++;
1671 /* The timeout_processing function isn't run nearly
1672 often enough to implement 'max log size' without
1673 overrunning the size of the file by many megabytes.
1674 This is especially true if we are running at debug
1675 level 10. Checking every 50 SMBs is a nice
1676 tradeoff of performance vs log file size overrun. */
1678 if ((conn->smb1.num_requests % 50) == 0 &&
1679 need_to_check_log_size()) {
1680 change_to_root_user();
1685 /****************************************************************************
1686 Return a string containing the function name of a SMB command.
1687 ****************************************************************************/
1689 const char *smb_fn_name(int type)
1691 const char *unknown_name = "SMBunknown";
1693 if (smb_messages[type].name == NULL)
1694 return(unknown_name);
1696 return(smb_messages[type].name);
1699 /****************************************************************************
1700 Helper functions for contruct_reply.
1701 ****************************************************************************/
1703 void add_to_common_flags2(uint32 v)
1708 void remove_from_common_flags2(uint32 v)
1710 common_flags2 &= ~v;
1713 static void construct_reply_common(struct smb_request *req, const char *inbuf,
1716 srv_set_message(outbuf,0,0,false);
1718 SCVAL(outbuf, smb_com, req->cmd);
1719 SIVAL(outbuf,smb_rcls,0);
1720 SCVAL(outbuf,smb_flg, FLAG_REPLY | (CVAL(inbuf,smb_flg) & FLAG_CASELESS_PATHNAMES));
1721 SSVAL(outbuf,smb_flg2,
1722 (SVAL(inbuf,smb_flg2) & FLAGS2_UNICODE_STRINGS) |
1724 memset(outbuf+smb_pidhigh,'\0',(smb_tid-smb_pidhigh));
1726 SSVAL(outbuf,smb_tid,SVAL(inbuf,smb_tid));
1727 SSVAL(outbuf,smb_pid,SVAL(inbuf,smb_pid));
1728 SSVAL(outbuf,smb_uid,SVAL(inbuf,smb_uid));
1729 SSVAL(outbuf,smb_mid,SVAL(inbuf,smb_mid));
1732 void construct_reply_common_req(struct smb_request *req, char *outbuf)
1734 construct_reply_common(req, (char *)req->inbuf, outbuf);
1738 * How many bytes have we already accumulated up to the current wct field
1742 size_t req_wct_ofs(struct smb_request *req)
1746 if (req->chain_outbuf == NULL) {
1749 buf_size = talloc_get_size(req->chain_outbuf);
1750 if ((buf_size % 4) != 0) {
1751 buf_size += (4 - (buf_size % 4));
1753 return buf_size - 4;
1757 * Hack around reply_nterror & friends not being aware of chained requests,
1758 * generating illegal (i.e. wct==0) chain replies.
1761 static void fixup_chain_error_packet(struct smb_request *req)
1763 uint8_t *outbuf = req->outbuf;
1765 reply_outbuf(req, 2, 0);
1766 memcpy(req->outbuf, outbuf, smb_wct);
1767 TALLOC_FREE(outbuf);
1768 SCVAL(req->outbuf, smb_vwv0, 0xff);
1772 * @brief Find the smb_cmd offset of the last command pushed
1773 * @param[in] buf The buffer we're building up
1774 * @retval Where can we put our next andx cmd?
1776 * While chaining requests, the "next" request we're looking at needs to put
1777 * its SMB_Command before the data the previous request already built up added
1778 * to the chain. Find the offset to the place where we have to put our cmd.
1781 static bool find_andx_cmd_ofs(uint8_t *buf, size_t *pofs)
1786 cmd = CVAL(buf, smb_com);
1788 SMB_ASSERT(is_andx_req(cmd));
1792 while (CVAL(buf, ofs) != 0xff) {
1794 if (!is_andx_req(CVAL(buf, ofs))) {
1799 * ofs is from start of smb header, so add the 4 length
1800 * bytes. The next cmd is right after the wct field.
1802 ofs = SVAL(buf, ofs+2) + 4 + 1;
1804 SMB_ASSERT(ofs+4 < talloc_get_size(buf));
1812 * @brief Do the smb chaining at a buffer level
1813 * @param[in] poutbuf Pointer to the talloc'ed buffer to be modified
1814 * @param[in] smb_command The command that we want to issue
1815 * @param[in] wct How many words?
1816 * @param[in] vwv The words, already in network order
1817 * @param[in] bytes_alignment How shall we align "bytes"?
1818 * @param[in] num_bytes How many bytes?
1819 * @param[in] bytes The data the request ships
1821 * smb_splice_chain() adds the vwv and bytes to the request already present in
1825 static bool smb_splice_chain(uint8_t **poutbuf, uint8_t smb_command,
1826 uint8_t wct, const uint16_t *vwv,
1827 size_t bytes_alignment,
1828 uint32_t num_bytes, const uint8_t *bytes)
1831 size_t old_size, new_size;
1833 size_t chain_padding = 0;
1834 size_t bytes_padding = 0;
1837 old_size = talloc_get_size(*poutbuf);
1840 * old_size == smb_wct means we're pushing the first request in for
1844 first_request = (old_size == smb_wct);
1846 if (!first_request && ((old_size % 4) != 0)) {
1848 * Align the wct field of subsequent requests to a 4-byte
1851 chain_padding = 4 - (old_size % 4);
1855 * After the old request comes the new wct field (1 byte), the vwv's
1856 * and the num_bytes field. After at we might need to align the bytes
1857 * given to us to "bytes_alignment", increasing the num_bytes value.
1860 new_size = old_size + chain_padding + 1 + wct * sizeof(uint16_t) + 2;
1862 if ((bytes_alignment != 0) && ((new_size % bytes_alignment) != 0)) {
1863 bytes_padding = bytes_alignment - (new_size % bytes_alignment);
1866 new_size += bytes_padding + num_bytes;
1868 if ((smb_command != SMBwriteX) && (new_size > 0xffff)) {
1869 DEBUG(1, ("splice_chain: %u bytes won't fit\n",
1870 (unsigned)new_size));
1874 outbuf = TALLOC_REALLOC_ARRAY(NULL, *poutbuf, uint8_t, new_size);
1875 if (outbuf == NULL) {
1876 DEBUG(0, ("talloc failed\n"));
1881 if (first_request) {
1882 SCVAL(outbuf, smb_com, smb_command);
1884 size_t andx_cmd_ofs;
1886 if (!find_andx_cmd_ofs(outbuf, &andx_cmd_ofs)) {
1887 DEBUG(1, ("invalid command chain\n"));
1888 *poutbuf = TALLOC_REALLOC_ARRAY(
1889 NULL, *poutbuf, uint8_t, old_size);
1893 if (chain_padding != 0) {
1894 memset(outbuf + old_size, 0, chain_padding);
1895 old_size += chain_padding;
1898 SCVAL(outbuf, andx_cmd_ofs, smb_command);
1899 SSVAL(outbuf, andx_cmd_ofs + 2, old_size - 4);
1905 * Push the chained request:
1910 SCVAL(outbuf, ofs, wct);
1917 memcpy(outbuf + ofs, vwv, sizeof(uint16_t) * wct);
1918 ofs += sizeof(uint16_t) * wct;
1924 SSVAL(outbuf, ofs, num_bytes + bytes_padding);
1925 ofs += sizeof(uint16_t);
1931 if (bytes_padding != 0) {
1932 memset(outbuf + ofs, 0, bytes_padding);
1933 ofs += bytes_padding;
1940 memcpy(outbuf + ofs, bytes, num_bytes);
1945 /****************************************************************************
1946 Construct a chained reply and add it to the already made reply
1947 ****************************************************************************/
1949 void chain_reply(struct smb_request *req)
1951 size_t smblen = smb_len(req->inbuf);
1952 size_t already_used, length_needed;
1954 uint32_t chain_offset; /* uint32_t to avoid overflow */
1961 if (IVAL(req->outbuf, smb_rcls) != 0) {
1962 fixup_chain_error_packet(req);
1966 * Any of the AndX requests and replies have at least a wct of
1967 * 2. vwv[0] is the next command, vwv[1] is the offset from the
1968 * beginning of the SMB header to the next wct field.
1970 * None of the AndX requests put anything valuable in vwv[0] and [1],
1971 * so we can overwrite it here to form the chain.
1974 if ((req->wct < 2) || (CVAL(req->outbuf, smb_wct) < 2)) {
1975 if (req->chain_outbuf == NULL) {
1976 req->chain_outbuf = TALLOC_REALLOC_ARRAY(
1977 req, req->outbuf, uint8_t,
1978 smb_len(req->outbuf) + 4);
1979 if (req->chain_outbuf == NULL) {
1980 smb_panic("talloc failed");
1988 * Here we assume that this is the end of the chain. For that we need
1989 * to set "next command" to 0xff and the offset to 0. If we later find
1990 * more commands in the chain, this will be overwritten again.
1993 SCVAL(req->outbuf, smb_vwv0, 0xff);
1994 SCVAL(req->outbuf, smb_vwv0+1, 0);
1995 SSVAL(req->outbuf, smb_vwv1, 0);
1997 if (req->chain_outbuf == NULL) {
1999 * In req->chain_outbuf we collect all the replies. Start the
2000 * chain by copying in the first reply.
2002 * We do the realloc because later on we depend on
2003 * talloc_get_size to determine the length of
2004 * chain_outbuf. The reply_xxx routines might have
2005 * over-allocated (reply_pipe_read_and_X used to be such an
2008 req->chain_outbuf = TALLOC_REALLOC_ARRAY(
2009 req, req->outbuf, uint8_t, smb_len(req->outbuf) + 4);
2010 if (req->chain_outbuf == NULL) {
2011 smb_panic("talloc failed");
2016 * Update smb headers where subsequent chained commands
2017 * may have updated them.
2019 SCVAL(req->chain_outbuf, smb_tid, CVAL(req->outbuf, smb_tid));
2020 SCVAL(req->chain_outbuf, smb_uid, CVAL(req->outbuf, smb_uid));
2022 if (!smb_splice_chain(&req->chain_outbuf,
2023 CVAL(req->outbuf, smb_com),
2024 CVAL(req->outbuf, smb_wct),
2025 (uint16_t *)(req->outbuf + smb_vwv),
2026 0, smb_buflen(req->outbuf),
2027 (uint8_t *)smb_buf(req->outbuf))) {
2030 TALLOC_FREE(req->outbuf);
2034 * We use the old request's vwv field to grab the next chained command
2035 * and offset into the chained fields.
2038 chain_cmd = CVAL(req->vwv+0, 0);
2039 chain_offset = SVAL(req->vwv+1, 0);
2041 if (chain_cmd == 0xff) {
2043 * End of chain, no more requests from the client. So ship the
2046 smb_setlen((char *)(req->chain_outbuf),
2047 talloc_get_size(req->chain_outbuf) - 4);
2049 if (!srv_send_smb(smbd_server_fd(), (char *)req->chain_outbuf,
2050 true, req->seqnum+1,
2051 IS_CONN_ENCRYPTED(req->conn)
2054 exit_server_cleanly("chain_reply: srv_send_smb "
2057 TALLOC_FREE(req->chain_outbuf);
2062 /* add a new perfcounter for this element of chain */
2063 SMB_PERFCOUNT_ADD(&req->pcd);
2064 SMB_PERFCOUNT_SET_OP(&req->pcd, chain_cmd);
2065 SMB_PERFCOUNT_SET_MSGLEN_IN(&req->pcd, smblen);
2068 * Check if the client tries to fool us. The request so far uses the
2069 * space to the end of the byte buffer in the request just
2070 * processed. The chain_offset can't point into that area. If that was
2071 * the case, we could end up with an endless processing of the chain,
2072 * we would always handle the same request.
2075 already_used = PTR_DIFF(req->buf+req->buflen, smb_base(req->inbuf));
2076 if (chain_offset < already_used) {
2081 * Next check: Make sure the chain offset does not point beyond the
2082 * overall smb request length.
2085 length_needed = chain_offset+1; /* wct */
2086 if (length_needed > smblen) {
2091 * Now comes the pointer magic. Goal here is to set up req->vwv and
2092 * req->buf correctly again to be able to call the subsequent
2093 * switch_message(). The chain offset (the former vwv[1]) points at
2094 * the new wct field.
2097 wct = CVAL(smb_base(req->inbuf), chain_offset);
2100 * Next consistency check: Make the new vwv array fits in the overall
2104 length_needed += (wct+1)*sizeof(uint16_t); /* vwv+buflen */
2105 if (length_needed > smblen) {
2108 vwv = (uint16_t *)(smb_base(req->inbuf) + chain_offset + 1);
2111 * Now grab the new byte buffer....
2114 buflen = SVAL(vwv+wct, 0);
2117 * .. and check that it fits.
2120 length_needed += buflen;
2121 if (length_needed > smblen) {
2124 buf = (uint8_t *)(vwv+wct+1);
2126 req->cmd = chain_cmd;
2129 req->buflen = buflen;
2132 switch_message(chain_cmd, req, smblen);
2134 if (req->outbuf == NULL) {
2136 * This happens if the chained command has suspended itself or
2137 * if it has called srv_send_smb() itself.
2143 * We end up here if the chained command was not itself chained or
2144 * suspended, but for example a close() command. We now need to splice
2145 * the chained commands' outbuf into the already built up chain_outbuf
2146 * and ship the result.
2152 * We end up here if there's any error in the chain syntax. Report a
2153 * DOS error, just like Windows does.
2155 reply_force_doserror(req, ERRSRV, ERRerror);
2156 fixup_chain_error_packet(req);
2160 * This scary statement intends to set the
2161 * FLAGS2_32_BIT_ERROR_CODES flg2 field in req->chain_outbuf
2162 * to the value req->outbuf carries
2164 SSVAL(req->chain_outbuf, smb_flg2,
2165 (SVAL(req->chain_outbuf, smb_flg2) & ~FLAGS2_32_BIT_ERROR_CODES)
2166 | (SVAL(req->outbuf, smb_flg2) & FLAGS2_32_BIT_ERROR_CODES));
2169 * Transfer the error codes from the subrequest to the main one
2171 SSVAL(req->chain_outbuf, smb_rcls, SVAL(req->outbuf, smb_rcls));
2172 SSVAL(req->chain_outbuf, smb_err, SVAL(req->outbuf, smb_err));
2174 if (!smb_splice_chain(&req->chain_outbuf,
2175 CVAL(req->outbuf, smb_com),
2176 CVAL(req->outbuf, smb_wct),
2177 (uint16_t *)(req->outbuf + smb_vwv),
2178 0, smb_buflen(req->outbuf),
2179 (uint8_t *)smb_buf(req->outbuf))) {
2180 exit_server_cleanly("chain_reply: smb_splice_chain failed\n");
2182 TALLOC_FREE(req->outbuf);
2184 smb_setlen((char *)(req->chain_outbuf),
2185 talloc_get_size(req->chain_outbuf) - 4);
2187 show_msg((char *)(req->chain_outbuf));
2189 if (!srv_send_smb(smbd_server_fd(), (char *)req->chain_outbuf,
2190 true, req->seqnum+1,
2191 IS_CONN_ENCRYPTED(req->conn)||req->encrypted,
2193 exit_server_cleanly("construct_reply: srv_send_smb failed.");
2195 TALLOC_FREE(req->chain_outbuf);
2199 /****************************************************************************
2200 Check if services need reloading.
2201 ****************************************************************************/
2203 void check_reload(time_t t)
2205 time_t printcap_cache_time = (time_t)lp_printcap_cache_time();
2207 if(last_smb_conf_reload_time == 0) {
2208 last_smb_conf_reload_time = t;
2209 /* Our printing subsystem might not be ready at smbd start up.
2210 Then no printer is available till the first printers check
2211 is performed. A lower initial interval circumvents this. */
2212 if ( printcap_cache_time > 60 )
2213 last_printer_reload_time = t - printcap_cache_time + 60;
2215 last_printer_reload_time = t;
2218 if (mypid != getpid()) { /* First time or fork happened meanwhile */
2219 /* randomize over 60 second the printcap reload to avoid all
2220 * process hitting cupsd at the same time */
2221 int time_range = 60;
2223 last_printer_reload_time += random() % time_range;
2227 if (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK) {
2228 reload_services(smbd_messaging_context(), True);
2229 last_smb_conf_reload_time = t;
2232 /* 'printcap cache time = 0' disable the feature */
2234 if ( printcap_cache_time != 0 )
2236 /* see if it's time to reload or if the clock has been set back */
2238 if ( (t >= last_printer_reload_time+printcap_cache_time)
2239 || (t-last_printer_reload_time < 0) )
2241 DEBUG( 3,( "Printcap cache time expired.\n"));
2242 reload_printers(smbd_messaging_context());
2243 last_printer_reload_time = t;
2248 static bool fd_is_readable(int fd)
2251 struct timeval timeout = {0, };
2257 ret = sys_select(fd+1, &fds, NULL, NULL, &timeout);
2261 return FD_ISSET(fd, &fds);
2264 static void smbd_server_connection_write_handler(struct smbd_server_connection *conn)
2266 /* TODO: make write nonblocking */
2269 static void smbd_server_connection_read_handler(
2270 struct smbd_server_connection *conn, int fd)
2272 uint8_t *inbuf = NULL;
2273 size_t inbuf_len = 0;
2274 size_t unread_bytes = 0;
2275 bool encrypted = false;
2276 TALLOC_CTX *mem_ctx = talloc_tos();
2280 bool from_client = (smbd_server_fd() == fd)?true:false;
2283 smbd_lock_socket(conn);
2285 if (!fd_is_readable(smbd_server_fd())) {
2286 DEBUG(10,("the echo listener was faster\n"));
2287 smbd_unlock_socket(conn);
2291 /* TODO: make this completely nonblocking */
2292 status = receive_smb_talloc(mem_ctx, fd,
2293 (char **)(void *)&inbuf,
2297 &inbuf_len, &seqnum,
2298 false /* trusted channel */);
2299 smbd_unlock_socket(conn);
2301 /* TODO: make this completely nonblocking */
2302 status = receive_smb_talloc(mem_ctx, fd,
2303 (char **)(void *)&inbuf,
2307 &inbuf_len, &seqnum,
2308 true /* trusted channel */);
2311 if (NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
2314 if (NT_STATUS_IS_ERR(status)) {
2315 exit_server_cleanly("failed to receive smb request");
2317 if (!NT_STATUS_IS_OK(status)) {
2322 process_smb(conn, inbuf, inbuf_len, unread_bytes,
2323 seqnum, encrypted, NULL);
2326 static void smbd_server_connection_handler(struct event_context *ev,
2327 struct fd_event *fde,
2331 struct smbd_server_connection *conn = talloc_get_type(private_data,
2332 struct smbd_server_connection);
2334 if (flags & EVENT_FD_WRITE) {
2335 smbd_server_connection_write_handler(conn);
2336 } else if (flags & EVENT_FD_READ) {
2337 smbd_server_connection_read_handler(conn, smbd_server_fd());
2341 static void smbd_server_echo_handler(struct event_context *ev,
2342 struct fd_event *fde,
2346 struct smbd_server_connection *conn = talloc_get_type(private_data,
2347 struct smbd_server_connection);
2349 if (flags & EVENT_FD_WRITE) {
2350 smbd_server_connection_write_handler(conn);
2351 } else if (flags & EVENT_FD_READ) {
2352 smbd_server_connection_read_handler(
2353 conn, conn->smb1.echo_handler.trusted_fd);
2357 /****************************************************************************
2358 received when we should release a specific IP
2359 ****************************************************************************/
2360 static void release_ip(const char *ip, void *priv)
2362 char addr[INET6_ADDRSTRLEN];
2365 client_socket_addr(get_client_fd(),addr,sizeof(addr));
2367 if (strncmp("::ffff:", addr, 7) == 0) {
2371 if ((strcmp(p, ip) == 0) || ((p != addr) && strcmp(addr, ip) == 0)) {
2372 /* we can't afford to do a clean exit - that involves
2373 database writes, which would potentially mean we
2374 are still running after the failover has finished -
2375 we have to get rid of this process ID straight
2377 DEBUG(0,("Got release IP message for our IP %s - exiting immediately\n",
2379 /* note we must exit with non-zero status so the unclean handler gets
2380 called in the parent, so that the brl database is tickled */
2385 static void msg_release_ip(struct messaging_context *msg_ctx, void *private_data,
2386 uint32_t msg_type, struct server_id server_id, DATA_BLOB *data)
2388 release_ip((char *)data->data, NULL);
2391 #ifdef CLUSTER_SUPPORT
2392 static int client_get_tcp_info(struct sockaddr_storage *server,
2393 struct sockaddr_storage *client)
2396 if (server_fd == -1) {
2399 length = sizeof(*server);
2400 if (getsockname(server_fd, (struct sockaddr *)server, &length) != 0) {
2403 length = sizeof(*client);
2404 if (getpeername(server_fd, (struct sockaddr *)client, &length) != 0) {
2412 * Send keepalive packets to our client
2414 static bool keepalive_fn(const struct timeval *now, void *private_data)
2416 struct smbd_server_connection *sconn = smbd_server_conn;
2419 if (sconn->using_smb2) {
2420 /* Don't do keepalives on an SMB2 connection. */
2424 smbd_lock_socket(smbd_server_conn);
2425 ret = send_keepalive(smbd_server_fd());
2426 smbd_unlock_socket(smbd_server_conn);
2429 DEBUG( 2, ( "Keepalive failed - exiting.\n" ) );
2436 * Do the recurring check if we're idle
2438 static bool deadtime_fn(const struct timeval *now, void *private_data)
2440 struct smbd_server_connection *sconn =
2441 (struct smbd_server_connection *)private_data;
2443 if (sconn->using_smb2) {
2444 /* TODO: implement real idle check */
2445 if (sconn->smb2.sessions.list) {
2448 DEBUG( 2, ( "Closing idle SMB2 connection\n" ) );
2449 messaging_send(sconn->msg_ctx, procid_self(),
2450 MSG_SHUTDOWN, &data_blob_null);
2454 if ((conn_num_open(sconn) == 0)
2455 || (conn_idle_all(sconn, now->tv_sec))) {
2456 DEBUG( 2, ( "Closing idle SMB1 connection\n" ) );
2457 messaging_send(sconn->msg_ctx, procid_self(),
2458 MSG_SHUTDOWN, &data_blob_null);
2466 * Do the recurring log file and smb.conf reload checks.
2469 static bool housekeeping_fn(const struct timeval *now, void *private_data)
2471 change_to_root_user();
2473 /* update printer queue caches if necessary */
2474 update_monitored_printq_cache();
2476 /* check if we need to reload services */
2477 check_reload(time(NULL));
2479 /* Change machine password if neccessary. */
2480 attempt_machine_password_change();
2483 * Force a log file check.
2485 force_check_log_size();
2490 static int create_unlink_tmp(const char *dir)
2495 fname = talloc_asprintf(talloc_tos(), "%s/listenerlock_XXXXXX", dir);
2496 if (fname == NULL) {
2500 fd = mkstemp(fname);
2505 if (unlink(fname) == -1) {
2506 int sys_errno = errno;
2516 struct smbd_echo_state {
2517 struct tevent_context *ev;
2518 struct iovec *pending;
2519 struct smbd_server_connection *sconn;
2522 struct tevent_fd *parent_fde;
2524 struct tevent_fd *read_fde;
2525 struct tevent_req *write_req;
2528 static void smbd_echo_writer_done(struct tevent_req *req);
2530 static void smbd_echo_activate_writer(struct smbd_echo_state *state)
2534 if (state->write_req != NULL) {
2538 num_pending = talloc_array_length(state->pending);
2539 if (num_pending == 0) {
2543 state->write_req = writev_send(state, state->ev, NULL,
2544 state->parent_pipe, false,
2545 state->pending, num_pending);
2546 if (state->write_req == NULL) {
2547 DEBUG(1, ("writev_send failed\n"));
2551 talloc_steal(state->write_req, state->pending);
2552 state->pending = NULL;
2554 tevent_req_set_callback(state->write_req, smbd_echo_writer_done,
2558 static void smbd_echo_writer_done(struct tevent_req *req)
2560 struct smbd_echo_state *state = tevent_req_callback_data(
2561 req, struct smbd_echo_state);
2565 written = writev_recv(req, &err);
2567 state->write_req = NULL;
2568 if (written == -1) {
2569 DEBUG(1, ("writev to parent failed: %s\n", strerror(err)));
2572 DEBUG(10,("echo_handler[%d]: forwarded pdu to main\n", (int)sys_getpid()));
2573 smbd_echo_activate_writer(state);
2576 static bool smbd_echo_reply(int fd,
2577 uint8_t *inbuf, size_t inbuf_len,
2580 struct smb_request req;
2581 uint16_t num_replies;
2586 if (inbuf_len < smb_size) {
2587 DEBUG(10, ("Got short packet: %d bytes\n", (int)inbuf_len));
2590 if (!valid_smb_header(inbuf)) {
2591 DEBUG(10, ("Got invalid SMB header\n"));
2595 if (!init_smb_request(&req, smbd_server_conn, inbuf, 0, false,
2601 DEBUG(10, ("smbecho handler got cmd %d (%s)\n", (int)req.cmd,
2602 smb_messages[req.cmd].name
2603 ? smb_messages[req.cmd].name : "unknown"));
2605 if (req.cmd != SMBecho) {
2612 num_replies = SVAL(req.vwv+0, 0);
2613 if (num_replies != 1) {
2614 /* Not a Windows "Hey, you're still there?" request */
2618 if (!create_outbuf(talloc_tos(), &req, (char *)req.inbuf, &outbuf,
2620 DEBUG(10, ("create_outbuf failed\n"));
2623 req.outbuf = (uint8_t *)outbuf;
2625 SSVAL(req.outbuf, smb_vwv0, num_replies);
2627 if (req.buflen > 0) {
2628 memcpy(smb_buf(req.outbuf), req.buf, req.buflen);
2631 out_len = smb_len(req.outbuf) + 4;
2633 ok = srv_send_smb(smbd_server_fd(),
2637 TALLOC_FREE(outbuf);
2645 static void smbd_echo_exit(struct tevent_context *ev,
2646 struct tevent_fd *fde, uint16_t flags,
2649 DEBUG(2, ("smbd_echo_exit: lost connection to parent\n"));
2653 static void smbd_echo_reader(struct tevent_context *ev,
2654 struct tevent_fd *fde, uint16_t flags,
2657 struct smbd_echo_state *state = talloc_get_type_abort(
2658 private_data, struct smbd_echo_state);
2659 struct smbd_server_connection *sconn = state->sconn;
2660 size_t unread, num_pending;
2663 uint32_t seqnum = 0;
2666 bool encrypted = false;
2668 ok = smbd_lock_socket_internal(sconn);
2670 DEBUG(0, ("%s: failed to lock socket\n",
2675 if (!fd_is_readable(smbd_server_fd())) {
2676 DEBUG(10,("echo_handler[%d] the parent smbd was faster\n",
2677 (int)sys_getpid()));
2678 ok = smbd_unlock_socket_internal(sconn);
2680 DEBUG(1, ("%s: failed to unlock socket in\n",
2687 num_pending = talloc_array_length(state->pending);
2688 tmp = talloc_realloc(state, state->pending, struct iovec,
2691 DEBUG(1, ("talloc_realloc failed\n"));
2694 state->pending = tmp;
2696 DEBUG(10,("echo_handler[%d]: reading pdu\n", (int)sys_getpid()));
2698 status = receive_smb_talloc(state->pending, smbd_server_fd(),
2699 (char **)(void *)&state->pending[num_pending].iov_base,
2703 &state->pending[num_pending].iov_len,
2705 false /* trusted_channel*/);
2706 if (!NT_STATUS_IS_OK(status)) {
2707 DEBUG(1, ("echo_handler[%d]: receive_smb_raw_talloc failed: %s\n",
2708 (int)sys_getpid(), nt_errstr(status)));
2712 ok = smbd_unlock_socket_internal(sconn);
2714 DEBUG(1, ("%s: failed to unlock socket in\n",
2720 * place the seqnum in the packet so that the main process can reply
2723 SIVAL((uint8_t *)state->pending[num_pending].iov_base, smb_ss_field, seqnum);
2724 SIVAL((uint8_t *)state->pending[num_pending].iov_base, smb_ss_field+4, NT_STATUS_V(NT_STATUS_OK));
2726 reply = smbd_echo_reply(smbd_server_fd(),
2727 (uint8_t *)state->pending[num_pending].iov_base,
2728 state->pending[num_pending].iov_len,
2731 DEBUG(10,("echo_handler[%d]: replied to client\n", (int)sys_getpid()));
2732 /* no check, shrinking by some bytes does not fail */
2733 state->pending = talloc_realloc(state, state->pending,
2737 DEBUG(10,("echo_handler[%d]: forward to main\n", (int)sys_getpid()));
2738 smbd_echo_activate_writer(state);
2742 static void smbd_echo_loop(struct smbd_server_connection *sconn,
2745 struct smbd_echo_state *state;
2747 state = talloc_zero(sconn, struct smbd_echo_state);
2748 if (state == NULL) {
2749 DEBUG(1, ("talloc failed\n"));
2752 state->sconn = sconn;
2753 state->parent_pipe = parent_pipe;
2754 state->ev = s3_tevent_context_init(state);
2755 if (state->ev == NULL) {
2756 DEBUG(1, ("tevent_context_init failed\n"));
2760 state->parent_fde = tevent_add_fd(state->ev, state, parent_pipe,
2761 TEVENT_FD_READ, smbd_echo_exit,
2763 if (state->parent_fde == NULL) {
2764 DEBUG(1, ("tevent_add_fd failed\n"));
2768 state->read_fde = tevent_add_fd(state->ev, state, smbd_server_fd(),
2769 TEVENT_FD_READ, smbd_echo_reader,
2771 if (state->read_fde == NULL) {
2772 DEBUG(1, ("tevent_add_fd failed\n"));
2778 if (tevent_loop_once(state->ev) == -1) {
2779 DEBUG(1, ("tevent_loop_once failed: %s\n",
2788 * Handle SMBecho requests in a forked child process
2790 static bool fork_echo_handler(struct smbd_server_connection *sconn)
2792 int listener_pipe[2];
2796 res = pipe(listener_pipe);
2798 DEBUG(1, ("pipe() failed: %s\n", strerror(errno)));
2801 sconn->smb1.echo_handler.socket_lock_fd = create_unlink_tmp(lp_lockdir());
2802 if (sconn->smb1.echo_handler.socket_lock_fd == -1) {
2803 DEBUG(1, ("Could not create lock fd: %s\n", strerror(errno)));
2811 close(listener_pipe[0]);
2813 status = reinit_after_fork(sconn->msg_ctx,
2814 smbd_event_context(),
2815 procid_self(), false);
2816 if (!NT_STATUS_IS_OK(status)) {
2817 DEBUG(1, ("reinit_after_fork failed: %s\n",
2818 nt_errstr(status)));
2821 smbd_echo_loop(sconn, listener_pipe[1]);
2824 close(listener_pipe[1]);
2825 listener_pipe[1] = -1;
2826 sconn->smb1.echo_handler.trusted_fd = listener_pipe[0];
2828 DEBUG(10,("fork_echo_handler: main[%d] echo_child[%d]\n", (int)sys_getpid(), child));
2831 * Without smb signing this is the same as the normal smbd
2832 * listener. This needs to change once signing comes in.
2834 sconn->smb1.echo_handler.trusted_fde = event_add_fd(smbd_event_context(),
2836 sconn->smb1.echo_handler.trusted_fd,
2838 smbd_server_echo_handler,
2840 if (sconn->smb1.echo_handler.trusted_fde == NULL) {
2841 DEBUG(1, ("event_add_fd failed\n"));
2848 if (listener_pipe[0] != -1) {
2849 close(listener_pipe[0]);
2851 if (listener_pipe[1] != -1) {
2852 close(listener_pipe[1]);
2854 sconn->smb1.echo_handler.trusted_fd = -1;
2855 if (sconn->smb1.echo_handler.socket_lock_fd != -1) {
2856 close(sconn->smb1.echo_handler.socket_lock_fd);
2858 sconn->smb1.echo_handler.trusted_fd = -1;
2859 sconn->smb1.echo_handler.socket_lock_fd = -1;
2863 static bool spoolss_init_cb(void *ptr)
2865 return nt_printing_tdb_migrate(smbd_messaging_context());
2868 /****************************************************************************
2869 Process commands from the client
2870 ****************************************************************************/
2872 void smbd_process(void)
2874 TALLOC_CTX *frame = talloc_stackframe();
2875 struct sockaddr_storage ss;
2876 struct sockaddr *sa = NULL;
2878 struct tsocket_address *local_address = NULL;
2879 struct tsocket_address *remote_address = NULL;
2880 const char *remaddr = NULL;
2882 struct rpc_srv_callbacks spoolss_cb;
2884 if (lp_maxprotocol() == PROTOCOL_SMB2 &&
2885 lp_security() != SEC_SHARE &&
2886 !lp_async_smb_echo_handler()) {
2888 * We're not making the desion here,
2889 * we're just allowing the client
2890 * to decide between SMB1 and SMB2
2891 * with the first negprot
2894 smbd_server_conn->using_smb2 = true;
2897 /* Ensure child is set to blocking mode */
2898 set_blocking(smbd_server_fd(),True);
2900 set_socket_options(smbd_server_fd(),"SO_KEEPALIVE");
2901 set_socket_options(smbd_server_fd(), lp_socket_options());
2903 sa = (struct sockaddr *)(void *)&ss;
2904 sa_len = sizeof(ss);
2905 ret = getpeername(smbd_server_fd(), sa, &sa_len);
2907 int level = (errno == ENOTCONN)?2:0;
2908 DEBUG(level,("getpeername() failed - %s\n", strerror(errno)));
2909 exit_server_cleanly("getpeername() failed.\n");
2911 ret = tsocket_address_bsd_from_sockaddr(smbd_server_conn,
2915 DEBUG(0,("%s: tsocket_address_bsd_from_sockaddr remote failed - %s\n",
2916 __location__, strerror(errno)));
2917 exit_server_cleanly("tsocket_address_bsd_from_sockaddr remote failed.\n");
2920 sa = (struct sockaddr *)(void *)&ss;
2921 sa_len = sizeof(ss);
2922 ret = getsockname(smbd_server_fd(), sa, &sa_len);
2924 int level = (errno == ENOTCONN)?2:0;
2925 DEBUG(level,("getsockname() failed - %s\n", strerror(errno)));
2926 exit_server_cleanly("getsockname() failed.\n");
2928 ret = tsocket_address_bsd_from_sockaddr(smbd_server_conn,
2932 DEBUG(0,("%s: tsocket_address_bsd_from_sockaddr remote failed - %s\n",
2933 __location__, strerror(errno)));
2934 exit_server_cleanly("tsocket_address_bsd_from_sockaddr remote failed.\n");
2937 smbd_server_conn->local_address = local_address;
2938 smbd_server_conn->remote_address = remote_address;
2940 if (tsocket_address_is_inet(remote_address, "ip")) {
2941 remaddr = tsocket_address_inet_addr_string(
2942 smbd_server_conn->remote_address,
2944 if (remaddr == NULL) {
2948 remaddr = "0.0.0.0";
2951 /* this is needed so that we get decent entries
2952 in smbstatus for port 445 connects */
2953 set_remote_machine_name(remaddr, false);
2954 reload_services(smbd_server_conn->msg_ctx, true);
2957 * Before the first packet, check the global hosts allow/ hosts deny
2958 * parameters before doing any parsing of packets passed to us by the
2959 * client. This prevents attacks on our parsing code from hosts not in
2960 * the hosts allow list.
2963 if (!check_access(smbd_server_fd(), lp_hostsallow(-1),
2964 lp_hostsdeny(-1))) {
2966 * send a negative session response "not listening on calling
2969 unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
2970 DEBUG( 1, ("Connection denied from %s to %s\n",
2971 tsocket_address_string(remote_address, talloc_tos()),
2972 tsocket_address_string(local_address, talloc_tos())));
2973 (void)srv_send_smb(smbd_server_fd(),(char *)buf, false,
2975 exit_server_cleanly("connection denied");
2978 DEBUG(10, ("Connection allowed from %s to %s\n",
2979 tsocket_address_string(remote_address, talloc_tos()),
2980 tsocket_address_string(local_address, talloc_tos())));
2984 smb_perfcount_init();
2986 if (!init_account_policy()) {
2987 exit_server("Could not open account policy tdb.\n");
2990 if (*lp_rootdir()) {
2991 if (chroot(lp_rootdir()) != 0) {
2992 DEBUG(0,("Failed to change root to %s\n", lp_rootdir()));
2993 exit_server("Failed to chroot()");
2995 if (chdir("/") == -1) {
2996 DEBUG(0,("Failed to chdir to / on chroot to %s\n", lp_rootdir()));
2997 exit_server("Failed to chroot()");
2999 DEBUG(0,("Changed root to %s\n", lp_rootdir()));
3002 if (!srv_init_signing(smbd_server_conn)) {
3003 exit_server("Failed to init smb_signing");
3006 if (lp_async_smb_echo_handler() && !fork_echo_handler(smbd_server_conn)) {
3007 exit_server("Failed to fork echo handler");
3011 if (!init_oplocks(smbd_messaging_context()))
3012 exit_server("Failed to init oplocks");
3014 /* register our message handlers */
3015 messaging_register(smbd_messaging_context(), NULL,
3016 MSG_SMB_FORCE_TDIS, msg_force_tdis);
3017 messaging_register(smbd_messaging_context(), NULL,
3018 MSG_SMB_RELEASE_IP, msg_release_ip);
3019 messaging_register(smbd_messaging_context(), NULL,
3020 MSG_SMB_CLOSE_FILE, msg_close_file);
3023 * Use the default MSG_DEBUG handler to avoid rebroadcasting
3024 * MSGs to all child processes
3026 messaging_deregister(smbd_messaging_context(),
3028 messaging_register(smbd_messaging_context(), NULL,
3029 MSG_DEBUG, debug_message);
3031 if ((lp_keepalive() != 0)
3032 && !(event_add_idle(smbd_event_context(), NULL,
3033 timeval_set(lp_keepalive(), 0),
3034 "keepalive", keepalive_fn,
3036 DEBUG(0, ("Could not add keepalive event\n"));
3040 if (!(event_add_idle(smbd_event_context(), NULL,
3041 timeval_set(IDLE_CLOSED_TIMEOUT, 0),
3042 "deadtime", deadtime_fn, smbd_server_conn))) {
3043 DEBUG(0, ("Could not add deadtime event\n"));
3047 if (!(event_add_idle(smbd_event_context(), NULL,
3048 timeval_set(SMBD_SELECT_TIMEOUT, 0),
3049 "housekeeping", housekeeping_fn, NULL))) {
3050 DEBUG(0, ("Could not add housekeeping event\n"));
3054 #ifdef CLUSTER_SUPPORT
3056 if (lp_clustering()) {
3058 * We need to tell ctdb about our client's TCP
3059 * connection, so that for failover ctdbd can send
3060 * tickle acks, triggering a reconnection by the
3064 struct sockaddr_storage srv, clnt;
3066 if (client_get_tcp_info(&srv, &clnt) == 0) {
3070 status = ctdbd_register_ips(
3071 messaging_ctdbd_connection(procid_self()),
3072 &srv, &clnt, release_ip, NULL);
3074 if (!NT_STATUS_IS_OK(status)) {
3075 DEBUG(0, ("ctdbd_register_ips failed: %s\n",
3076 nt_errstr(status)));
3080 DEBUG(0,("Unable to get tcp info for "
3081 "CTDB_CONTROL_TCP_CLIENT: %s\n",
3088 smbd_server_conn->nbt.got_session = false;
3090 smbd_server_conn->smb1.negprot.max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
3092 smbd_server_conn->smb1.sessions.done_sesssetup = false;
3093 smbd_server_conn->smb1.sessions.max_send = BUFFER_SIZE;
3094 smbd_server_conn->smb1.sessions.last_session_tag = UID_FIELD_INVALID;
3095 /* users from session setup */
3096 smbd_server_conn->smb1.sessions.session_userlist = NULL;
3097 /* workgroup from session setup. */
3098 smbd_server_conn->smb1.sessions.session_workgroup = NULL;
3099 /* this holds info on user ids that are already validated for this VC */
3100 smbd_server_conn->smb1.sessions.validated_users = NULL;
3101 smbd_server_conn->smb1.sessions.next_vuid = VUID_OFFSET;
3102 smbd_server_conn->smb1.sessions.num_validated_vuids = 0;
3104 conn_init(smbd_server_conn);
3105 if (!init_dptrs(smbd_server_conn)) {
3106 exit_server("init_dptrs() failed");
3109 smbd_server_conn->smb1.fde = event_add_fd(smbd_event_context(),
3113 smbd_server_connection_handler,
3115 if (!smbd_server_conn->smb1.fde) {
3116 exit_server("failed to create smbd_server_connection fde");
3120 * Initialize spoolss with an init function to convert printers first.
3121 * static_init_rpc will try to initialize the spoolss server too but you
3122 * can't register it twice.
3124 spoolss_cb.init = spoolss_init_cb;
3125 spoolss_cb.shutdown = NULL;
3128 if (!NT_STATUS_IS_OK(rpc_winreg_init(NULL))) {
3132 if (!NT_STATUS_IS_OK(rpc_spoolss_init(&spoolss_cb))) {
3143 frame = talloc_stackframe_pool(8192);
3147 status = smbd_server_connection_loop_once(smbd_server_conn);
3148 if (!NT_STATUS_EQUAL(status, NT_STATUS_RETRY) &&
3149 !NT_STATUS_IS_OK(status)) {
3150 DEBUG(3, ("smbd_server_connection_loop_once failed: %s,"
3151 " exiting\n", nt_errstr(status)));
3158 exit_server_cleanly(NULL);
3161 bool req_is_in_chain(struct smb_request *req)
3163 if (req->vwv != (uint16_t *)(req->inbuf+smb_vwv)) {
3165 * We're right now handling a subsequent request, so we must
3171 if (!is_andx_req(req->cmd)) {
3177 * Okay, an illegal request, but definitely not chained :-)
3182 return (CVAL(req->vwv+0, 0) != 0xFF);