ctdbd_conn: Move release_ip handling into process.c
[sfrench/samba-autobuild/.git] / source3 / smbd / process.c
1 /* 
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
6
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.
11
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.
16
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/>.
19 */
20
21 #include "includes.h"
22 #include "../lib/tsocket/tsocket.h"
23 #include "system/filesys.h"
24 #include "smbd/smbd.h"
25 #include "smbd/globals.h"
26 #include "librpc/gen_ndr/netlogon.h"
27 #include "../lib/async_req/async_sock.h"
28 #include "ctdbd_conn.h"
29 #include "../lib/util/select.h"
30 #include "printing/queue_process.h"
31 #include "system/select.h"
32 #include "passdb.h"
33 #include "auth.h"
34 #include "messages.h"
35 #include "smbprofile.h"
36 #include "rpc_server/spoolss/srv_spoolss_nt.h"
37 #include "libsmb/libsmb.h"
38 #include "../lib/util/tevent_ntstatus.h"
39 #include "../libcli/security/dom_sid.h"
40 #include "../libcli/security/security_token.h"
41 #include "lib/id_cache.h"
42 #include "lib/sys_rw_data.h"
43 #include "serverid.h"
44 #include "system/threads.h"
45
46 /* Internal message queue for deferred opens. */
47 struct pending_message_list {
48         struct pending_message_list *next, *prev;
49         struct timeval request_time; /* When was this first issued? */
50         struct smbd_server_connection *sconn;
51         struct smbXsrv_connection *xconn;
52         struct tevent_timer *te;
53         struct smb_perfcount_data pcd;
54         uint32_t seqnum;
55         bool encrypted;
56         bool processed;
57         DATA_BLOB buf;
58         struct deferred_open_record *open_rec;
59 };
60
61 static void construct_reply_common(uint8_t cmd, const uint8_t *inbuf,
62                                    char *outbuf);
63 static struct pending_message_list *get_deferred_open_message_smb(
64         struct smbd_server_connection *sconn, uint64_t mid);
65 static bool smb_splice_chain(uint8_t **poutbuf, const uint8_t *andx_buf);
66
67 static void smbd_echo_init(struct smbXsrv_connection *xconn)
68 {
69         xconn->smb1.echo_handler.trusted_fd = -1;
70         xconn->smb1.echo_handler.socket_lock_fd = -1;
71 #ifdef HAVE_ROBUST_MUTEXES
72         xconn->smb1.echo_handler.socket_mutex = NULL;
73 #endif
74 }
75
76 static bool smbd_echo_active(struct smbXsrv_connection *xconn)
77 {
78         if (xconn->smb1.echo_handler.socket_lock_fd != -1) {
79                 return true;
80         }
81
82 #ifdef HAVE_ROBUST_MUTEXES
83         if (xconn->smb1.echo_handler.socket_mutex != NULL) {
84                 return true;
85         }
86 #endif
87
88         return false;
89 }
90
91 static bool smbd_lock_socket_internal(struct smbXsrv_connection *xconn)
92 {
93         if (!smbd_echo_active(xconn)) {
94                 return true;
95         }
96
97         xconn->smb1.echo_handler.ref_count++;
98
99         if (xconn->smb1.echo_handler.ref_count > 1) {
100                 return true;
101         }
102
103         DEBUG(10,("pid[%d] wait for socket lock\n", (int)getpid()));
104
105 #ifdef HAVE_ROBUST_MUTEXES
106         if (xconn->smb1.echo_handler.socket_mutex != NULL) {
107                 int ret = EINTR;
108
109                 while (ret == EINTR) {
110                         ret = pthread_mutex_lock(
111                                 xconn->smb1.echo_handler.socket_mutex);
112                         if (ret == 0) {
113                                 break;
114                         }
115                 }
116                 if (ret != 0) {
117                         DEBUG(1, ("pthread_mutex_lock failed: %s\n",
118                                   strerror(ret)));
119                         return false;
120                 }
121         }
122 #endif
123
124         if (xconn->smb1.echo_handler.socket_lock_fd != -1) {
125                 bool ok;
126
127                 do {
128                         ok = fcntl_lock(
129                                 xconn->smb1.echo_handler.socket_lock_fd,
130                                 F_SETLKW, 0, 0, F_WRLCK);
131                 } while (!ok && (errno == EINTR));
132
133                 if (!ok) {
134                         DEBUG(1, ("fcntl_lock failed: %s\n", strerror(errno)));
135                         return false;
136                 }
137         }
138
139         DEBUG(10,("pid[%d] got socket lock\n", (int)getpid()));
140
141         return true;
142 }
143
144 void smbd_lock_socket(struct smbXsrv_connection *xconn)
145 {
146         if (!smbd_lock_socket_internal(xconn)) {
147                 exit_server_cleanly("failed to lock socket");
148         }
149 }
150
151 static bool smbd_unlock_socket_internal(struct smbXsrv_connection *xconn)
152 {
153         if (!smbd_echo_active(xconn)) {
154                 return true;
155         }
156
157         xconn->smb1.echo_handler.ref_count--;
158
159         if (xconn->smb1.echo_handler.ref_count > 0) {
160                 return true;
161         }
162
163 #ifdef HAVE_ROBUST_MUTEXES
164         if (xconn->smb1.echo_handler.socket_mutex != NULL) {
165                 int ret = EINTR;
166
167                 while (ret == EINTR) {
168                         ret = pthread_mutex_unlock(
169                                 xconn->smb1.echo_handler.socket_mutex);
170                         if (ret == 0) {
171                                 break;
172                         }
173                 }
174                 if (ret != 0) {
175                         DEBUG(1, ("pthread_mutex_unlock failed: %s\n",
176                                   strerror(ret)));
177                         return false;
178                 }
179         }
180 #endif
181
182         if (xconn->smb1.echo_handler.socket_lock_fd != -1) {
183                 bool ok;
184
185                 do {
186                         ok = fcntl_lock(
187                                 xconn->smb1.echo_handler.socket_lock_fd,
188                                 F_SETLKW, 0, 0, F_UNLCK);
189                 } while (!ok && (errno == EINTR));
190
191                 if (!ok) {
192                         DEBUG(1, ("fcntl_lock failed: %s\n", strerror(errno)));
193                         return false;
194                 }
195         }
196
197         DEBUG(10,("pid[%d] unlocked socket\n", (int)getpid()));
198
199         return true;
200 }
201
202 void smbd_unlock_socket(struct smbXsrv_connection *xconn)
203 {
204         if (!smbd_unlock_socket_internal(xconn)) {
205                 exit_server_cleanly("failed to unlock socket");
206         }
207 }
208
209 /* Accessor function for smb_read_error for smbd functions. */
210
211 /****************************************************************************
212  Send an smb to a fd.
213 ****************************************************************************/
214
215 bool srv_send_smb(struct smbXsrv_connection *xconn, char *buffer,
216                   bool do_signing, uint32_t seqnum,
217                   bool do_encrypt,
218                   struct smb_perfcount_data *pcd)
219 {
220         size_t len = 0;
221         ssize_t ret;
222         char *buf_out = buffer;
223
224         if (!NT_STATUS_IS_OK(xconn->transport.status)) {
225                 /*
226                  * we're not supposed to do any io
227                  */
228                 return true;
229         }
230
231         smbd_lock_socket(xconn);
232
233         if (do_signing) {
234                 /* Sign the outgoing packet if required. */
235                 srv_calculate_sign_mac(xconn, buf_out, seqnum);
236         }
237
238         if (do_encrypt) {
239                 NTSTATUS status = srv_encrypt_buffer(xconn, buffer, &buf_out);
240                 if (!NT_STATUS_IS_OK(status)) {
241                         DEBUG(0, ("send_smb: SMB encryption failed "
242                                 "on outgoing packet! Error %s\n",
243                                 nt_errstr(status) ));
244                         ret = -1;
245                         goto out;
246                 }
247         }
248
249         len = smb_len_large(buf_out) + 4;
250
251         ret = write_data(xconn->transport.sock, buf_out, len);
252         if (ret <= 0) {
253                 int saved_errno = errno;
254                 /*
255                  * Try and give an error message saying what
256                  * client failed.
257                  */
258                 DEBUG(1,("pid[%d] Error writing %d bytes to client %s. %d. (%s)\n",
259                          (int)getpid(), (int)len,
260                          smbXsrv_connection_dbg(xconn),
261                          (int)ret, strerror(saved_errno)));
262                 errno = saved_errno;
263
264                 srv_free_enc_buffer(xconn, buf_out);
265                 goto out;
266         }
267
268         SMB_PERFCOUNT_SET_MSGLEN_OUT(pcd, len);
269         srv_free_enc_buffer(xconn, buf_out);
270 out:
271         SMB_PERFCOUNT_END(pcd);
272
273         smbd_unlock_socket(xconn);
274         return (ret > 0);
275 }
276
277 /*******************************************************************
278  Setup the word count and byte count for a smb message.
279 ********************************************************************/
280
281 int srv_set_message(char *buf,
282                         int num_words,
283                         int num_bytes,
284                         bool zero)
285 {
286         if (zero && (num_words || num_bytes)) {
287                 memset(buf + smb_size,'\0',num_words*2 + num_bytes);
288         }
289         SCVAL(buf,smb_wct,num_words);
290         SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
291         smb_setlen(buf,(smb_size + num_words*2 + num_bytes - 4));
292         return (smb_size + num_words*2 + num_bytes);
293 }
294
295 static bool valid_smb_header(const uint8_t *inbuf)
296 {
297         if (is_encrypted_packet(inbuf)) {
298                 return true;
299         }
300         /*
301          * This used to be (strncmp(smb_base(inbuf),"\377SMB",4) == 0)
302          * but it just looks weird to call strncmp for this one.
303          */
304         return (IVAL(smb_base(inbuf), 0) == 0x424D53FF);
305 }
306
307 /* Socket functions for smbd packet processing. */
308
309 static bool valid_packet_size(size_t len)
310 {
311         /*
312          * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
313          * of header. Don't print the error if this fits.... JRA.
314          */
315
316         if (len > (LARGE_WRITEX_BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
317                 DEBUG(0,("Invalid packet length! (%lu bytes).\n",
318                                         (unsigned long)len));
319                 return false;
320         }
321         return true;
322 }
323
324 static NTSTATUS read_packet_remainder(int fd, char *buffer,
325                                       unsigned int timeout, ssize_t len)
326 {
327         NTSTATUS status;
328
329         if (len <= 0) {
330                 return NT_STATUS_OK;
331         }
332
333         status = read_fd_with_timeout(fd, buffer, len, len, timeout, NULL);
334         if (!NT_STATUS_IS_OK(status)) {
335                 char addr[INET6_ADDRSTRLEN];
336                 DEBUG(0, ("read_fd_with_timeout failed for client %s read "
337                           "error = %s.\n",
338                           get_peer_addr(fd, addr, sizeof(addr)),
339                           nt_errstr(status)));
340         }
341         return status;
342 }
343
344 /****************************************************************************
345  Attempt a zerocopy writeX read. We know here that len > smb_size-4
346 ****************************************************************************/
347
348 /*
349  * Unfortunately, earlier versions of smbclient/libsmbclient
350  * don't send this "standard" writeX header. I've fixed this
351  * for 3.2 but we'll use the old method with earlier versions.
352  * Windows and CIFSFS at least use this standard size. Not
353  * sure about MacOSX.
354  */
355
356 #define STANDARD_WRITE_AND_X_HEADER_SIZE (smb_size - 4 + /* basic header */ \
357                                 (2*14) + /* word count (including bcc) */ \
358                                 1 /* pad byte */)
359
360 static NTSTATUS receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
361                                                     const char lenbuf[4],
362                                                     struct smbXsrv_connection *xconn,
363                                                     int sock,
364                                                     char **buffer,
365                                                     unsigned int timeout,
366                                                     size_t *p_unread,
367                                                     size_t *len_ret)
368 {
369         /* Size of a WRITEX call (+4 byte len). */
370         char writeX_header[4 + STANDARD_WRITE_AND_X_HEADER_SIZE];
371         ssize_t len = smb_len_large(lenbuf); /* Could be a UNIX large writeX. */
372         ssize_t toread;
373         NTSTATUS status;
374
375         memcpy(writeX_header, lenbuf, 4);
376
377         status = read_fd_with_timeout(
378                 sock, writeX_header + 4,
379                 STANDARD_WRITE_AND_X_HEADER_SIZE,
380                 STANDARD_WRITE_AND_X_HEADER_SIZE,
381                 timeout, NULL);
382
383         if (!NT_STATUS_IS_OK(status)) {
384                 DEBUG(0, ("read_fd_with_timeout failed for client %s read "
385                           "error = %s.\n",
386                           smbXsrv_connection_dbg(xconn),
387                           nt_errstr(status)));
388                 return status;
389         }
390
391         /*
392          * Ok - now try and see if this is a possible
393          * valid writeX call.
394          */
395
396         if (is_valid_writeX_buffer(xconn, (uint8_t *)writeX_header)) {
397                 /*
398                  * If the data offset is beyond what
399                  * we've read, drain the extra bytes.
400                  */
401                 uint16_t doff = SVAL(writeX_header,smb_vwv11);
402                 ssize_t newlen;
403
404                 if (doff > STANDARD_WRITE_AND_X_HEADER_SIZE) {
405                         size_t drain = doff - STANDARD_WRITE_AND_X_HEADER_SIZE;
406                         if (drain_socket(sock, drain) != drain) {
407                                 smb_panic("receive_smb_raw_talloc_partial_read:"
408                                         " failed to drain pending bytes");
409                         }
410                 } else {
411                         doff = STANDARD_WRITE_AND_X_HEADER_SIZE;
412                 }
413
414                 /* Spoof down the length and null out the bcc. */
415                 set_message_bcc(writeX_header, 0);
416                 newlen = smb_len(writeX_header);
417
418                 /* Copy the header we've written. */
419
420                 *buffer = (char *)talloc_memdup(mem_ctx,
421                                 writeX_header,
422                                 sizeof(writeX_header));
423
424                 if (*buffer == NULL) {
425                         DEBUG(0, ("Could not allocate inbuf of length %d\n",
426                                   (int)sizeof(writeX_header)));
427                         return NT_STATUS_NO_MEMORY;
428                 }
429
430                 /* Work out the remaining bytes. */
431                 *p_unread = len - STANDARD_WRITE_AND_X_HEADER_SIZE;
432                 *len_ret = newlen + 4;
433                 return NT_STATUS_OK;
434         }
435
436         if (!valid_packet_size(len)) {
437                 return NT_STATUS_INVALID_PARAMETER;
438         }
439
440         /*
441          * Not a valid writeX call. Just do the standard
442          * talloc and return.
443          */
444
445         *buffer = talloc_array(mem_ctx, char, len+4);
446
447         if (*buffer == NULL) {
448                 DEBUG(0, ("Could not allocate inbuf of length %d\n",
449                           (int)len+4));
450                 return NT_STATUS_NO_MEMORY;
451         }
452
453         /* Copy in what we already read. */
454         memcpy(*buffer,
455                 writeX_header,
456                 4 + STANDARD_WRITE_AND_X_HEADER_SIZE);
457         toread = len - STANDARD_WRITE_AND_X_HEADER_SIZE;
458
459         if(toread > 0) {
460                 status = read_packet_remainder(
461                         sock,
462                         (*buffer) + 4 + STANDARD_WRITE_AND_X_HEADER_SIZE,
463                         timeout, toread);
464
465                 if (!NT_STATUS_IS_OK(status)) {
466                         DEBUG(10, ("receive_smb_raw_talloc_partial_read: %s\n",
467                                    nt_errstr(status)));
468                         return status;
469                 }
470         }
471
472         *len_ret = len + 4;
473         return NT_STATUS_OK;
474 }
475
476 static NTSTATUS receive_smb_raw_talloc(TALLOC_CTX *mem_ctx,
477                                        struct smbXsrv_connection *xconn,
478                                        int sock,
479                                        char **buffer, unsigned int timeout,
480                                        size_t *p_unread, size_t *plen)
481 {
482         char lenbuf[4];
483         size_t len;
484         int min_recv_size = lp_min_receive_file_size();
485         NTSTATUS status;
486
487         *p_unread = 0;
488
489         status = read_smb_length_return_keepalive(sock, lenbuf, timeout,
490                                                   &len);
491         if (!NT_STATUS_IS_OK(status)) {
492                 return status;
493         }
494
495         if (CVAL(lenbuf,0) == 0 && min_recv_size &&
496             (smb_len_large(lenbuf) > /* Could be a UNIX large writeX. */
497                 (min_recv_size + STANDARD_WRITE_AND_X_HEADER_SIZE)) &&
498             !srv_is_signing_active(xconn) &&
499             xconn->smb1.echo_handler.trusted_fde == NULL) {
500
501                 return receive_smb_raw_talloc_partial_read(
502                         mem_ctx, lenbuf, xconn, sock, buffer, timeout,
503                         p_unread, plen);
504         }
505
506         if (!valid_packet_size(len)) {
507                 return NT_STATUS_INVALID_PARAMETER;
508         }
509
510         /*
511          * The +4 here can't wrap, we've checked the length above already.
512          */
513
514         *buffer = talloc_array(mem_ctx, char, len+4);
515
516         if (*buffer == NULL) {
517                 DEBUG(0, ("Could not allocate inbuf of length %d\n",
518                           (int)len+4));
519                 return NT_STATUS_NO_MEMORY;
520         }
521
522         memcpy(*buffer, lenbuf, sizeof(lenbuf));
523
524         status = read_packet_remainder(sock, (*buffer)+4, timeout, len);
525         if (!NT_STATUS_IS_OK(status)) {
526                 return status;
527         }
528
529         *plen = len + 4;
530         return NT_STATUS_OK;
531 }
532
533 static NTSTATUS receive_smb_talloc(TALLOC_CTX *mem_ctx,
534                                    struct smbXsrv_connection *xconn,
535                                    int sock,
536                                    char **buffer, unsigned int timeout,
537                                    size_t *p_unread, bool *p_encrypted,
538                                    size_t *p_len,
539                                    uint32_t *seqnum,
540                                    bool trusted_channel)
541 {
542         size_t len = 0;
543         NTSTATUS status;
544
545         *p_encrypted = false;
546
547         status = receive_smb_raw_talloc(mem_ctx, xconn, sock, buffer, timeout,
548                                         p_unread, &len);
549         if (!NT_STATUS_IS_OK(status)) {
550                 DEBUG(NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)?5:1,
551                       ("receive_smb_raw_talloc failed for client %s "
552                        "read error = %s.\n",
553                        smbXsrv_connection_dbg(xconn),
554                        nt_errstr(status)) );
555                 return status;
556         }
557
558         if (is_encrypted_packet((uint8_t *)*buffer)) {
559                 status = srv_decrypt_buffer(xconn, *buffer);
560                 if (!NT_STATUS_IS_OK(status)) {
561                         DEBUG(0, ("receive_smb_talloc: SMB decryption failed on "
562                                 "incoming packet! Error %s\n",
563                                 nt_errstr(status) ));
564                         return status;
565                 }
566                 *p_encrypted = true;
567         }
568
569         /* Check the incoming SMB signature. */
570         if (!srv_check_sign_mac(xconn, *buffer, seqnum, trusted_channel)) {
571                 DEBUG(0, ("receive_smb: SMB Signature verification failed on "
572                           "incoming packet!\n"));
573                 return NT_STATUS_INVALID_NETWORK_RESPONSE;
574         }
575
576         *p_len = len;
577         return NT_STATUS_OK;
578 }
579
580 /*
581  * Initialize a struct smb_request from an inbuf
582  */
583
584 static bool init_smb_request(struct smb_request *req,
585                              struct smbd_server_connection *sconn,
586                              struct smbXsrv_connection *xconn,
587                              const uint8_t *inbuf,
588                              size_t unread_bytes, bool encrypted,
589                              uint32_t seqnum)
590 {
591         struct smbXsrv_tcon *tcon;
592         NTSTATUS status;
593         NTTIME now;
594         size_t req_size = smb_len(inbuf) + 4;
595
596         /* Ensure we have at least smb_size bytes. */
597         if (req_size < smb_size) {
598                 DEBUG(0,("init_smb_request: invalid request size %u\n",
599                         (unsigned int)req_size ));
600                 return false;
601         }
602
603         req->request_time = timeval_current();
604         now = timeval_to_nttime(&req->request_time);
605
606         req->cmd    = CVAL(inbuf, smb_com);
607         req->flags2 = SVAL(inbuf, smb_flg2);
608         req->smbpid = SVAL(inbuf, smb_pid);
609         req->mid    = (uint64_t)SVAL(inbuf, smb_mid);
610         req->seqnum = seqnum;
611         req->vuid   = SVAL(inbuf, smb_uid);
612         req->tid    = SVAL(inbuf, smb_tid);
613         req->wct    = CVAL(inbuf, smb_wct);
614         req->vwv    = (const uint16_t *)(inbuf+smb_vwv);
615         req->buflen = smb_buflen(inbuf);
616         req->buf    = (const uint8_t *)smb_buf_const(inbuf);
617         req->unread_bytes = unread_bytes;
618         req->encrypted = encrypted;
619         req->sconn = sconn;
620         req->xconn = xconn;
621         req->conn = NULL;
622         if (xconn != NULL) {
623                 status = smb1srv_tcon_lookup(xconn, req->tid, now, &tcon);
624                 if (NT_STATUS_IS_OK(status)) {
625                         req->conn = tcon->compat;
626                 }
627         }
628         req->chain_fsp = NULL;
629         req->smb2req = NULL;
630         req->priv_paths = NULL;
631         req->chain = NULL;
632         smb_init_perfcount_data(&req->pcd);
633
634         /* Ensure we have at least wct words and 2 bytes of bcc. */
635         if (smb_size + req->wct*2 > req_size) {
636                 DEBUG(0,("init_smb_request: invalid wct number %u (size %u)\n",
637                         (unsigned int)req->wct,
638                         (unsigned int)req_size));
639                 return false;
640         }
641         /* Ensure bcc is correct. */
642         if (((const uint8_t *)smb_buf_const(inbuf)) + req->buflen > inbuf + req_size) {
643                 DEBUG(0,("init_smb_request: invalid bcc number %u "
644                         "(wct = %u, size %u)\n",
645                         (unsigned int)req->buflen,
646                         (unsigned int)req->wct,
647                         (unsigned int)req_size));
648                 return false;
649         }
650
651         req->outbuf = NULL;
652         return true;
653 }
654
655 static void process_smb(struct smbXsrv_connection *xconn,
656                         uint8_t *inbuf, size_t nread, size_t unread_bytes,
657                         uint32_t seqnum, bool encrypted,
658                         struct smb_perfcount_data *deferred_pcd);
659
660 static void smbd_deferred_open_timer(struct tevent_context *ev,
661                                      struct tevent_timer *te,
662                                      struct timeval _tval,
663                                      void *private_data)
664 {
665         struct pending_message_list *msg = talloc_get_type(private_data,
666                                            struct pending_message_list);
667         struct smbd_server_connection *sconn = msg->sconn;
668         struct smbXsrv_connection *xconn = msg->xconn;
669         TALLOC_CTX *mem_ctx = talloc_tos();
670         uint64_t mid = (uint64_t)SVAL(msg->buf.data,smb_mid);
671         uint8_t *inbuf;
672
673         inbuf = (uint8_t *)talloc_memdup(mem_ctx, msg->buf.data,
674                                          msg->buf.length);
675         if (inbuf == NULL) {
676                 exit_server("smbd_deferred_open_timer: talloc failed\n");
677                 return;
678         }
679
680         /* We leave this message on the queue so the open code can
681            know this is a retry. */
682         DEBUG(5,("smbd_deferred_open_timer: trigger mid %llu.\n",
683                 (unsigned long long)mid ));
684
685         /* Mark the message as processed so this is not
686          * re-processed in error. */
687         msg->processed = true;
688
689         process_smb(xconn, inbuf,
690                     msg->buf.length, 0,
691                     msg->seqnum, msg->encrypted, &msg->pcd);
692
693         /* If it's still there and was processed, remove it. */
694         msg = get_deferred_open_message_smb(sconn, mid);
695         if (msg && msg->processed) {
696                 remove_deferred_open_message_smb(xconn, mid);
697         }
698 }
699
700 /****************************************************************************
701  Function to push a message onto the tail of a linked list of smb messages ready
702  for processing.
703 ****************************************************************************/
704
705 static bool push_queued_message(struct smb_request *req,
706                                 struct timeval request_time,
707                                 struct timeval end_time,
708                                 struct deferred_open_record *open_rec)
709 {
710         int msg_len = smb_len(req->inbuf) + 4;
711         struct pending_message_list *msg;
712
713         msg = talloc_zero(NULL, struct pending_message_list);
714
715         if(msg == NULL) {
716                 DEBUG(0,("push_message: malloc fail (1)\n"));
717                 return False;
718         }
719         msg->sconn = req->sconn;
720         msg->xconn = req->xconn;
721
722         msg->buf = data_blob_talloc(msg, req->inbuf, msg_len);
723         if(msg->buf.data == NULL) {
724                 DEBUG(0,("push_message: malloc fail (2)\n"));
725                 TALLOC_FREE(msg);
726                 return False;
727         }
728
729         msg->request_time = request_time;
730         msg->seqnum = req->seqnum;
731         msg->encrypted = req->encrypted;
732         msg->processed = false;
733         SMB_PERFCOUNT_DEFER_OP(&req->pcd, &msg->pcd);
734
735         if (open_rec) {
736                 msg->open_rec = talloc_move(msg, &open_rec);
737         }
738
739 #if 0
740         msg->te = tevent_add_timer(msg->sconn->ev_ctx,
741                                    msg,
742                                    end_time,
743                                    smbd_deferred_open_timer,
744                                    msg);
745         if (!msg->te) {
746                 DEBUG(0,("push_message: event_add_timed failed\n"));
747                 TALLOC_FREE(msg);
748                 return false;
749         }
750 #endif
751
752         DLIST_ADD_END(req->sconn->deferred_open_queue, msg,
753                       struct pending_message_list *);
754
755         DEBUG(10,("push_message: pushed message length %u on "
756                   "deferred_open_queue\n", (unsigned int)msg_len));
757
758         return True;
759 }
760
761 /****************************************************************************
762  Function to delete a sharing violation open message by mid.
763 ****************************************************************************/
764
765 void remove_deferred_open_message_smb(struct smbXsrv_connection *xconn,
766                                       uint64_t mid)
767 {
768         struct smbd_server_connection *sconn = xconn->client->sconn;
769         struct pending_message_list *pml;
770
771         if (sconn->using_smb2) {
772                 remove_deferred_open_message_smb2(xconn, mid);
773                 return;
774         }
775
776         for (pml = sconn->deferred_open_queue; pml; pml = pml->next) {
777                 if (mid == (uint64_t)SVAL(pml->buf.data,smb_mid)) {
778                         DEBUG(10,("remove_deferred_open_message_smb: "
779                                   "deleting mid %llu len %u\n",
780                                   (unsigned long long)mid,
781                                   (unsigned int)pml->buf.length ));
782                         DLIST_REMOVE(sconn->deferred_open_queue, pml);
783                         TALLOC_FREE(pml);
784                         return;
785                 }
786         }
787 }
788
789 /****************************************************************************
790  Move a sharing violation open retry message to the front of the list and
791  schedule it for immediate processing.
792 ****************************************************************************/
793
794 bool schedule_deferred_open_message_smb(struct smbXsrv_connection *xconn,
795                                         uint64_t mid)
796 {
797         struct smbd_server_connection *sconn = xconn->client->sconn;
798         struct pending_message_list *pml;
799         int i = 0;
800
801         if (sconn->using_smb2) {
802                 return schedule_deferred_open_message_smb2(xconn, mid);
803         }
804
805         for (pml = sconn->deferred_open_queue; pml; pml = pml->next) {
806                 uint64_t msg_mid = (uint64_t)SVAL(pml->buf.data,smb_mid);
807
808                 DEBUG(10,("schedule_deferred_open_message_smb: [%d] "
809                         "msg_mid = %llu\n",
810                         i++,
811                         (unsigned long long)msg_mid ));
812
813                 if (mid == msg_mid) {
814                         struct tevent_timer *te;
815
816                         if (pml->processed) {
817                                 /* A processed message should not be
818                                  * rescheduled. */
819                                 DEBUG(0,("schedule_deferred_open_message_smb: LOGIC ERROR "
820                                         "message mid %llu was already processed\n",
821                                         (unsigned long long)msg_mid ));
822                                 continue;
823                         }
824
825                         DEBUG(10,("schedule_deferred_open_message_smb: "
826                                 "scheduling mid %llu\n",
827                                 (unsigned long long)mid ));
828
829                         te = tevent_add_timer(pml->sconn->ev_ctx,
830                                               pml,
831                                               timeval_zero(),
832                                               smbd_deferred_open_timer,
833                                               pml);
834                         if (!te) {
835                                 DEBUG(10,("schedule_deferred_open_message_smb: "
836                                         "event_add_timed() failed, "
837                                         "skipping mid %llu\n",
838                                         (unsigned long long)msg_mid ));
839                         }
840
841                         TALLOC_FREE(pml->te);
842                         pml->te = te;
843                         DLIST_PROMOTE(sconn->deferred_open_queue, pml);
844                         return true;
845                 }
846         }
847
848         DEBUG(10,("schedule_deferred_open_message_smb: failed to "
849                 "find message mid %llu\n",
850                 (unsigned long long)mid ));
851
852         return false;
853 }
854
855 /****************************************************************************
856  Return true if this mid is on the deferred queue and was not yet processed.
857 ****************************************************************************/
858
859 bool open_was_deferred(struct smbXsrv_connection *xconn, uint64_t mid)
860 {
861         struct smbd_server_connection *sconn = xconn->client->sconn;
862         struct pending_message_list *pml;
863
864         if (sconn->using_smb2) {
865                 return open_was_deferred_smb2(xconn, mid);
866         }
867
868         for (pml = sconn->deferred_open_queue; pml; pml = pml->next) {
869                 if (((uint64_t)SVAL(pml->buf.data,smb_mid)) == mid && !pml->processed) {
870                         return True;
871                 }
872         }
873         return False;
874 }
875
876 /****************************************************************************
877  Return the message queued by this mid.
878 ****************************************************************************/
879
880 static struct pending_message_list *get_deferred_open_message_smb(
881         struct smbd_server_connection *sconn, uint64_t mid)
882 {
883         struct pending_message_list *pml;
884
885         for (pml = sconn->deferred_open_queue; pml; pml = pml->next) {
886                 if (((uint64_t)SVAL(pml->buf.data,smb_mid)) == mid) {
887                         return pml;
888                 }
889         }
890         return NULL;
891 }
892
893 /****************************************************************************
894  Get the state data queued by this mid.
895 ****************************************************************************/
896
897 bool get_deferred_open_message_state(struct smb_request *smbreq,
898                                 struct timeval *p_request_time,
899                                 struct deferred_open_record **open_rec)
900 {
901         struct pending_message_list *pml;
902
903         if (smbreq->sconn->using_smb2) {
904                 return get_deferred_open_message_state_smb2(smbreq->smb2req,
905                                         p_request_time,
906                                         open_rec);
907         }
908
909         pml = get_deferred_open_message_smb(smbreq->sconn, smbreq->mid);
910         if (!pml) {
911                 return false;
912         }
913         if (p_request_time) {
914                 *p_request_time = pml->request_time;
915         }
916         if (open_rec != NULL) {
917                 *open_rec = pml->open_rec;
918         }
919         return true;
920 }
921
922 /****************************************************************************
923  Function to push a deferred open smb message onto a linked list of local smb
924  messages ready for processing.
925 ****************************************************************************/
926
927 bool push_deferred_open_message_smb(struct smb_request *req,
928                                struct timeval request_time,
929                                struct timeval timeout,
930                                struct file_id id,
931                                struct deferred_open_record *open_rec)
932 {
933         struct timeval end_time;
934
935         if (req->smb2req) {
936                 return push_deferred_open_message_smb2(req->smb2req,
937                                                 request_time,
938                                                 timeout,
939                                                 id,
940                                                 open_rec);
941         }
942
943         if (req->unread_bytes) {
944                 DEBUG(0,("push_deferred_open_message_smb: logic error ! "
945                         "unread_bytes = %u\n",
946                         (unsigned int)req->unread_bytes ));
947                 smb_panic("push_deferred_open_message_smb: "
948                         "logic error unread_bytes != 0" );
949         }
950
951         end_time = timeval_sum(&request_time, &timeout);
952
953         DEBUG(10,("push_deferred_open_message_smb: pushing message "
954                 "len %u mid %llu timeout time [%u.%06u]\n",
955                 (unsigned int) smb_len(req->inbuf)+4,
956                 (unsigned long long)req->mid,
957                 (unsigned int)end_time.tv_sec,
958                 (unsigned int)end_time.tv_usec));
959
960         return push_queued_message(req, request_time, end_time, open_rec);
961 }
962
963 static void smbd_sig_term_handler(struct tevent_context *ev,
964                                   struct tevent_signal *se,
965                                   int signum,
966                                   int count,
967                                   void *siginfo,
968                                   void *private_data)
969 {
970         exit_server_cleanly("termination signal");
971 }
972
973 void smbd_setup_sig_term_handler(struct smbd_server_connection *sconn)
974 {
975         struct tevent_signal *se;
976
977         se = tevent_add_signal(sconn->ev_ctx,
978                                sconn,
979                                SIGTERM, 0,
980                                smbd_sig_term_handler,
981                                sconn);
982         if (!se) {
983                 exit_server("failed to setup SIGTERM handler");
984         }
985 }
986
987 static void smbd_sig_hup_handler(struct tevent_context *ev,
988                                   struct tevent_signal *se,
989                                   int signum,
990                                   int count,
991                                   void *siginfo,
992                                   void *private_data)
993 {
994         struct smbd_server_connection *sconn =
995                 talloc_get_type_abort(private_data,
996                 struct smbd_server_connection);
997
998         change_to_root_user();
999         DEBUG(1,("Reloading services after SIGHUP\n"));
1000         reload_services(sconn, conn_snum_used, false);
1001 }
1002
1003 void smbd_setup_sig_hup_handler(struct smbd_server_connection *sconn)
1004 {
1005         struct tevent_signal *se;
1006
1007         se = tevent_add_signal(sconn->ev_ctx,
1008                                sconn,
1009                                SIGHUP, 0,
1010                                smbd_sig_hup_handler,
1011                                sconn);
1012         if (!se) {
1013                 exit_server("failed to setup SIGHUP handler");
1014         }
1015 }
1016
1017 static void smbd_conf_updated(struct messaging_context *msg,
1018                               void *private_data,
1019                               uint32_t msg_type,
1020                               struct server_id server_id,
1021                               DATA_BLOB *data)
1022 {
1023         struct smbd_server_connection *sconn =
1024                 talloc_get_type_abort(private_data,
1025                 struct smbd_server_connection);
1026
1027         DEBUG(10,("smbd_conf_updated: Got message saying smb.conf was "
1028                   "updated. Reloading.\n"));
1029         change_to_root_user();
1030         reload_services(sconn, conn_snum_used, false);
1031 }
1032
1033 /*
1034  * Only allow 5 outstanding trans requests. We're allocating memory, so
1035  * prevent a DoS.
1036  */
1037
1038 NTSTATUS allow_new_trans(struct trans_state *list, uint64_t mid)
1039 {
1040         int count = 0;
1041         for (; list != NULL; list = list->next) {
1042
1043                 if (list->mid == mid) {
1044                         return NT_STATUS_INVALID_PARAMETER;
1045                 }
1046
1047                 count += 1;
1048         }
1049         if (count > 5) {
1050                 return NT_STATUS_INSUFFICIENT_RESOURCES;
1051         }
1052
1053         return NT_STATUS_OK;
1054 }
1055
1056 /*
1057 These flags determine some of the permissions required to do an operation 
1058
1059 Note that I don't set NEED_WRITE on some write operations because they
1060 are used by some brain-dead clients when printing, and I don't want to
1061 force write permissions on print services.
1062 */
1063 #define AS_USER (1<<0)
1064 #define NEED_WRITE (1<<1) /* Must be paired with AS_USER */
1065 #define TIME_INIT (1<<2)
1066 #define CAN_IPC (1<<3) /* Must be paired with AS_USER */
1067 #define AS_GUEST (1<<5) /* Must *NOT* be paired with AS_USER */
1068 #define DO_CHDIR (1<<6)
1069
1070 /* 
1071    define a list of possible SMB messages and their corresponding
1072    functions. Any message that has a NULL function is unimplemented -
1073    please feel free to contribute implementations!
1074 */
1075 static const struct smb_message_struct {
1076         const char *name;
1077         void (*fn)(struct smb_request *req);
1078         int flags;
1079 } smb_messages[256] = {
1080
1081 /* 0x00 */ { "SMBmkdir",reply_mkdir,AS_USER | NEED_WRITE},
1082 /* 0x01 */ { "SMBrmdir",reply_rmdir,AS_USER | NEED_WRITE},
1083 /* 0x02 */ { "SMBopen",reply_open,AS_USER },
1084 /* 0x03 */ { "SMBcreate",reply_mknew,AS_USER},
1085 /* 0x04 */ { "SMBclose",reply_close,AS_USER | CAN_IPC },
1086 /* 0x05 */ { "SMBflush",reply_flush,AS_USER},
1087 /* 0x06 */ { "SMBunlink",reply_unlink,AS_USER | NEED_WRITE },
1088 /* 0x07 */ { "SMBmv",reply_mv,AS_USER | NEED_WRITE },
1089 /* 0x08 */ { "SMBgetatr",reply_getatr,AS_USER},
1090 /* 0x09 */ { "SMBsetatr",reply_setatr,AS_USER | NEED_WRITE},
1091 /* 0x0a */ { "SMBread",reply_read,AS_USER},
1092 /* 0x0b */ { "SMBwrite",reply_write,AS_USER | CAN_IPC },
1093 /* 0x0c */ { "SMBlock",reply_lock,AS_USER},
1094 /* 0x0d */ { "SMBunlock",reply_unlock,AS_USER},
1095 /* 0x0e */ { "SMBctemp",reply_ctemp,AS_USER },
1096 /* 0x0f */ { "SMBmknew",reply_mknew,AS_USER},
1097 /* 0x10 */ { "SMBcheckpath",reply_checkpath,AS_USER},
1098 /* 0x11 */ { "SMBexit",reply_exit,DO_CHDIR},
1099 /* 0x12 */ { "SMBlseek",reply_lseek,AS_USER},
1100 /* 0x13 */ { "SMBlockread",reply_lockread,AS_USER},
1101 /* 0x14 */ { "SMBwriteunlock",reply_writeunlock,AS_USER},
1102 /* 0x15 */ { NULL, NULL, 0 },
1103 /* 0x16 */ { NULL, NULL, 0 },
1104 /* 0x17 */ { NULL, NULL, 0 },
1105 /* 0x18 */ { NULL, NULL, 0 },
1106 /* 0x19 */ { NULL, NULL, 0 },
1107 /* 0x1a */ { "SMBreadbraw",reply_readbraw,AS_USER},
1108 /* 0x1b */ { "SMBreadBmpx",reply_readbmpx,AS_USER},
1109 /* 0x1c */ { "SMBreadBs",reply_readbs,AS_USER },
1110 /* 0x1d */ { "SMBwritebraw",reply_writebraw,AS_USER},
1111 /* 0x1e */ { "SMBwriteBmpx",reply_writebmpx,AS_USER},
1112 /* 0x1f */ { "SMBwriteBs",reply_writebs,AS_USER},
1113 /* 0x20 */ { "SMBwritec", NULL,0},
1114 /* 0x21 */ { NULL, NULL, 0 },
1115 /* 0x22 */ { "SMBsetattrE",reply_setattrE,AS_USER | NEED_WRITE },
1116 /* 0x23 */ { "SMBgetattrE",reply_getattrE,AS_USER },
1117 /* 0x24 */ { "SMBlockingX",reply_lockingX,AS_USER },
1118 /* 0x25 */ { "SMBtrans",reply_trans,AS_USER | CAN_IPC },
1119 /* 0x26 */ { "SMBtranss",reply_transs,AS_USER | CAN_IPC},
1120 /* 0x27 */ { "SMBioctl",reply_ioctl,0},
1121 /* 0x28 */ { "SMBioctls", NULL,AS_USER},
1122 /* 0x29 */ { "SMBcopy",reply_copy,AS_USER | NEED_WRITE },
1123 /* 0x2a */ { "SMBmove", NULL,AS_USER | NEED_WRITE },
1124 /* 0x2b */ { "SMBecho",reply_echo,0},
1125 /* 0x2c */ { "SMBwriteclose",reply_writeclose,AS_USER},
1126 /* 0x2d */ { "SMBopenX",reply_open_and_X,AS_USER | CAN_IPC },
1127 /* 0x2e */ { "SMBreadX",reply_read_and_X,AS_USER | CAN_IPC },
1128 /* 0x2f */ { "SMBwriteX",reply_write_and_X,AS_USER | CAN_IPC },
1129 /* 0x30 */ { NULL, NULL, 0 },
1130 /* 0x31 */ { NULL, NULL, 0 },
1131 /* 0x32 */ { "SMBtrans2",reply_trans2, AS_USER | CAN_IPC },
1132 /* 0x33 */ { "SMBtranss2",reply_transs2, AS_USER | CAN_IPC },
1133 /* 0x34 */ { "SMBfindclose",reply_findclose,AS_USER},
1134 /* 0x35 */ { "SMBfindnclose",reply_findnclose,AS_USER},
1135 /* 0x36 */ { NULL, NULL, 0 },
1136 /* 0x37 */ { NULL, NULL, 0 },
1137 /* 0x38 */ { NULL, NULL, 0 },
1138 /* 0x39 */ { NULL, NULL, 0 },
1139 /* 0x3a */ { NULL, NULL, 0 },
1140 /* 0x3b */ { NULL, NULL, 0 },
1141 /* 0x3c */ { NULL, NULL, 0 },
1142 /* 0x3d */ { NULL, NULL, 0 },
1143 /* 0x3e */ { NULL, NULL, 0 },
1144 /* 0x3f */ { NULL, NULL, 0 },
1145 /* 0x40 */ { NULL, NULL, 0 },
1146 /* 0x41 */ { NULL, NULL, 0 },
1147 /* 0x42 */ { NULL, NULL, 0 },
1148 /* 0x43 */ { NULL, NULL, 0 },
1149 /* 0x44 */ { NULL, NULL, 0 },
1150 /* 0x45 */ { NULL, NULL, 0 },
1151 /* 0x46 */ { NULL, NULL, 0 },
1152 /* 0x47 */ { NULL, NULL, 0 },
1153 /* 0x48 */ { NULL, NULL, 0 },
1154 /* 0x49 */ { NULL, NULL, 0 },
1155 /* 0x4a */ { NULL, NULL, 0 },
1156 /* 0x4b */ { NULL, NULL, 0 },
1157 /* 0x4c */ { NULL, NULL, 0 },
1158 /* 0x4d */ { NULL, NULL, 0 },
1159 /* 0x4e */ { NULL, NULL, 0 },
1160 /* 0x4f */ { NULL, NULL, 0 },
1161 /* 0x50 */ { NULL, NULL, 0 },
1162 /* 0x51 */ { NULL, NULL, 0 },
1163 /* 0x52 */ { NULL, NULL, 0 },
1164 /* 0x53 */ { NULL, NULL, 0 },
1165 /* 0x54 */ { NULL, NULL, 0 },
1166 /* 0x55 */ { NULL, NULL, 0 },
1167 /* 0x56 */ { NULL, NULL, 0 },
1168 /* 0x57 */ { NULL, NULL, 0 },
1169 /* 0x58 */ { NULL, NULL, 0 },
1170 /* 0x59 */ { NULL, NULL, 0 },
1171 /* 0x5a */ { NULL, NULL, 0 },
1172 /* 0x5b */ { NULL, NULL, 0 },
1173 /* 0x5c */ { NULL, NULL, 0 },
1174 /* 0x5d */ { NULL, NULL, 0 },
1175 /* 0x5e */ { NULL, NULL, 0 },
1176 /* 0x5f */ { NULL, NULL, 0 },
1177 /* 0x60 */ { NULL, NULL, 0 },
1178 /* 0x61 */ { NULL, NULL, 0 },
1179 /* 0x62 */ { NULL, NULL, 0 },
1180 /* 0x63 */ { NULL, NULL, 0 },
1181 /* 0x64 */ { NULL, NULL, 0 },
1182 /* 0x65 */ { NULL, NULL, 0 },
1183 /* 0x66 */ { NULL, NULL, 0 },
1184 /* 0x67 */ { NULL, NULL, 0 },
1185 /* 0x68 */ { NULL, NULL, 0 },
1186 /* 0x69 */ { NULL, NULL, 0 },
1187 /* 0x6a */ { NULL, NULL, 0 },
1188 /* 0x6b */ { NULL, NULL, 0 },
1189 /* 0x6c */ { NULL, NULL, 0 },
1190 /* 0x6d */ { NULL, NULL, 0 },
1191 /* 0x6e */ { NULL, NULL, 0 },
1192 /* 0x6f */ { NULL, NULL, 0 },
1193 /* 0x70 */ { "SMBtcon",reply_tcon,0},
1194 /* 0x71 */ { "SMBtdis",reply_tdis,DO_CHDIR},
1195 /* 0x72 */ { "SMBnegprot",reply_negprot,0},
1196 /* 0x73 */ { "SMBsesssetupX",reply_sesssetup_and_X,0},
1197 /* 0x74 */ { "SMBulogoffX",reply_ulogoffX, 0}, /* ulogoff doesn't give a valid TID */
1198 /* 0x75 */ { "SMBtconX",reply_tcon_and_X,0},
1199 /* 0x76 */ { NULL, NULL, 0 },
1200 /* 0x77 */ { NULL, NULL, 0 },
1201 /* 0x78 */ { NULL, NULL, 0 },
1202 /* 0x79 */ { NULL, NULL, 0 },
1203 /* 0x7a */ { NULL, NULL, 0 },
1204 /* 0x7b */ { NULL, NULL, 0 },
1205 /* 0x7c */ { NULL, NULL, 0 },
1206 /* 0x7d */ { NULL, NULL, 0 },
1207 /* 0x7e */ { NULL, NULL, 0 },
1208 /* 0x7f */ { NULL, NULL, 0 },
1209 /* 0x80 */ { "SMBdskattr",reply_dskattr,AS_USER},
1210 /* 0x81 */ { "SMBsearch",reply_search,AS_USER},
1211 /* 0x82 */ { "SMBffirst",reply_search,AS_USER},
1212 /* 0x83 */ { "SMBfunique",reply_search,AS_USER},
1213 /* 0x84 */ { "SMBfclose",reply_fclose,AS_USER},
1214 /* 0x85 */ { NULL, NULL, 0 },
1215 /* 0x86 */ { NULL, NULL, 0 },
1216 /* 0x87 */ { NULL, NULL, 0 },
1217 /* 0x88 */ { NULL, NULL, 0 },
1218 /* 0x89 */ { NULL, NULL, 0 },
1219 /* 0x8a */ { NULL, NULL, 0 },
1220 /* 0x8b */ { NULL, NULL, 0 },
1221 /* 0x8c */ { NULL, NULL, 0 },
1222 /* 0x8d */ { NULL, NULL, 0 },
1223 /* 0x8e */ { NULL, NULL, 0 },
1224 /* 0x8f */ { NULL, NULL, 0 },
1225 /* 0x90 */ { NULL, NULL, 0 },
1226 /* 0x91 */ { NULL, NULL, 0 },
1227 /* 0x92 */ { NULL, NULL, 0 },
1228 /* 0x93 */ { NULL, NULL, 0 },
1229 /* 0x94 */ { NULL, NULL, 0 },
1230 /* 0x95 */ { NULL, NULL, 0 },
1231 /* 0x96 */ { NULL, NULL, 0 },
1232 /* 0x97 */ { NULL, NULL, 0 },
1233 /* 0x98 */ { NULL, NULL, 0 },
1234 /* 0x99 */ { NULL, NULL, 0 },
1235 /* 0x9a */ { NULL, NULL, 0 },
1236 /* 0x9b */ { NULL, NULL, 0 },
1237 /* 0x9c */ { NULL, NULL, 0 },
1238 /* 0x9d */ { NULL, NULL, 0 },
1239 /* 0x9e */ { NULL, NULL, 0 },
1240 /* 0x9f */ { NULL, NULL, 0 },
1241 /* 0xa0 */ { "SMBnttrans",reply_nttrans, AS_USER | CAN_IPC },
1242 /* 0xa1 */ { "SMBnttranss",reply_nttranss, AS_USER | CAN_IPC },
1243 /* 0xa2 */ { "SMBntcreateX",reply_ntcreate_and_X, AS_USER | CAN_IPC },
1244 /* 0xa3 */ { NULL, NULL, 0 },
1245 /* 0xa4 */ { "SMBntcancel",reply_ntcancel, 0 },
1246 /* 0xa5 */ { "SMBntrename",reply_ntrename, AS_USER | NEED_WRITE },
1247 /* 0xa6 */ { NULL, NULL, 0 },
1248 /* 0xa7 */ { NULL, NULL, 0 },
1249 /* 0xa8 */ { NULL, NULL, 0 },
1250 /* 0xa9 */ { NULL, NULL, 0 },
1251 /* 0xaa */ { NULL, NULL, 0 },
1252 /* 0xab */ { NULL, NULL, 0 },
1253 /* 0xac */ { NULL, NULL, 0 },
1254 /* 0xad */ { NULL, NULL, 0 },
1255 /* 0xae */ { NULL, NULL, 0 },
1256 /* 0xaf */ { NULL, NULL, 0 },
1257 /* 0xb0 */ { NULL, NULL, 0 },
1258 /* 0xb1 */ { NULL, NULL, 0 },
1259 /* 0xb2 */ { NULL, NULL, 0 },
1260 /* 0xb3 */ { NULL, NULL, 0 },
1261 /* 0xb4 */ { NULL, NULL, 0 },
1262 /* 0xb5 */ { NULL, NULL, 0 },
1263 /* 0xb6 */ { NULL, NULL, 0 },
1264 /* 0xb7 */ { NULL, NULL, 0 },
1265 /* 0xb8 */ { NULL, NULL, 0 },
1266 /* 0xb9 */ { NULL, NULL, 0 },
1267 /* 0xba */ { NULL, NULL, 0 },
1268 /* 0xbb */ { NULL, NULL, 0 },
1269 /* 0xbc */ { NULL, NULL, 0 },
1270 /* 0xbd */ { NULL, NULL, 0 },
1271 /* 0xbe */ { NULL, NULL, 0 },
1272 /* 0xbf */ { NULL, NULL, 0 },
1273 /* 0xc0 */ { "SMBsplopen",reply_printopen,AS_USER},
1274 /* 0xc1 */ { "SMBsplwr",reply_printwrite,AS_USER},
1275 /* 0xc2 */ { "SMBsplclose",reply_printclose,AS_USER},
1276 /* 0xc3 */ { "SMBsplretq",reply_printqueue,AS_USER},
1277 /* 0xc4 */ { NULL, NULL, 0 },
1278 /* 0xc5 */ { NULL, NULL, 0 },
1279 /* 0xc6 */ { NULL, NULL, 0 },
1280 /* 0xc7 */ { NULL, NULL, 0 },
1281 /* 0xc8 */ { NULL, NULL, 0 },
1282 /* 0xc9 */ { NULL, NULL, 0 },
1283 /* 0xca */ { NULL, NULL, 0 },
1284 /* 0xcb */ { NULL, NULL, 0 },
1285 /* 0xcc */ { NULL, NULL, 0 },
1286 /* 0xcd */ { NULL, NULL, 0 },
1287 /* 0xce */ { NULL, NULL, 0 },
1288 /* 0xcf */ { NULL, NULL, 0 },
1289 /* 0xd0 */ { "SMBsends",reply_sends,AS_GUEST},
1290 /* 0xd1 */ { "SMBsendb", NULL,AS_GUEST},
1291 /* 0xd2 */ { "SMBfwdname", NULL,AS_GUEST},
1292 /* 0xd3 */ { "SMBcancelf", NULL,AS_GUEST},
1293 /* 0xd4 */ { "SMBgetmac", NULL,AS_GUEST},
1294 /* 0xd5 */ { "SMBsendstrt",reply_sendstrt,AS_GUEST},
1295 /* 0xd6 */ { "SMBsendend",reply_sendend,AS_GUEST},
1296 /* 0xd7 */ { "SMBsendtxt",reply_sendtxt,AS_GUEST},
1297 /* 0xd8 */ { NULL, NULL, 0 },
1298 /* 0xd9 */ { NULL, NULL, 0 },
1299 /* 0xda */ { NULL, NULL, 0 },
1300 /* 0xdb */ { NULL, NULL, 0 },
1301 /* 0xdc */ { NULL, NULL, 0 },
1302 /* 0xdd */ { NULL, NULL, 0 },
1303 /* 0xde */ { NULL, NULL, 0 },
1304 /* 0xdf */ { NULL, NULL, 0 },
1305 /* 0xe0 */ { NULL, NULL, 0 },
1306 /* 0xe1 */ { NULL, NULL, 0 },
1307 /* 0xe2 */ { NULL, NULL, 0 },
1308 /* 0xe3 */ { NULL, NULL, 0 },
1309 /* 0xe4 */ { NULL, NULL, 0 },
1310 /* 0xe5 */ { NULL, NULL, 0 },
1311 /* 0xe6 */ { NULL, NULL, 0 },
1312 /* 0xe7 */ { NULL, NULL, 0 },
1313 /* 0xe8 */ { NULL, NULL, 0 },
1314 /* 0xe9 */ { NULL, NULL, 0 },
1315 /* 0xea */ { NULL, NULL, 0 },
1316 /* 0xeb */ { NULL, NULL, 0 },
1317 /* 0xec */ { NULL, NULL, 0 },
1318 /* 0xed */ { NULL, NULL, 0 },
1319 /* 0xee */ { NULL, NULL, 0 },
1320 /* 0xef */ { NULL, NULL, 0 },
1321 /* 0xf0 */ { NULL, NULL, 0 },
1322 /* 0xf1 */ { NULL, NULL, 0 },
1323 /* 0xf2 */ { NULL, NULL, 0 },
1324 /* 0xf3 */ { NULL, NULL, 0 },
1325 /* 0xf4 */ { NULL, NULL, 0 },
1326 /* 0xf5 */ { NULL, NULL, 0 },
1327 /* 0xf6 */ { NULL, NULL, 0 },
1328 /* 0xf7 */ { NULL, NULL, 0 },
1329 /* 0xf8 */ { NULL, NULL, 0 },
1330 /* 0xf9 */ { NULL, NULL, 0 },
1331 /* 0xfa */ { NULL, NULL, 0 },
1332 /* 0xfb */ { NULL, NULL, 0 },
1333 /* 0xfc */ { NULL, NULL, 0 },
1334 /* 0xfd */ { NULL, NULL, 0 },
1335 /* 0xfe */ { NULL, NULL, 0 },
1336 /* 0xff */ { NULL, NULL, 0 }
1337
1338 };
1339
1340 /*******************************************************************
1341  allocate and initialize a reply packet
1342 ********************************************************************/
1343
1344 static bool create_outbuf(TALLOC_CTX *mem_ctx, struct smb_request *req,
1345                           const uint8_t *inbuf, char **outbuf,
1346                           uint8_t num_words, uint32_t num_bytes)
1347 {
1348         size_t smb_len = MIN_SMB_SIZE + VWV(num_words) + num_bytes;
1349
1350         /*
1351          * Protect against integer wrap.
1352          * The SMB layer reply can be up to 0xFFFFFF bytes.
1353          */
1354         if ((num_bytes > 0xffffff) || (smb_len > 0xffffff)) {
1355                 char *msg;
1356                 if (asprintf(&msg, "num_bytes too large: %u",
1357                              (unsigned)num_bytes) == -1) {
1358                         msg = discard_const_p(char, "num_bytes too large");
1359                 }
1360                 smb_panic(msg);
1361         }
1362
1363         /*
1364          * Here we include the NBT header for now.
1365          */
1366         *outbuf = talloc_array(mem_ctx, char,
1367                                NBT_HDR_SIZE + smb_len);
1368         if (*outbuf == NULL) {
1369                 return false;
1370         }
1371
1372         construct_reply_common(req->cmd, inbuf, *outbuf);
1373         srv_set_message(*outbuf, num_words, num_bytes, false);
1374         /*
1375          * Zero out the word area, the caller has to take care of the bcc area
1376          * himself
1377          */
1378         if (num_words != 0) {
1379                 memset(*outbuf + (NBT_HDR_SIZE + HDR_VWV), 0, VWV(num_words));
1380         }
1381
1382         return true;
1383 }
1384
1385 void reply_outbuf(struct smb_request *req, uint8_t num_words, uint32_t num_bytes)
1386 {
1387         char *outbuf;
1388         if (!create_outbuf(req, req, req->inbuf, &outbuf, num_words,
1389                            num_bytes)) {
1390                 smb_panic("could not allocate output buffer\n");
1391         }
1392         req->outbuf = (uint8_t *)outbuf;
1393 }
1394
1395
1396 /*******************************************************************
1397  Dump a packet to a file.
1398 ********************************************************************/
1399
1400 static void smb_dump(const char *name, int type, const char *data)
1401 {
1402         size_t len;
1403         int fd, i;
1404         char *fname = NULL;
1405         if (DEBUGLEVEL < 50) {
1406                 return;
1407         }
1408
1409         len = smb_len_tcp(data)+4;
1410         for (i=1;i<100;i++) {
1411                 fname = talloc_asprintf(talloc_tos(),
1412                                 "/tmp/%s.%d.%s",
1413                                 name,
1414                                 i,
1415                                 type ? "req" : "resp");
1416                 if (fname == NULL) {
1417                         return;
1418                 }
1419                 fd = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0644);
1420                 if (fd != -1 || errno != EEXIST) break;
1421                 TALLOC_FREE(fname);
1422         }
1423         if (fd != -1) {
1424                 ssize_t ret = write(fd, data, len);
1425                 if (ret != len)
1426                         DEBUG(0,("smb_dump: problem: write returned %d\n", (int)ret ));
1427                 close(fd);
1428                 DEBUG(0,("created %s len %lu\n", fname, (unsigned long)len));
1429         }
1430         TALLOC_FREE(fname);
1431 }
1432
1433 /****************************************************************************
1434  Prepare everything for calling the actual request function, and potentially
1435  call the request function via the "new" interface.
1436
1437  Return False if the "legacy" function needs to be called, everything is
1438  prepared.
1439
1440  Return True if we're done.
1441
1442  I know this API sucks, but it is the one with the least code change I could
1443  find.
1444 ****************************************************************************/
1445
1446 static connection_struct *switch_message(uint8_t type, struct smb_request *req)
1447 {
1448         int flags;
1449         uint64_t session_tag;
1450         connection_struct *conn = NULL;
1451         struct smbXsrv_connection *xconn = req->xconn;
1452         NTTIME now = timeval_to_nttime(&req->request_time);
1453         struct smbXsrv_session *session = NULL;
1454         NTSTATUS status;
1455
1456         errno = 0;
1457
1458         if (!xconn->smb1.negprot.done) {
1459                 switch (type) {
1460                         /*
1461                          * Without a negprot the request must
1462                          * either be a negprot, or one of the
1463                          * evil old SMB mailslot messaging types.
1464                          */
1465                         case SMBnegprot:
1466                         case SMBsendstrt:
1467                         case SMBsendend:
1468                         case SMBsendtxt:
1469                                 break;
1470                         default:
1471                                 exit_server_cleanly("The first request "
1472                                         "should be a negprot");
1473                 }
1474         }
1475
1476         if (smb_messages[type].fn == NULL) {
1477                 DEBUG(0,("Unknown message type %d!\n",type));
1478                 smb_dump("Unknown", 1, (const char *)req->inbuf);
1479                 reply_unknown_new(req, type);
1480                 return NULL;
1481         }
1482
1483         flags = smb_messages[type].flags;
1484
1485         /* In share mode security we must ignore the vuid. */
1486         session_tag = req->vuid;
1487         conn = req->conn;
1488
1489         DEBUG(3,("switch message %s (pid %d) conn 0x%lx\n", smb_fn_name(type),
1490                  (int)getpid(), (unsigned long)conn));
1491
1492         smb_dump(smb_fn_name(type), 1, (const char *)req->inbuf);
1493
1494         /* Ensure this value is replaced in the incoming packet. */
1495         SSVAL(discard_const_p(uint8_t, req->inbuf),smb_uid,session_tag);
1496
1497         /*
1498          * Ensure the correct username is in current_user_info.  This is a
1499          * really ugly bugfix for problems with multiple session_setup_and_X's
1500          * being done and allowing %U and %G substitutions to work correctly.
1501          * There is a reason this code is done here, don't move it unless you
1502          * know what you're doing... :-).
1503          * JRA.
1504          */
1505
1506         /*
1507          * lookup an existing session
1508          *
1509          * Note: for now we only check for NT_STATUS_NETWORK_SESSION_EXPIRED
1510          * here, the main check is still in change_to_user()
1511          */
1512         status = smb1srv_session_lookup(xconn,
1513                                         session_tag,
1514                                         now,
1515                                         &session);
1516         if (NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_SESSION_EXPIRED)) {
1517                 switch (type) {
1518                 case SMBsesssetupX:
1519                         status = NT_STATUS_OK;
1520                         break;
1521                 default:
1522                         DEBUG(1,("Error: session %llu is expired, mid=%llu.\n",
1523                                  (unsigned long long)session_tag,
1524                                  (unsigned long long)req->mid));
1525                         reply_nterror(req, NT_STATUS_NETWORK_SESSION_EXPIRED);
1526                         return conn;
1527                 }
1528         }
1529
1530         if (session_tag != xconn->client->last_session_id) {
1531                 struct user_struct *vuser = NULL;
1532
1533                 xconn->client->last_session_id = session_tag;
1534                 if (session) {
1535                         vuser = session->compat;
1536                 }
1537                 if (vuser) {
1538                         set_current_user_info(
1539                                 vuser->session_info->unix_info->sanitized_username,
1540                                 vuser->session_info->unix_info->unix_name,
1541                                 vuser->session_info->info->domain_name);
1542                 }
1543         }
1544
1545         /* Does this call need to be run as the connected user? */
1546         if (flags & AS_USER) {
1547
1548                 /* Does this call need a valid tree connection? */
1549                 if (!conn) {
1550                         /*
1551                          * Amazingly, the error code depends on the command
1552                          * (from Samba4).
1553                          */
1554                         if (type == SMBntcreateX) {
1555                                 reply_nterror(req, NT_STATUS_INVALID_HANDLE);
1556                         } else {
1557                                 reply_nterror(req, NT_STATUS_NETWORK_NAME_DELETED);
1558                         }
1559                         return NULL;
1560                 }
1561
1562                 if (!change_to_user(conn,session_tag)) {
1563                         DEBUG(0, ("Error: Could not change to user. Removing "
1564                                 "deferred open, mid=%llu.\n",
1565                                 (unsigned long long)req->mid));
1566                         reply_force_doserror(req, ERRSRV, ERRbaduid);
1567                         return conn;
1568                 }
1569
1570                 /* All NEED_WRITE and CAN_IPC flags must also have AS_USER. */
1571
1572                 /* Does it need write permission? */
1573                 if ((flags & NEED_WRITE) && !CAN_WRITE(conn)) {
1574                         reply_nterror(req, NT_STATUS_MEDIA_WRITE_PROTECTED);
1575                         return conn;
1576                 }
1577
1578                 /* IPC services are limited */
1579                 if (IS_IPC(conn) && !(flags & CAN_IPC)) {
1580                         reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1581                         return conn;
1582                 }
1583         } else {
1584                 /* This call needs to be run as root */
1585                 change_to_root_user();
1586         }
1587
1588         /* load service specific parameters */
1589         if (conn) {
1590                 if (req->encrypted) {
1591                         conn->encrypted_tid = true;
1592                         /* encrypted required from now on. */
1593                         conn->encrypt_level = SMB_SIGNING_REQUIRED;
1594                 } else if (ENCRYPTION_REQUIRED(conn)) {
1595                         if (req->cmd != SMBtrans2 && req->cmd != SMBtranss2) {
1596                                 DEBUG(1,("service[%s] requires encryption"
1597                                         "%s ACCESS_DENIED. mid=%llu\n",
1598                                         lp_servicename(talloc_tos(), SNUM(conn)),
1599                                         smb_fn_name(type),
1600                                         (unsigned long long)req->mid));
1601                                 reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1602                                 return conn;
1603                         }
1604                 }
1605
1606                 if (!set_current_service(conn,SVAL(req->inbuf,smb_flg),
1607                                          (flags & (AS_USER|DO_CHDIR)
1608                                           ?True:False))) {
1609                         reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1610                         return conn;
1611                 }
1612                 conn->num_smb_operations++;
1613         }
1614
1615         /*
1616          * Does this protocol need to be run as guest? (Only archane
1617          * messenger service requests have this...)
1618          */
1619         if (flags & AS_GUEST) {
1620                 char *raddr;
1621                 bool ok;
1622
1623                 if (!change_to_guest()) {
1624                         reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1625                         return conn;
1626                 }
1627
1628                 raddr = tsocket_address_inet_addr_string(xconn->remote_address,
1629                                                          talloc_tos());
1630                 if (raddr == NULL) {
1631                         reply_nterror(req, NT_STATUS_NO_MEMORY);
1632                         return conn;
1633                 }
1634
1635                 /*
1636                  * Haven't we checked this in smbd_process already???
1637                  */
1638
1639                 ok = allow_access(lp_hosts_deny(-1), lp_hosts_allow(-1),
1640                                   xconn->remote_hostname, raddr);
1641                 TALLOC_FREE(raddr);
1642
1643                 if (!ok) {
1644                         reply_nterror(req, NT_STATUS_ACCESS_DENIED);
1645                         return conn;
1646                 }
1647         }
1648
1649         smb_messages[type].fn(req);
1650         return req->conn;
1651 }
1652
1653 /****************************************************************************
1654  Construct a reply to the incoming packet.
1655 ****************************************************************************/
1656
1657 static void construct_reply(struct smbXsrv_connection *xconn,
1658                             char *inbuf, int size, size_t unread_bytes,
1659                             uint32_t seqnum, bool encrypted,
1660                             struct smb_perfcount_data *deferred_pcd)
1661 {
1662         struct smbd_server_connection *sconn = xconn->client->sconn;
1663         struct smb_request *req;
1664
1665         if (!(req = talloc(talloc_tos(), struct smb_request))) {
1666                 smb_panic("could not allocate smb_request");
1667         }
1668
1669         if (!init_smb_request(req, sconn, xconn, (uint8_t *)inbuf, unread_bytes,
1670                               encrypted, seqnum)) {
1671                 exit_server_cleanly("Invalid SMB request");
1672         }
1673
1674         req->inbuf  = (uint8_t *)talloc_move(req, &inbuf);
1675
1676         /* we popped this message off the queue - keep original perf data */
1677         if (deferred_pcd)
1678                 req->pcd = *deferred_pcd;
1679         else {
1680                 SMB_PERFCOUNT_START(&req->pcd);
1681                 SMB_PERFCOUNT_SET_OP(&req->pcd, req->cmd);
1682                 SMB_PERFCOUNT_SET_MSGLEN_IN(&req->pcd, size);
1683         }
1684
1685         req->conn = switch_message(req->cmd, req);
1686
1687         if (req->outbuf == NULL) {
1688                 /*
1689                  * Request has suspended itself, will come
1690                  * back here.
1691                  */
1692                 return;
1693         }
1694         if (CVAL(req->outbuf,0) == 0) {
1695                 show_msg((char *)req->outbuf);
1696         }
1697         smb_request_done(req);
1698 }
1699
1700 static void construct_reply_chain(struct smbXsrv_connection *xconn,
1701                                   char *inbuf, int size, uint32_t seqnum,
1702                                   bool encrypted,
1703                                   struct smb_perfcount_data *deferred_pcd)
1704 {
1705         struct smb_request **reqs = NULL;
1706         struct smb_request *req;
1707         unsigned num_reqs;
1708         bool ok;
1709
1710         ok = smb1_parse_chain(talloc_tos(), (uint8_t *)inbuf, xconn, encrypted,
1711                               seqnum, &reqs, &num_reqs);
1712         if (!ok) {
1713                 char errbuf[smb_size];
1714                 error_packet(errbuf, 0, 0, NT_STATUS_INVALID_PARAMETER,
1715                              __LINE__, __FILE__);
1716                 if (!srv_send_smb(xconn, errbuf, true, seqnum, encrypted,
1717                                   NULL)) {
1718                         exit_server_cleanly("construct_reply_chain: "
1719                                             "srv_send_smb failed.");
1720                 }
1721                 return;
1722         }
1723
1724         req = reqs[0];
1725         req->inbuf = (uint8_t *)talloc_move(reqs, &inbuf);
1726
1727         req->conn = switch_message(req->cmd, req);
1728
1729         if (req->outbuf == NULL) {
1730                 /*
1731                  * Request has suspended itself, will come
1732                  * back here.
1733                  */
1734                 return;
1735         }
1736         smb_request_done(req);
1737 }
1738
1739 /*
1740  * To be called from an async SMB handler that is potentially chained
1741  * when it is finished for shipping.
1742  */
1743
1744 void smb_request_done(struct smb_request *req)
1745 {
1746         struct smb_request **reqs = NULL;
1747         struct smb_request *first_req;
1748         size_t i, num_reqs, next_index;
1749         NTSTATUS status;
1750
1751         if (req->chain == NULL) {
1752                 first_req = req;
1753                 goto shipit;
1754         }
1755
1756         reqs = req->chain;
1757         num_reqs = talloc_array_length(reqs);
1758
1759         for (i=0; i<num_reqs; i++) {
1760                 if (reqs[i] == req) {
1761                         break;
1762                 }
1763         }
1764         if (i == num_reqs) {
1765                 /*
1766                  * Invalid chain, should not happen
1767                  */
1768                 status = NT_STATUS_INTERNAL_ERROR;
1769                 goto error;
1770         }
1771         next_index = i+1;
1772
1773         while ((next_index < num_reqs) && (IVAL(req->outbuf, smb_rcls) == 0)) {
1774                 struct smb_request *next = reqs[next_index];
1775                 struct smbXsrv_tcon *tcon;
1776                 NTTIME now = timeval_to_nttime(&req->request_time);
1777
1778                 next->vuid = SVAL(req->outbuf, smb_uid);
1779                 next->tid  = SVAL(req->outbuf, smb_tid);
1780                 status = smb1srv_tcon_lookup(req->xconn, req->tid,
1781                                              now, &tcon);
1782                 if (NT_STATUS_IS_OK(status)) {
1783                         req->conn = tcon->compat;
1784                 } else {
1785                         req->conn = NULL;
1786                 }
1787                 next->chain_fsp = req->chain_fsp;
1788                 next->inbuf = req->inbuf;
1789
1790                 req = next;
1791                 req->conn = switch_message(req->cmd, req);
1792
1793                 if (req->outbuf == NULL) {
1794                         /*
1795                          * Request has suspended itself, will come
1796                          * back here.
1797                          */
1798                         return;
1799                 }
1800                 next_index += 1;
1801         }
1802
1803         first_req = reqs[0];
1804
1805         for (i=1; i<next_index; i++) {
1806                 bool ok;
1807
1808                 ok = smb_splice_chain(&first_req->outbuf, reqs[i]->outbuf);
1809                 if (!ok) {
1810                         status = NT_STATUS_INTERNAL_ERROR;
1811                         goto error;
1812                 }
1813         }
1814
1815         SSVAL(first_req->outbuf, smb_uid, SVAL(req->outbuf, smb_uid));
1816         SSVAL(first_req->outbuf, smb_tid, SVAL(req->outbuf, smb_tid));
1817
1818         /*
1819          * This scary statement intends to set the
1820          * FLAGS2_32_BIT_ERROR_CODES flg2 field in first_req->outbuf
1821          * to the value last_req->outbuf carries
1822          */
1823         SSVAL(first_req->outbuf, smb_flg2,
1824               (SVAL(first_req->outbuf, smb_flg2) & ~FLAGS2_32_BIT_ERROR_CODES)
1825               |(SVAL(req->outbuf, smb_flg2) & FLAGS2_32_BIT_ERROR_CODES));
1826
1827         /*
1828          * Transfer the error codes from the subrequest to the main one
1829          */
1830         SSVAL(first_req->outbuf, smb_rcls, SVAL(req->outbuf, smb_rcls));
1831         SSVAL(first_req->outbuf, smb_err,  SVAL(req->outbuf, smb_err));
1832
1833         _smb_setlen_large(
1834                 first_req->outbuf, talloc_get_size(first_req->outbuf) - 4);
1835
1836 shipit:
1837         if (!srv_send_smb(first_req->xconn,
1838                           (char *)first_req->outbuf,
1839                           true, first_req->seqnum+1,
1840                           IS_CONN_ENCRYPTED(req->conn)||first_req->encrypted,
1841                           &first_req->pcd)) {
1842                 exit_server_cleanly("construct_reply_chain: srv_send_smb "
1843                                     "failed.");
1844         }
1845         TALLOC_FREE(req);       /* non-chained case */
1846         TALLOC_FREE(reqs);      /* chained case */
1847         return;
1848
1849 error:
1850         {
1851                 char errbuf[smb_size];
1852                 error_packet(errbuf, 0, 0, status, __LINE__, __FILE__);
1853                 if (!srv_send_smb(req->xconn, errbuf, true,
1854                                   req->seqnum+1, req->encrypted,
1855                                   NULL)) {
1856                         exit_server_cleanly("construct_reply_chain: "
1857                                             "srv_send_smb failed.");
1858                 }
1859         }
1860         TALLOC_FREE(req);       /* non-chained case */
1861         TALLOC_FREE(reqs);      /* chained case */
1862 }
1863
1864 /****************************************************************************
1865  Process an smb from the client
1866 ****************************************************************************/
1867 static void process_smb(struct smbXsrv_connection *xconn,
1868                         uint8_t *inbuf, size_t nread, size_t unread_bytes,
1869                         uint32_t seqnum, bool encrypted,
1870                         struct smb_perfcount_data *deferred_pcd)
1871 {
1872         struct smbd_server_connection *sconn = xconn->client->sconn;
1873         int msg_type = CVAL(inbuf,0);
1874
1875         DO_PROFILE_INC(request);
1876
1877         DEBUG( 6, ( "got message type 0x%x of len 0x%x\n", msg_type,
1878                     smb_len(inbuf) ) );
1879         DEBUG(3, ("Transaction %d of length %d (%u toread)\n",
1880                   sconn->trans_num, (int)nread, (unsigned int)unread_bytes));
1881
1882         if (msg_type != NBSSmessage) {
1883                 /*
1884                  * NetBIOS session request, keepalive, etc.
1885                  */
1886                 reply_special(xconn, (char *)inbuf, nread);
1887                 goto done;
1888         }
1889
1890         if (sconn->using_smb2) {
1891                 /* At this point we're not really using smb2,
1892                  * we make the decision here.. */
1893                 if (smbd_is_smb2_header(inbuf, nread)) {
1894                         const uint8_t *inpdu = inbuf + NBT_HDR_SIZE;
1895                         size_t pdulen = nread - NBT_HDR_SIZE;
1896                         smbd_smb2_first_negprot(xconn, inpdu, pdulen);
1897                         return;
1898                 } else if (nread >= smb_size && valid_smb_header(inbuf)
1899                                 && CVAL(inbuf, smb_com) != 0x72) {
1900                         /* This is a non-negprot SMB1 packet.
1901                            Disable SMB2 from now on. */
1902                         sconn->using_smb2 = false;
1903                 }
1904         }
1905
1906         /* Make sure this is an SMB packet. smb_size contains NetBIOS header
1907          * so subtract 4 from it. */
1908         if ((nread < (smb_size - 4)) || !valid_smb_header(inbuf)) {
1909                 DEBUG(2,("Non-SMB packet of length %d. Terminating server\n",
1910                          smb_len(inbuf)));
1911
1912                 /* special magic for immediate exit */
1913                 if ((nread == 9) &&
1914                     (IVAL(inbuf, 4) == 0x74697865) &&
1915                     lp_parm_bool(-1, "smbd", "suicide mode", false)) {
1916                         uint8_t exitcode = CVAL(inbuf, 8);
1917                         DEBUG(1, ("Exiting immediately with code %d\n",
1918                                   (int)exitcode));
1919                         exit(exitcode);
1920                 }
1921
1922                 exit_server_cleanly("Non-SMB packet");
1923         }
1924
1925         show_msg((char *)inbuf);
1926
1927         if ((unread_bytes == 0) && smb1_is_chain(inbuf)) {
1928                 construct_reply_chain(xconn, (char *)inbuf, nread,
1929                                       seqnum, encrypted, deferred_pcd);
1930         } else {
1931                 construct_reply(xconn, (char *)inbuf, nread, unread_bytes,
1932                                 seqnum, encrypted, deferred_pcd);
1933         }
1934
1935         sconn->trans_num++;
1936
1937 done:
1938         sconn->num_requests++;
1939
1940         /* The timeout_processing function isn't run nearly
1941            often enough to implement 'max log size' without
1942            overrunning the size of the file by many megabytes.
1943            This is especially true if we are running at debug
1944            level 10.  Checking every 50 SMBs is a nice
1945            tradeoff of performance vs log file size overrun. */
1946
1947         if ((sconn->num_requests % 50) == 0 &&
1948             need_to_check_log_size()) {
1949                 change_to_root_user();
1950                 check_log_size();
1951         }
1952 }
1953
1954 /****************************************************************************
1955  Return a string containing the function name of a SMB command.
1956 ****************************************************************************/
1957
1958 const char *smb_fn_name(int type)
1959 {
1960         const char *unknown_name = "SMBunknown";
1961
1962         if (smb_messages[type].name == NULL)
1963                 return(unknown_name);
1964
1965         return(smb_messages[type].name);
1966 }
1967
1968 /****************************************************************************
1969  Helper functions for contruct_reply.
1970 ****************************************************************************/
1971
1972 void add_to_common_flags2(uint32_t v)
1973 {
1974         common_flags2 |= v;
1975 }
1976
1977 void remove_from_common_flags2(uint32_t v)
1978 {
1979         common_flags2 &= ~v;
1980 }
1981
1982 static void construct_reply_common(uint8_t cmd, const uint8_t *inbuf,
1983                                    char *outbuf)
1984 {
1985         uint16_t in_flags2 = SVAL(inbuf,smb_flg2);
1986         uint16_t out_flags2 = common_flags2;
1987
1988         out_flags2 |= in_flags2 & FLAGS2_UNICODE_STRINGS;
1989         out_flags2 |= in_flags2 & FLAGS2_SMB_SECURITY_SIGNATURES;
1990         out_flags2 |= in_flags2 & FLAGS2_SMB_SECURITY_SIGNATURES_REQUIRED;
1991
1992         srv_set_message(outbuf,0,0,false);
1993
1994         SCVAL(outbuf, smb_com, cmd);
1995         SIVAL(outbuf,smb_rcls,0);
1996         SCVAL(outbuf,smb_flg, FLAG_REPLY | (CVAL(inbuf,smb_flg) & FLAG_CASELESS_PATHNAMES)); 
1997         SSVAL(outbuf,smb_flg2, out_flags2);
1998         memset(outbuf+smb_pidhigh,'\0',(smb_tid-smb_pidhigh));
1999         memcpy(outbuf+smb_ss_field, inbuf+smb_ss_field, 8);
2000
2001         SSVAL(outbuf,smb_tid,SVAL(inbuf,smb_tid));
2002         SSVAL(outbuf,smb_pid,SVAL(inbuf,smb_pid));
2003         SSVAL(outbuf,smb_uid,SVAL(inbuf,smb_uid));
2004         SSVAL(outbuf,smb_mid,SVAL(inbuf,smb_mid));
2005 }
2006
2007 void construct_reply_common_req(struct smb_request *req, char *outbuf)
2008 {
2009         construct_reply_common(req->cmd, req->inbuf, outbuf);
2010 }
2011
2012 /**
2013  * @brief Find the smb_cmd offset of the last command pushed
2014  * @param[in] buf       The buffer we're building up
2015  * @retval              Where can we put our next andx cmd?
2016  *
2017  * While chaining requests, the "next" request we're looking at needs to put
2018  * its SMB_Command before the data the previous request already built up added
2019  * to the chain. Find the offset to the place where we have to put our cmd.
2020  */
2021
2022 static bool find_andx_cmd_ofs(uint8_t *buf, size_t *pofs)
2023 {
2024         uint8_t cmd;
2025         size_t ofs;
2026
2027         cmd = CVAL(buf, smb_com);
2028
2029         if (!is_andx_req(cmd)) {
2030                 return false;
2031         }
2032
2033         ofs = smb_vwv0;
2034
2035         while (CVAL(buf, ofs) != 0xff) {
2036
2037                 if (!is_andx_req(CVAL(buf, ofs))) {
2038                         return false;
2039                 }
2040
2041                 /*
2042                  * ofs is from start of smb header, so add the 4 length
2043                  * bytes. The next cmd is right after the wct field.
2044                  */
2045                 ofs = SVAL(buf, ofs+2) + 4 + 1;
2046
2047                 if (ofs+4 >= talloc_get_size(buf)) {
2048                         return false;
2049                 }
2050         }
2051
2052         *pofs = ofs;
2053         return true;
2054 }
2055
2056 /**
2057  * @brief Do the smb chaining at a buffer level
2058  * @param[in] poutbuf           Pointer to the talloc'ed buffer to be modified
2059  * @param[in] andx_buf          Buffer to be appended
2060  */
2061
2062 static bool smb_splice_chain(uint8_t **poutbuf, const uint8_t *andx_buf)
2063 {
2064         uint8_t smb_command     = CVAL(andx_buf, smb_com);
2065         uint8_t wct             = CVAL(andx_buf, smb_wct);
2066         const uint16_t *vwv     = (const uint16_t *)(andx_buf + smb_vwv);
2067         uint32_t num_bytes      = smb_buflen(andx_buf);
2068         const uint8_t *bytes    = (const uint8_t *)smb_buf_const(andx_buf);
2069
2070         uint8_t *outbuf;
2071         size_t old_size, new_size;
2072         size_t ofs;
2073         size_t chain_padding = 0;
2074         size_t andx_cmd_ofs;
2075
2076
2077         old_size = talloc_get_size(*poutbuf);
2078
2079         if ((old_size % 4) != 0) {
2080                 /*
2081                  * Align the wct field of subsequent requests to a 4-byte
2082                  * boundary
2083                  */
2084                 chain_padding = 4 - (old_size % 4);
2085         }
2086
2087         /*
2088          * After the old request comes the new wct field (1 byte), the vwv's
2089          * and the num_bytes field.
2090          */
2091
2092         new_size = old_size + chain_padding + 1 + wct * sizeof(uint16_t) + 2;
2093         new_size += num_bytes;
2094
2095         if ((smb_command != SMBwriteX) && (new_size > 0xffff)) {
2096                 DEBUG(1, ("smb_splice_chain: %u bytes won't fit\n",
2097                           (unsigned)new_size));
2098                 return false;
2099         }
2100
2101         outbuf = talloc_realloc(NULL, *poutbuf, uint8_t, new_size);
2102         if (outbuf == NULL) {
2103                 DEBUG(0, ("talloc failed\n"));
2104                 return false;
2105         }
2106         *poutbuf = outbuf;
2107
2108         if (!find_andx_cmd_ofs(outbuf, &andx_cmd_ofs)) {
2109                 DEBUG(1, ("invalid command chain\n"));
2110                 *poutbuf = talloc_realloc(NULL, *poutbuf, uint8_t, old_size);
2111                 return false;
2112         }
2113
2114         if (chain_padding != 0) {
2115                 memset(outbuf + old_size, 0, chain_padding);
2116                 old_size += chain_padding;
2117         }
2118
2119         SCVAL(outbuf, andx_cmd_ofs, smb_command);
2120         SSVAL(outbuf, andx_cmd_ofs + 2, old_size - 4);
2121
2122         ofs = old_size;
2123
2124         /*
2125          * Push the chained request:
2126          *
2127          * wct field
2128          */
2129
2130         SCVAL(outbuf, ofs, wct);
2131         ofs += 1;
2132
2133         /*
2134          * vwv array
2135          */
2136
2137         memcpy(outbuf + ofs, vwv, sizeof(uint16_t) * wct);
2138
2139         /*
2140          * HACK ALERT
2141          *
2142          * Read&X has an offset into its data buffer at
2143          * vwv[6]. reply_read_andx has no idea anymore that it's
2144          * running from within a chain, so we have to fix up the
2145          * offset here.
2146          *
2147          * Although it looks disgusting at this place, I want to keep
2148          * it here. The alternative would be to push knowledge about
2149          * the andx chain down into read&x again.
2150          */
2151
2152         if (smb_command == SMBreadX) {
2153                 uint8_t *bytes_addr;
2154
2155                 if (wct < 7) {
2156                         /*
2157                          * Invalid read&x response
2158                          */
2159                         return false;
2160                 }
2161
2162                 bytes_addr = outbuf + ofs        /* vwv start */
2163                         + sizeof(uint16_t) * wct /* vwv array */
2164                         + sizeof(uint16_t)       /* bcc */
2165                         + 1;                     /* padding byte */
2166
2167                 SSVAL(outbuf + ofs, 6 * sizeof(uint16_t),
2168                       bytes_addr - outbuf - 4);
2169         }
2170
2171         ofs += sizeof(uint16_t) * wct;
2172
2173         /*
2174          * bcc (byte count)
2175          */
2176
2177         SSVAL(outbuf, ofs, num_bytes);
2178         ofs += sizeof(uint16_t);
2179
2180         /*
2181          * The bytes field
2182          */
2183
2184         memcpy(outbuf + ofs, bytes, num_bytes);
2185
2186         return true;
2187 }
2188
2189 bool smb1_is_chain(const uint8_t *buf)
2190 {
2191         uint8_t cmd, wct, andx_cmd;
2192
2193         cmd = CVAL(buf, smb_com);
2194         if (!is_andx_req(cmd)) {
2195                 return false;
2196         }
2197         wct = CVAL(buf, smb_wct);
2198         if (wct < 2) {
2199                 return false;
2200         }
2201         andx_cmd = CVAL(buf, smb_vwv);
2202         return (andx_cmd != 0xFF);
2203 }
2204
2205 bool smb1_walk_chain(const uint8_t *buf,
2206                      bool (*fn)(uint8_t cmd,
2207                                 uint8_t wct, const uint16_t *vwv,
2208                                 uint16_t num_bytes, const uint8_t *bytes,
2209                                 void *private_data),
2210                      void *private_data)
2211 {
2212         size_t smblen = smb_len(buf);
2213         const char *smb_buf = smb_base(buf);
2214         uint8_t cmd, chain_cmd;
2215         uint8_t wct;
2216         const uint16_t *vwv;
2217         uint16_t num_bytes;
2218         const uint8_t *bytes;
2219
2220         cmd = CVAL(buf, smb_com);
2221         wct = CVAL(buf, smb_wct);
2222         vwv = (const uint16_t *)(buf + smb_vwv);
2223         num_bytes = smb_buflen(buf);
2224         bytes = (const uint8_t *)smb_buf_const(buf);
2225
2226         if (!fn(cmd, wct, vwv, num_bytes, bytes, private_data)) {
2227                 return false;
2228         }
2229
2230         if (!is_andx_req(cmd)) {
2231                 return true;
2232         }
2233         if (wct < 2) {
2234                 return false;
2235         }
2236
2237         chain_cmd = CVAL(vwv, 0);
2238
2239         while (chain_cmd != 0xff) {
2240                 uint32_t chain_offset;  /* uint32_t to avoid overflow */
2241                 size_t length_needed;
2242                 ptrdiff_t vwv_offset;
2243
2244                 chain_offset = SVAL(vwv+1, 0);
2245
2246                 /*
2247                  * Check if the client tries to fool us. The chain
2248                  * offset needs to point beyond the current request in
2249                  * the chain, it needs to strictly grow. Otherwise we
2250                  * might be tricked into an endless loop always
2251                  * processing the same request over and over again. We
2252                  * used to assume that vwv and the byte buffer array
2253                  * in a chain are always attached, but OS/2 the
2254                  * Write&X/Read&X chain puts the Read&X vwv array
2255                  * right behind the Write&X vwv chain. The Write&X bcc
2256                  * array is put behind the Read&X vwv array. So now we
2257                  * check whether the chain offset points strictly
2258                  * behind the previous vwv array. req->buf points
2259                  * right after the vwv array of the previous
2260                  * request. See
2261                  * https://bugzilla.samba.org/show_bug.cgi?id=8360 for
2262                  * more information.
2263                  */
2264
2265                 vwv_offset = ((const char *)vwv - smb_buf);
2266                 if (chain_offset <= vwv_offset) {
2267                         return false;
2268                 }
2269
2270                 /*
2271                  * Next check: Make sure the chain offset does not
2272                  * point beyond the overall smb request length.
2273                  */
2274
2275                 length_needed = chain_offset+1; /* wct */
2276                 if (length_needed > smblen) {
2277                         return false;
2278                 }
2279
2280                 /*
2281                  * Now comes the pointer magic. Goal here is to set up
2282                  * vwv and buf correctly again. The chain offset (the
2283                  * former vwv[1]) points at the new wct field.
2284                  */
2285
2286                 wct = CVAL(smb_buf, chain_offset);
2287
2288                 if (is_andx_req(chain_cmd) && (wct < 2)) {
2289                         return false;
2290                 }
2291
2292                 /*
2293                  * Next consistency check: Make the new vwv array fits
2294                  * in the overall smb request.
2295                  */
2296
2297                 length_needed += (wct+1)*sizeof(uint16_t); /* vwv+buflen */
2298                 if (length_needed > smblen) {
2299                         return false;
2300                 }
2301                 vwv = (const uint16_t *)(smb_buf + chain_offset + 1);
2302
2303                 /*
2304                  * Now grab the new byte buffer....
2305                  */
2306
2307                 num_bytes = SVAL(vwv+wct, 0);
2308
2309                 /*
2310                  * .. and check that it fits.
2311                  */
2312
2313                 length_needed += num_bytes;
2314                 if (length_needed > smblen) {
2315                         return false;
2316                 }
2317                 bytes = (const uint8_t *)(vwv+wct+1);
2318
2319                 if (!fn(chain_cmd, wct, vwv, num_bytes, bytes, private_data)) {
2320                         return false;
2321                 }
2322
2323                 if (!is_andx_req(chain_cmd)) {
2324                         return true;
2325                 }
2326                 chain_cmd = CVAL(vwv, 0);
2327         }
2328         return true;
2329 }
2330
2331 static bool smb1_chain_length_cb(uint8_t cmd,
2332                                  uint8_t wct, const uint16_t *vwv,
2333                                  uint16_t num_bytes, const uint8_t *bytes,
2334                                  void *private_data)
2335 {
2336         unsigned *count = (unsigned *)private_data;
2337         *count += 1;
2338         return true;
2339 }
2340
2341 unsigned smb1_chain_length(const uint8_t *buf)
2342 {
2343         unsigned count = 0;
2344
2345         if (!smb1_walk_chain(buf, smb1_chain_length_cb, &count)) {
2346                 return 0;
2347         }
2348         return count;
2349 }
2350
2351 struct smb1_parse_chain_state {
2352         TALLOC_CTX *mem_ctx;
2353         const uint8_t *buf;
2354         struct smbd_server_connection *sconn;
2355         struct smbXsrv_connection *xconn;
2356         bool encrypted;
2357         uint32_t seqnum;
2358
2359         struct smb_request **reqs;
2360         unsigned num_reqs;
2361 };
2362
2363 static bool smb1_parse_chain_cb(uint8_t cmd,
2364                                 uint8_t wct, const uint16_t *vwv,
2365                                 uint16_t num_bytes, const uint8_t *bytes,
2366                                 void *private_data)
2367 {
2368         struct smb1_parse_chain_state *state =
2369                 (struct smb1_parse_chain_state *)private_data;
2370         struct smb_request **reqs;
2371         struct smb_request *req;
2372         bool ok;
2373
2374         reqs = talloc_realloc(state->mem_ctx, state->reqs,
2375                               struct smb_request *, state->num_reqs+1);
2376         if (reqs == NULL) {
2377                 return false;
2378         }
2379         state->reqs = reqs;
2380
2381         req = talloc(reqs, struct smb_request);
2382         if (req == NULL) {
2383                 return false;
2384         }
2385
2386         ok = init_smb_request(req, state->sconn, state->xconn, state->buf, 0,
2387                               state->encrypted, state->seqnum);
2388         if (!ok) {
2389                 return false;
2390         }
2391         req->cmd = cmd;
2392         req->wct = wct;
2393         req->vwv = vwv;
2394         req->buflen = num_bytes;
2395         req->buf = bytes;
2396
2397         reqs[state->num_reqs] = req;
2398         state->num_reqs += 1;
2399         return true;
2400 }
2401
2402 bool smb1_parse_chain(TALLOC_CTX *mem_ctx, const uint8_t *buf,
2403                       struct smbXsrv_connection *xconn,
2404                       bool encrypted, uint32_t seqnum,
2405                       struct smb_request ***reqs, unsigned *num_reqs)
2406 {
2407         struct smbd_server_connection *sconn = NULL;
2408         struct smb1_parse_chain_state state;
2409         unsigned i;
2410
2411         if (xconn != NULL) {
2412                 sconn = xconn->client->sconn;
2413         }
2414
2415         state.mem_ctx = mem_ctx;
2416         state.buf = buf;
2417         state.sconn = sconn;
2418         state.xconn = xconn;
2419         state.encrypted = encrypted;
2420         state.seqnum = seqnum;
2421         state.reqs = NULL;
2422         state.num_reqs = 0;
2423
2424         if (!smb1_walk_chain(buf, smb1_parse_chain_cb, &state)) {
2425                 TALLOC_FREE(state.reqs);
2426                 return false;
2427         }
2428         for (i=0; i<state.num_reqs; i++) {
2429                 state.reqs[i]->chain = state.reqs;
2430         }
2431         *reqs = state.reqs;
2432         *num_reqs = state.num_reqs;
2433         return true;
2434 }
2435
2436 /****************************************************************************
2437  Check if services need reloading.
2438 ****************************************************************************/
2439
2440 static void check_reload(struct smbd_server_connection *sconn, time_t t)
2441 {
2442
2443         if (last_smb_conf_reload_time == 0) {
2444                 last_smb_conf_reload_time = t;
2445         }
2446
2447         if (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK) {
2448                 reload_services(sconn, conn_snum_used, true);
2449                 last_smb_conf_reload_time = t;
2450         }
2451 }
2452
2453 static bool fd_is_readable(int fd)
2454 {
2455         int ret, revents;
2456
2457         ret = poll_one_fd(fd, POLLIN|POLLHUP, 0, &revents);
2458
2459         return ((ret > 0) && ((revents & (POLLIN|POLLHUP|POLLERR)) != 0));
2460
2461 }
2462
2463 static void smbd_server_connection_write_handler(
2464         struct smbXsrv_connection *xconn)
2465 {
2466         /* TODO: make write nonblocking */
2467 }
2468
2469 static void smbd_server_connection_read_handler(
2470         struct smbXsrv_connection *xconn, int fd)
2471 {
2472         uint8_t *inbuf = NULL;
2473         size_t inbuf_len = 0;
2474         size_t unread_bytes = 0;
2475         bool encrypted = false;
2476         TALLOC_CTX *mem_ctx = talloc_tos();
2477         NTSTATUS status;
2478         uint32_t seqnum;
2479
2480         bool async_echo = lp_async_smb_echo_handler();
2481         bool from_client = false;
2482
2483         if (async_echo) {
2484                 if (fd_is_readable(xconn->smb1.echo_handler.trusted_fd)) {
2485                         /*
2486                          * This is the super-ugly hack to prefer the packets
2487                          * forwarded by the echo handler over the ones by the
2488                          * client directly
2489                          */
2490                         fd = xconn->smb1.echo_handler.trusted_fd;
2491                 }
2492         }
2493
2494         from_client = (xconn->transport.sock == fd);
2495
2496         if (async_echo && from_client) {
2497                 smbd_lock_socket(xconn);
2498
2499                 if (!fd_is_readable(fd)) {
2500                         DEBUG(10,("the echo listener was faster\n"));
2501                         smbd_unlock_socket(xconn);
2502                         return;
2503                 }
2504         }
2505
2506         /* TODO: make this completely nonblocking */
2507         status = receive_smb_talloc(mem_ctx, xconn, fd,
2508                                     (char **)(void *)&inbuf,
2509                                     0, /* timeout */
2510                                     &unread_bytes,
2511                                     &encrypted,
2512                                     &inbuf_len, &seqnum,
2513                                     !from_client /* trusted channel */);
2514
2515         if (async_echo && from_client) {
2516                 smbd_unlock_socket(xconn);
2517         }
2518
2519         if (NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
2520                 goto process;
2521         }
2522         if (NT_STATUS_IS_ERR(status)) {
2523                 exit_server_cleanly("failed to receive smb request");
2524         }
2525         if (!NT_STATUS_IS_OK(status)) {
2526                 return;
2527         }
2528
2529 process:
2530         process_smb(xconn, inbuf, inbuf_len, unread_bytes,
2531                     seqnum, encrypted, NULL);
2532 }
2533
2534 static void smbd_server_connection_handler(struct tevent_context *ev,
2535                                            struct tevent_fd *fde,
2536                                            uint16_t flags,
2537                                            void *private_data)
2538 {
2539         struct smbXsrv_connection *xconn =
2540                 talloc_get_type_abort(private_data,
2541                 struct smbXsrv_connection);
2542
2543         if (!NT_STATUS_IS_OK(xconn->transport.status)) {
2544                 /*
2545                  * we're not supposed to do any io
2546                  */
2547                 TEVENT_FD_NOT_READABLE(xconn->transport.fde);
2548                 TEVENT_FD_NOT_WRITEABLE(xconn->transport.fde);
2549                 return;
2550         }
2551
2552         if (flags & TEVENT_FD_WRITE) {
2553                 smbd_server_connection_write_handler(xconn);
2554                 return;
2555         }
2556         if (flags & TEVENT_FD_READ) {
2557                 smbd_server_connection_read_handler(xconn, xconn->transport.sock);
2558                 return;
2559         }
2560 }
2561
2562 static void smbd_server_echo_handler(struct tevent_context *ev,
2563                                      struct tevent_fd *fde,
2564                                      uint16_t flags,
2565                                      void *private_data)
2566 {
2567         struct smbXsrv_connection *xconn =
2568                 talloc_get_type_abort(private_data,
2569                 struct smbXsrv_connection);
2570
2571         if (!NT_STATUS_IS_OK(xconn->transport.status)) {
2572                 /*
2573                  * we're not supposed to do any io
2574                  */
2575                 TEVENT_FD_NOT_READABLE(xconn->smb1.echo_handler.trusted_fde);
2576                 TEVENT_FD_NOT_WRITEABLE(xconn->smb1.echo_handler.trusted_fde);
2577                 return;
2578         }
2579
2580         if (flags & TEVENT_FD_WRITE) {
2581                 smbd_server_connection_write_handler(xconn);
2582                 return;
2583         }
2584         if (flags & TEVENT_FD_READ) {
2585                 smbd_server_connection_read_handler(
2586                         xconn, xconn->smb1.echo_handler.trusted_fd);
2587                 return;
2588         }
2589 }
2590
2591 struct smbd_release_ip_state {
2592         struct smbXsrv_connection *xconn;
2593         struct tevent_immediate *im;
2594         char addr[INET6_ADDRSTRLEN];
2595 };
2596
2597 static void smbd_release_ip_immediate(struct tevent_context *ctx,
2598                                       struct tevent_immediate *im,
2599                                       void *private_data)
2600 {
2601         struct smbd_release_ip_state *state =
2602                 talloc_get_type_abort(private_data,
2603                 struct smbd_release_ip_state);
2604         struct smbXsrv_connection *xconn = state->xconn;
2605
2606         if (!NT_STATUS_EQUAL(xconn->transport.status, NT_STATUS_ADDRESS_CLOSED)) {
2607                 /*
2608                  * smbd_server_connection_terminate() already triggered ?
2609                  */
2610                 return;
2611         }
2612
2613         smbd_server_connection_terminate(xconn, "CTDB_SRVID_RELEASE_IP");
2614 }
2615
2616 /****************************************************************************
2617 received when we should release a specific IP
2618 ****************************************************************************/
2619 static int release_ip(uint32_t src_vnn, uint32_t dst_vnn,
2620                       uint64_t dst_srvid,
2621                       const uint8_t *msg, size_t msglen,
2622                       void *private_data)
2623 {
2624         struct smbd_release_ip_state *state =
2625                 talloc_get_type_abort(private_data,
2626                 struct smbd_release_ip_state);
2627         struct smbXsrv_connection *xconn = state->xconn;
2628         const char *ip;
2629         const char *addr = state->addr;
2630         const char *p = addr;
2631
2632         if (msglen == 0) {
2633                 return 0;
2634         }
2635         if (msg[msglen-1] != '\0') {
2636                 return 0;
2637         }
2638
2639         ip = (const char *)msg;
2640
2641         if (!NT_STATUS_IS_OK(xconn->transport.status)) {
2642                 /* avoid recursion */
2643                 return 0;
2644         }
2645
2646         if (strncmp("::ffff:", addr, 7) == 0) {
2647                 p = addr + 7;
2648         }
2649
2650         DEBUG(10, ("Got release IP message for %s, "
2651                    "our address is %s\n", ip, p));
2652
2653         if ((strcmp(p, ip) == 0) || ((p != addr) && strcmp(addr, ip) == 0)) {
2654                 DEBUG(0,("Got release IP message for our IP %s - exiting immediately\n",
2655                         ip));
2656                 /*
2657                  * With SMB2 we should do a clean disconnect,
2658                  * the previous_session_id in the session setup
2659                  * will cleanup the old session, tcons and opens.
2660                  *
2661                  * A clean disconnect is needed in order to support
2662                  * durable handles.
2663                  *
2664                  * Note: typically this is never triggered
2665                  *       as we got a TCP RST (triggered by ctdb event scripts)
2666                  *       before we get CTDB_SRVID_RELEASE_IP.
2667                  *
2668                  * We used to call _exit(1) here, but as this was mostly never
2669                  * triggered and has implication on our process model,
2670                  * we can just use smbd_server_connection_terminate()
2671                  * (also for SMB1).
2672                  *
2673                  * We don't call smbd_server_connection_terminate() directly
2674                  * as we might be called from within ctdbd_migrate(),
2675                  * we need to defer our action to the next event loop
2676                  */
2677                 tevent_schedule_immediate(state->im, xconn->ev_ctx,
2678                                           smbd_release_ip_immediate, state);
2679
2680                 /*
2681                  * Make sure we don't get any io on the connection.
2682                  */
2683                 xconn->transport.status = NT_STATUS_ADDRESS_CLOSED;
2684                 return EADDRNOTAVAIL;
2685         }
2686
2687         return 0;
2688 }
2689
2690 static NTSTATUS smbd_register_ips(struct smbXsrv_connection *xconn,
2691                                   struct sockaddr_storage *srv,
2692                                   struct sockaddr_storage *clnt)
2693 {
2694         struct smbd_release_ip_state *state;
2695         struct ctdbd_connection *cconn;
2696
2697         cconn = messaging_ctdbd_connection();
2698         if (cconn == NULL) {
2699                 return NT_STATUS_NO_MEMORY;
2700         }
2701
2702         state = talloc_zero(xconn, struct smbd_release_ip_state);
2703         if (state == NULL) {
2704                 return NT_STATUS_NO_MEMORY;
2705         }
2706         state->xconn = xconn;
2707         state->im = tevent_create_immediate(state);
2708         if (state->im == NULL) {
2709                 return NT_STATUS_NO_MEMORY;
2710         }
2711         if (print_sockaddr(state->addr, sizeof(state->addr), srv) == NULL) {
2712                 return NT_STATUS_NO_MEMORY;
2713         }
2714
2715         return ctdbd_register_ips(cconn, srv, clnt, release_ip, state);
2716 }
2717
2718 static void msg_kill_client_ip(struct messaging_context *msg_ctx,
2719                                   void *private_data, uint32_t msg_type,
2720                                   struct server_id server_id, DATA_BLOB *data)
2721 {
2722         struct smbd_server_connection *sconn = talloc_get_type_abort(
2723                 private_data, struct smbd_server_connection);
2724         const char *ip = (char *) data->data;
2725         char *client_ip;
2726
2727         DBG_DEBUG("Got kill request for client IP %s\n", ip);
2728
2729         client_ip = tsocket_address_inet_addr_string(sconn->remote_address,
2730                                                      talloc_tos());
2731         if (client_ip == NULL) {
2732                 return;
2733         }
2734
2735         if (strequal(ip, client_ip)) {
2736                 DBG_WARNING("Got kill client message for %s - "
2737                             "exiting immediately\n", ip);
2738                 exit_server_cleanly("Forced disconnect for client");
2739         }
2740
2741         TALLOC_FREE(client_ip);
2742 }
2743
2744 /*
2745  * Send keepalive packets to our client
2746  */
2747 static bool keepalive_fn(const struct timeval *now, void *private_data)
2748 {
2749         struct smbd_server_connection *sconn = talloc_get_type_abort(
2750                 private_data, struct smbd_server_connection);
2751         struct smbXsrv_connection *xconn = NULL;
2752         bool ret;
2753
2754         if (sconn->using_smb2) {
2755                 /* Don't do keepalives on an SMB2 connection. */
2756                 return false;
2757         }
2758
2759         /*
2760          * With SMB1 we only have 1 connection
2761          */
2762         xconn = sconn->client->connections;
2763         smbd_lock_socket(xconn);
2764         ret = send_keepalive(xconn->transport.sock);
2765         smbd_unlock_socket(xconn);
2766
2767         if (!ret) {
2768                 int saved_errno = errno;
2769                 /*
2770                  * Try and give an error message saying what
2771                  * client failed.
2772                  */
2773                 DEBUG(0, ("send_keepalive failed for client %s. "
2774                           "Error %s - exiting\n",
2775                           smbXsrv_connection_dbg(xconn),
2776                           strerror(saved_errno)));
2777                 errno = saved_errno;
2778                 return False;
2779         }
2780         return True;
2781 }
2782
2783 /*
2784  * Do the recurring check if we're idle
2785  */
2786 static bool deadtime_fn(const struct timeval *now, void *private_data)
2787 {
2788         struct smbd_server_connection *sconn =
2789                 (struct smbd_server_connection *)private_data;
2790
2791         if ((conn_num_open(sconn) == 0)
2792             || (conn_idle_all(sconn, now->tv_sec))) {
2793                 DEBUG( 2, ( "Closing idle connection\n" ) );
2794                 messaging_send(sconn->msg_ctx,
2795                                messaging_server_id(sconn->msg_ctx),
2796                                MSG_SHUTDOWN, &data_blob_null);
2797                 return False;
2798         }
2799
2800         return True;
2801 }
2802
2803 /*
2804  * Do the recurring log file and smb.conf reload checks.
2805  */
2806
2807 static bool housekeeping_fn(const struct timeval *now, void *private_data)
2808 {
2809         struct smbd_server_connection *sconn = talloc_get_type_abort(
2810                 private_data, struct smbd_server_connection);
2811
2812         DEBUG(5, ("housekeeping\n"));
2813
2814         change_to_root_user();
2815
2816         /* update printer queue caches if necessary */
2817         update_monitored_printq_cache(sconn->msg_ctx);
2818
2819         /* check if we need to reload services */
2820         check_reload(sconn, time_mono(NULL));
2821
2822         /*
2823          * Force a log file check.
2824          */
2825         force_check_log_size();
2826         check_log_size();
2827         return true;
2828 }
2829
2830 /*
2831  * Read an smb packet in the echo handler child, giving the parent
2832  * smbd one second to react once the socket becomes readable.
2833  */
2834
2835 struct smbd_echo_read_state {
2836         struct tevent_context *ev;
2837         struct smbXsrv_connection *xconn;
2838
2839         char *buf;
2840         size_t buflen;
2841         uint32_t seqnum;
2842 };
2843
2844 static void smbd_echo_read_readable(struct tevent_req *subreq);
2845 static void smbd_echo_read_waited(struct tevent_req *subreq);
2846
2847 static struct tevent_req *smbd_echo_read_send(
2848         TALLOC_CTX *mem_ctx, struct tevent_context *ev,
2849         struct smbXsrv_connection *xconn)
2850 {
2851         struct tevent_req *req, *subreq;
2852         struct smbd_echo_read_state *state;
2853
2854         req = tevent_req_create(mem_ctx, &state,
2855                                 struct smbd_echo_read_state);
2856         if (req == NULL) {
2857                 return NULL;
2858         }
2859         state->ev = ev;
2860         state->xconn = xconn;
2861
2862         subreq = wait_for_read_send(state, ev, xconn->transport.sock);
2863         if (tevent_req_nomem(subreq, req)) {
2864                 return tevent_req_post(req, ev);
2865         }
2866         tevent_req_set_callback(subreq, smbd_echo_read_readable, req);
2867         return req;
2868 }
2869
2870 static void smbd_echo_read_readable(struct tevent_req *subreq)
2871 {
2872         struct tevent_req *req = tevent_req_callback_data(
2873                 subreq, struct tevent_req);
2874         struct smbd_echo_read_state *state = tevent_req_data(
2875                 req, struct smbd_echo_read_state);
2876         bool ok;
2877         int err;
2878
2879         ok = wait_for_read_recv(subreq, &err);
2880         TALLOC_FREE(subreq);
2881         if (!ok) {
2882                 tevent_req_nterror(req, map_nt_error_from_unix(err));
2883                 return;
2884         }
2885
2886         /*
2887          * Give the parent smbd one second to step in
2888          */
2889
2890         subreq = tevent_wakeup_send(
2891                 state, state->ev, timeval_current_ofs(1, 0));
2892         if (tevent_req_nomem(subreq, req)) {
2893                 return;
2894         }
2895         tevent_req_set_callback(subreq, smbd_echo_read_waited, req);
2896 }
2897
2898 static void smbd_echo_read_waited(struct tevent_req *subreq)
2899 {
2900         struct tevent_req *req = tevent_req_callback_data(
2901                 subreq, struct tevent_req);
2902         struct smbd_echo_read_state *state = tevent_req_data(
2903                 req, struct smbd_echo_read_state);
2904         struct smbXsrv_connection *xconn = state->xconn;
2905         bool ok;
2906         NTSTATUS status;
2907         size_t unread = 0;
2908         bool encrypted;
2909
2910         ok = tevent_wakeup_recv(subreq);
2911         TALLOC_FREE(subreq);
2912         if (!ok) {
2913                 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
2914                 return;
2915         }
2916
2917         ok = smbd_lock_socket_internal(xconn);
2918         if (!ok) {
2919                 tevent_req_nterror(req, map_nt_error_from_unix(errno));
2920                 DEBUG(0, ("%s: failed to lock socket\n", __location__));
2921                 return;
2922         }
2923
2924         if (!fd_is_readable(xconn->transport.sock)) {
2925                 DEBUG(10,("echo_handler[%d] the parent smbd was faster\n",
2926                           (int)getpid()));
2927
2928                 ok = smbd_unlock_socket_internal(xconn);
2929                 if (!ok) {
2930                         tevent_req_nterror(req, map_nt_error_from_unix(errno));
2931                         DEBUG(1, ("%s: failed to unlock socket\n",
2932                                 __location__));
2933                         return;
2934                 }
2935
2936                 subreq = wait_for_read_send(state, state->ev,
2937                                             xconn->transport.sock);
2938                 if (tevent_req_nomem(subreq, req)) {
2939                         return;
2940                 }
2941                 tevent_req_set_callback(subreq, smbd_echo_read_readable, req);
2942                 return;
2943         }
2944
2945         status = receive_smb_talloc(state, xconn,
2946                                     xconn->transport.sock,
2947                                     &state->buf,
2948                                     0 /* timeout */,
2949                                     &unread,
2950                                     &encrypted,
2951                                     &state->buflen,
2952                                     &state->seqnum,
2953                                     false /* trusted_channel*/);
2954
2955         if (tevent_req_nterror(req, status)) {
2956                 tevent_req_nterror(req, status);
2957                 DEBUG(1, ("echo_handler[%d]: receive_smb_raw_talloc failed: %s\n",
2958                           (int)getpid(), nt_errstr(status)));
2959                 return;
2960         }
2961
2962         ok = smbd_unlock_socket_internal(xconn);
2963         if (!ok) {
2964                 tevent_req_nterror(req, map_nt_error_from_unix(errno));
2965                 DEBUG(1, ("%s: failed to unlock socket\n", __location__));
2966                 return;
2967         }
2968         tevent_req_done(req);
2969 }
2970
2971 static NTSTATUS smbd_echo_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
2972                                     char **pbuf, size_t *pbuflen, uint32_t *pseqnum)
2973 {
2974         struct smbd_echo_read_state *state = tevent_req_data(
2975                 req, struct smbd_echo_read_state);
2976         NTSTATUS status;
2977
2978         if (tevent_req_is_nterror(req, &status)) {
2979                 return status;
2980         }
2981         *pbuf = talloc_move(mem_ctx, &state->buf);
2982         *pbuflen = state->buflen;
2983         *pseqnum = state->seqnum;
2984         return NT_STATUS_OK;
2985 }
2986
2987 struct smbd_echo_state {
2988         struct tevent_context *ev;
2989         struct iovec *pending;
2990         struct smbd_server_connection *sconn;
2991         struct smbXsrv_connection *xconn;
2992         int parent_pipe;
2993
2994         struct tevent_fd *parent_fde;
2995
2996         struct tevent_req *write_req;
2997 };
2998
2999 static void smbd_echo_writer_done(struct tevent_req *req);
3000
3001 static void smbd_echo_activate_writer(struct smbd_echo_state *state)
3002 {
3003         int num_pending;
3004
3005         if (state->write_req != NULL) {
3006                 return;
3007         }
3008
3009         num_pending = talloc_array_length(state->pending);
3010         if (num_pending == 0) {
3011                 return;
3012         }
3013
3014         state->write_req = writev_send(state, state->ev, NULL,
3015                                        state->parent_pipe, false,
3016                                        state->pending, num_pending);
3017         if (state->write_req == NULL) {
3018                 DEBUG(1, ("writev_send failed\n"));
3019                 exit(1);
3020         }
3021
3022         talloc_steal(state->write_req, state->pending);
3023         state->pending = NULL;
3024
3025         tevent_req_set_callback(state->write_req, smbd_echo_writer_done,
3026                                 state);
3027 }
3028
3029 static void smbd_echo_writer_done(struct tevent_req *req)
3030 {
3031         struct smbd_echo_state *state = tevent_req_callback_data(
3032                 req, struct smbd_echo_state);
3033         ssize_t written;
3034         int err;
3035
3036         written = writev_recv(req, &err);
3037         TALLOC_FREE(req);
3038         state->write_req = NULL;
3039         if (written == -1) {
3040                 DEBUG(1, ("writev to parent failed: %s\n", strerror(err)));
3041                 exit(1);
3042         }
3043         DEBUG(10,("echo_handler[%d]: forwarded pdu to main\n", (int)getpid()));
3044         smbd_echo_activate_writer(state);
3045 }
3046
3047 static bool smbd_echo_reply(struct smbd_echo_state *state,
3048                             uint8_t *inbuf, size_t inbuf_len,
3049                             uint32_t seqnum)
3050 {
3051         struct smb_request req;
3052         uint16_t num_replies;
3053         char *outbuf;
3054         bool ok;
3055
3056         if ((inbuf_len == 4) && (CVAL(inbuf, 0) == NBSSkeepalive)) {
3057                 DEBUG(10, ("Got netbios keepalive\n"));
3058                 /*
3059                  * Just swallow it
3060                  */
3061                 return true;
3062         }
3063
3064         if (inbuf_len < smb_size) {
3065                 DEBUG(10, ("Got short packet: %d bytes\n", (int)inbuf_len));
3066                 return false;
3067         }
3068         if (!valid_smb_header(inbuf)) {
3069                 DEBUG(10, ("Got invalid SMB header\n"));
3070                 return false;
3071         }
3072
3073         if (!init_smb_request(&req, state->sconn, state->xconn, inbuf, 0, false,
3074                               seqnum)) {
3075                 return false;
3076         }
3077         req.inbuf = inbuf;
3078
3079         DEBUG(10, ("smbecho handler got cmd %d (%s)\n", (int)req.cmd,
3080                    smb_messages[req.cmd].name
3081                    ? smb_messages[req.cmd].name : "unknown"));
3082
3083         if (req.cmd != SMBecho) {
3084                 return false;
3085         }
3086         if (req.wct < 1) {
3087                 return false;
3088         }
3089
3090         num_replies = SVAL(req.vwv+0, 0);
3091         if (num_replies != 1) {
3092                 /* Not a Windows "Hey, you're still there?" request */
3093                 return false;
3094         }
3095
3096         if (!create_outbuf(talloc_tos(), &req, req.inbuf, &outbuf,
3097                            1, req.buflen)) {
3098                 DEBUG(10, ("create_outbuf failed\n"));
3099                 return false;
3100         }
3101         req.outbuf = (uint8_t *)outbuf;
3102
3103         SSVAL(req.outbuf, smb_vwv0, num_replies);
3104
3105         if (req.buflen > 0) {
3106                 memcpy(smb_buf(req.outbuf), req.buf, req.buflen);
3107         }
3108
3109         ok = srv_send_smb(req.xconn,
3110                           (char *)outbuf,
3111                           true, seqnum+1,
3112                           false, &req.pcd);
3113         TALLOC_FREE(outbuf);
3114         if (!ok) {
3115                 exit(1);
3116         }
3117
3118         return true;
3119 }
3120
3121 static void smbd_echo_exit(struct tevent_context *ev,
3122                            struct tevent_fd *fde, uint16_t flags,
3123                            void *private_data)
3124 {
3125         DEBUG(2, ("smbd_echo_exit: lost connection to parent\n"));
3126         exit(0);
3127 }
3128
3129 static void smbd_echo_got_packet(struct tevent_req *req);
3130
3131 static void smbd_echo_loop(struct smbXsrv_connection *xconn,
3132                            int parent_pipe)
3133 {
3134         struct smbd_echo_state *state;
3135         struct tevent_req *read_req;
3136
3137         state = talloc_zero(xconn, struct smbd_echo_state);
3138         if (state == NULL) {
3139                 DEBUG(1, ("talloc failed\n"));
3140                 return;
3141         }
3142         state->xconn = xconn;
3143         state->parent_pipe = parent_pipe;
3144         state->ev = s3_tevent_context_init(state);
3145         if (state->ev == NULL) {
3146                 DEBUG(1, ("tevent_context_init failed\n"));
3147                 TALLOC_FREE(state);
3148                 return;
3149         }
3150         state->parent_fde = tevent_add_fd(state->ev, state, parent_pipe,
3151                                         TEVENT_FD_READ, smbd_echo_exit,
3152                                         state);
3153         if (state->parent_fde == NULL) {
3154                 DEBUG(1, ("tevent_add_fd failed\n"));
3155                 TALLOC_FREE(state);
3156                 return;
3157         }
3158
3159         read_req = smbd_echo_read_send(state, state->ev, xconn);
3160         if (read_req == NULL) {
3161                 DEBUG(1, ("smbd_echo_read_send failed\n"));
3162                 TALLOC_FREE(state);
3163                 return;
3164         }
3165         tevent_req_set_callback(read_req, smbd_echo_got_packet, state);
3166
3167         while (true) {
3168                 if (tevent_loop_once(state->ev) == -1) {
3169                         DEBUG(1, ("tevent_loop_once failed: %s\n",
3170                                   strerror(errno)));
3171                         break;
3172                 }
3173         }
3174         TALLOC_FREE(state);
3175 }
3176
3177 static void smbd_echo_got_packet(struct tevent_req *req)
3178 {
3179         struct smbd_echo_state *state = tevent_req_callback_data(
3180                 req, struct smbd_echo_state);
3181         NTSTATUS status;
3182         char *buf = NULL;
3183         size_t buflen = 0;
3184         uint32_t seqnum = 0;
3185         bool reply;
3186
3187         status = smbd_echo_read_recv(req, state, &buf, &buflen, &seqnum);
3188         TALLOC_FREE(req);
3189         if (!NT_STATUS_IS_OK(status)) {
3190                 DEBUG(1, ("smbd_echo_read_recv returned %s\n",
3191                           nt_errstr(status)));
3192                 exit(1);
3193         }
3194
3195         reply = smbd_echo_reply(state, (uint8_t *)buf, buflen, seqnum);
3196         if (!reply) {
3197                 size_t num_pending;
3198                 struct iovec *tmp;
3199                 struct iovec *iov;
3200
3201                 num_pending = talloc_array_length(state->pending);
3202                 tmp = talloc_realloc(state, state->pending, struct iovec,
3203                                      num_pending+1);
3204                 if (tmp == NULL) {
3205                         DEBUG(1, ("talloc_realloc failed\n"));
3206                         exit(1);
3207                 }
3208                 state->pending = tmp;
3209
3210                 if (buflen >= smb_size) {
3211                         /*
3212                          * place the seqnum in the packet so that the main process
3213                          * can reply with signing
3214                          */
3215                         SIVAL(buf, smb_ss_field, seqnum);
3216                         SIVAL(buf, smb_ss_field+4, NT_STATUS_V(NT_STATUS_OK));
3217                 }
3218
3219                 iov = &state->pending[num_pending];
3220                 iov->iov_base = talloc_move(state->pending, &buf);
3221                 iov->iov_len = buflen;
3222
3223                 DEBUG(10,("echo_handler[%d]: forward to main\n",
3224                           (int)getpid()));
3225                 smbd_echo_activate_writer(state);
3226         }
3227
3228         req = smbd_echo_read_send(state, state->ev, state->xconn);
3229         if (req == NULL) {
3230                 DEBUG(1, ("smbd_echo_read_send failed\n"));
3231                 exit(1);
3232         }
3233         tevent_req_set_callback(req, smbd_echo_got_packet, state);
3234 }
3235
3236
3237 /*
3238  * Handle SMBecho requests in a forked child process
3239  */
3240 bool fork_echo_handler(struct smbXsrv_connection *xconn)
3241 {
3242         int listener_pipe[2];
3243         int res;
3244         pid_t child;
3245         bool use_mutex = false;
3246
3247         res = pipe(listener_pipe);
3248         if (res == -1) {
3249                 DEBUG(1, ("pipe() failed: %s\n", strerror(errno)));
3250                 return false;
3251         }
3252
3253 #ifdef HAVE_ROBUST_MUTEXES
3254         use_mutex = tdb_runtime_check_for_robust_mutexes();
3255
3256         if (use_mutex) {
3257                 pthread_mutexattr_t a;
3258
3259                 xconn->smb1.echo_handler.socket_mutex =
3260                         anonymous_shared_allocate(sizeof(pthread_mutex_t));
3261                 if (xconn->smb1.echo_handler.socket_mutex == NULL) {
3262                         DEBUG(1, ("Could not create mutex shared memory: %s\n",
3263                                   strerror(errno)));
3264                         goto fail;
3265                 }
3266
3267                 res = pthread_mutexattr_init(&a);
3268                 if (res != 0) {
3269                         DEBUG(1, ("pthread_mutexattr_init failed: %s\n",
3270                                   strerror(res)));
3271                         goto fail;
3272                 }
3273                 res = pthread_mutexattr_settype(&a, PTHREAD_MUTEX_ERRORCHECK);
3274                 if (res != 0) {
3275                         DEBUG(1, ("pthread_mutexattr_settype failed: %s\n",
3276                                   strerror(res)));
3277                         pthread_mutexattr_destroy(&a);
3278                         goto fail;
3279                 }
3280                 res = pthread_mutexattr_setpshared(&a, PTHREAD_PROCESS_SHARED);
3281                 if (res != 0) {
3282                         DEBUG(1, ("pthread_mutexattr_setpshared failed: %s\n",
3283                                   strerror(res)));
3284                         pthread_mutexattr_destroy(&a);
3285                         goto fail;
3286                 }
3287                 res = pthread_mutexattr_setrobust(&a, PTHREAD_MUTEX_ROBUST);
3288                 if (res != 0) {
3289                         DEBUG(1, ("pthread_mutexattr_setrobust failed: "
3290                                   "%s\n", strerror(res)));
3291                         pthread_mutexattr_destroy(&a);
3292                         goto fail;
3293                 }
3294                 res = pthread_mutex_init(xconn->smb1.echo_handler.socket_mutex,
3295                                          &a);
3296                 pthread_mutexattr_destroy(&a);
3297                 if (res != 0) {
3298                         DEBUG(1, ("pthread_mutex_init failed: %s\n",
3299                                   strerror(res)));
3300                         goto fail;
3301                 }
3302         }
3303 #endif
3304
3305         if (!use_mutex) {
3306                 xconn->smb1.echo_handler.socket_lock_fd =
3307                         create_unlink_tmp(lp_lock_directory());
3308                 if (xconn->smb1.echo_handler.socket_lock_fd == -1) {
3309                         DEBUG(1, ("Could not create lock fd: %s\n",
3310                                   strerror(errno)));
3311                         goto fail;
3312                 }
3313         }
3314
3315         child = fork();
3316         if (child == 0) {
3317                 NTSTATUS status;
3318
3319                 close(listener_pipe[0]);
3320                 set_blocking(listener_pipe[1], false);
3321
3322                 status = smbd_reinit_after_fork(xconn->msg_ctx, xconn->ev_ctx, true);
3323                 if (!NT_STATUS_IS_OK(status)) {
3324                         DEBUG(1, ("reinit_after_fork failed: %s\n",
3325                                   nt_errstr(status)));
3326                         exit(1);
3327                 }
3328                 smbd_echo_loop(xconn, listener_pipe[1]);
3329                 exit(0);
3330         }
3331         close(listener_pipe[1]);
3332         listener_pipe[1] = -1;
3333         xconn->smb1.echo_handler.trusted_fd = listener_pipe[0];
3334
3335         DEBUG(10,("fork_echo_handler: main[%d] echo_child[%d]\n", (int)getpid(), (int)child));
3336
3337         /*
3338          * Without smb signing this is the same as the normal smbd
3339          * listener. This needs to change once signing comes in.
3340          */
3341         xconn->smb1.echo_handler.trusted_fde = tevent_add_fd(xconn->ev_ctx,
3342                                         xconn,
3343                                         xconn->smb1.echo_handler.trusted_fd,
3344                                         TEVENT_FD_READ,
3345                                         smbd_server_echo_handler,
3346                                         xconn);
3347         if (xconn->smb1.echo_handler.trusted_fde == NULL) {
3348                 DEBUG(1, ("event_add_fd failed\n"));
3349                 goto fail;
3350         }
3351
3352         return true;
3353
3354 fail:
3355         if (listener_pipe[0] != -1) {
3356                 close(listener_pipe[0]);
3357         }
3358         if (listener_pipe[1] != -1) {
3359                 close(listener_pipe[1]);
3360         }
3361         if (xconn->smb1.echo_handler.socket_lock_fd != -1) {
3362                 close(xconn->smb1.echo_handler.socket_lock_fd);
3363         }
3364 #ifdef HAVE_ROBUST_MUTEXES
3365         if (xconn->smb1.echo_handler.socket_mutex != NULL) {
3366                 pthread_mutex_destroy(xconn->smb1.echo_handler.socket_mutex);
3367                 anonymous_shared_free(xconn->smb1.echo_handler.socket_mutex);
3368         }
3369 #endif
3370         smbd_echo_init(xconn);
3371
3372         return false;
3373 }
3374
3375 static bool uid_in_use(const struct user_struct *user, uid_t uid)
3376 {
3377         while (user) {
3378                 if (user->session_info &&
3379                     (user->session_info->unix_token->uid == uid)) {
3380                         return true;
3381                 }
3382                 user = user->next;
3383         }
3384         return false;
3385 }
3386
3387 static bool gid_in_use(const struct user_struct *user, gid_t gid)
3388 {
3389         while (user) {
3390                 if (user->session_info != NULL) {
3391                         int i;
3392                         struct security_unix_token *utok;
3393
3394                         utok = user->session_info->unix_token;
3395                         if (utok->gid == gid) {
3396                                 return true;
3397                         }
3398                         for(i=0; i<utok->ngroups; i++) {
3399                                 if (utok->groups[i] == gid) {
3400                                         return true;
3401                                 }
3402                         }
3403                 }
3404                 user = user->next;
3405         }
3406         return false;
3407 }
3408
3409 static bool sid_in_use(const struct user_struct *user,
3410                        const struct dom_sid *psid)
3411 {
3412         while (user) {
3413                 struct security_token *tok;
3414
3415                 if (user->session_info == NULL) {
3416                         continue;
3417                 }
3418                 tok = user->session_info->security_token;
3419                 if (tok == NULL) {
3420                         /*
3421                          * Not sure session_info->security_token can
3422                          * ever be NULL. This check might be not
3423                          * necessary.
3424                          */
3425                         continue;
3426                 }
3427                 if (security_token_has_sid(tok, psid)) {
3428                         return true;
3429                 }
3430                 user = user->next;
3431         }
3432         return false;
3433 }
3434
3435 static bool id_in_use(const struct user_struct *user,
3436                       const struct id_cache_ref *id)
3437 {
3438         switch(id->type) {
3439         case UID:
3440                 return uid_in_use(user, id->id.uid);
3441         case GID:
3442                 return gid_in_use(user, id->id.gid);
3443         case SID:
3444                 return sid_in_use(user, &id->id.sid);
3445         default:
3446                 break;
3447         }
3448         return false;
3449 }
3450
3451 static void smbd_id_cache_kill(struct messaging_context *msg_ctx,
3452                                void *private_data,
3453                                uint32_t msg_type,
3454                                struct server_id server_id,
3455                                DATA_BLOB* data)
3456 {
3457         const char *msg = (data && data->data)
3458                 ? (const char *)data->data : "<NULL>";
3459         struct id_cache_ref id;
3460         struct smbd_server_connection *sconn =
3461                 talloc_get_type_abort(private_data,
3462                 struct smbd_server_connection);
3463
3464         if (!id_cache_ref_parse(msg, &id)) {
3465                 DEBUG(0, ("Invalid ?ID: %s\n", msg));
3466                 return;
3467         }
3468
3469         if (id_in_use(sconn->users, &id)) {
3470                 exit_server_cleanly(msg);
3471         }
3472         id_cache_delete_from_cache(&id);
3473 }
3474
3475 NTSTATUS smbXsrv_connection_init_tables(struct smbXsrv_connection *conn,
3476                                         enum protocol_types protocol)
3477 {
3478         NTSTATUS status;
3479
3480         conn->protocol = protocol;
3481
3482         if (protocol >= PROTOCOL_SMB2_02) {
3483                 status = smb2srv_session_table_init(conn);
3484                 if (!NT_STATUS_IS_OK(status)) {
3485                         conn->protocol = PROTOCOL_NONE;
3486                         return status;
3487                 }
3488
3489                 status = smb2srv_open_table_init(conn);
3490                 if (!NT_STATUS_IS_OK(status)) {
3491                         conn->protocol = PROTOCOL_NONE;
3492                         return status;
3493                 }
3494         } else {
3495                 status = smb1srv_session_table_init(conn);
3496                 if (!NT_STATUS_IS_OK(status)) {
3497                         conn->protocol = PROTOCOL_NONE;
3498                         return status;
3499                 }
3500
3501                 status = smb1srv_tcon_table_init(conn);
3502                 if (!NT_STATUS_IS_OK(status)) {
3503                         conn->protocol = PROTOCOL_NONE;
3504                         return status;
3505                 }
3506
3507                 status = smb1srv_open_table_init(conn);
3508                 if (!NT_STATUS_IS_OK(status)) {
3509                         conn->protocol = PROTOCOL_NONE;
3510                         return status;
3511                 }
3512         }
3513
3514         set_Protocol(protocol);
3515         return NT_STATUS_OK;
3516 }
3517
3518 struct smbd_tevent_trace_state {
3519         struct tevent_context *ev;
3520         TALLOC_CTX *frame;
3521         SMBPROFILE_BASIC_ASYNC_STATE(profile_idle);
3522 };
3523
3524 static void smbd_tevent_trace_callback(enum tevent_trace_point point,
3525                                        void *private_data)
3526 {
3527         struct smbd_tevent_trace_state *state =
3528                 (struct smbd_tevent_trace_state *)private_data;
3529
3530         switch (point) {
3531         case TEVENT_TRACE_BEFORE_WAIT:
3532                 if (!smbprofile_dump_pending()) {
3533                         /*
3534                          * If there's no dump pending
3535                          * we don't want to schedule a new 1 sec timer.
3536                          *
3537                          * Instead we want to sleep as long as nothing happens.
3538                          */
3539                         smbprofile_dump_setup(NULL);
3540                 }
3541                 SMBPROFILE_BASIC_ASYNC_START(idle, profile_p, state->profile_idle);
3542                 break;
3543         case TEVENT_TRACE_AFTER_WAIT:
3544                 SMBPROFILE_BASIC_ASYNC_END(state->profile_idle);
3545                 if (!smbprofile_dump_pending()) {
3546                         /*
3547                          * We need to flush our state after sleeping
3548                          * (hopefully a long time).
3549                          */
3550                         smbprofile_dump();
3551                         /*
3552                          * future profiling events should trigger timers
3553                          * on our main event context.
3554                          */
3555                         smbprofile_dump_setup(state->ev);
3556                 }
3557                 break;
3558         case TEVENT_TRACE_BEFORE_LOOP_ONCE:
3559                 TALLOC_FREE(state->frame);
3560                 state->frame = talloc_stackframe_pool(8192);
3561                 break;
3562         case TEVENT_TRACE_AFTER_LOOP_ONCE:
3563                 TALLOC_FREE(state->frame);
3564                 break;
3565         }
3566
3567         errno = 0;
3568 }
3569
3570 /**
3571  * Create a debug string for the connection
3572  *
3573  * This is allocated to talloc_tos() or a string constant
3574  * in certain corner cases. The returned string should
3575  * hence not be free'd directly but only via the talloc stack.
3576  */
3577 const char *smbXsrv_connection_dbg(const struct smbXsrv_connection *xconn)
3578 {
3579         const char *ret;
3580
3581         /*
3582          * TODO: this can be improved later
3583          * maybe including the client guid or more
3584          */
3585         ret = tsocket_address_string(xconn->remote_address, talloc_tos());
3586         if (ret == NULL) {
3587                 return "<tsocket_address_string() failed>";
3588         }
3589
3590         return ret;
3591 }
3592
3593 NTSTATUS smbd_add_connection(struct smbXsrv_client *client, int sock_fd,
3594                              struct smbXsrv_connection **_xconn)
3595 {
3596         TALLOC_CTX *frame = talloc_stackframe();
3597         struct smbXsrv_connection *xconn;
3598         struct sockaddr_storage ss_srv;
3599         void *sp_srv = (void *)&ss_srv;
3600         struct sockaddr *sa_srv = (struct sockaddr *)sp_srv;
3601         struct sockaddr_storage ss_clnt;
3602         void *sp_clnt = (void *)&ss_clnt;
3603         struct sockaddr *sa_clnt = (struct sockaddr *)sp_clnt;
3604         socklen_t sa_socklen;
3605         struct tsocket_address *local_address = NULL;
3606         struct tsocket_address *remote_address = NULL;
3607         const char *remaddr = NULL;
3608         char *p;
3609         const char *rhost = NULL;
3610         int ret;
3611         int tmp;
3612
3613         *_xconn = NULL;
3614
3615         DO_PROFILE_INC(connect);
3616
3617         xconn = talloc_zero(client, struct smbXsrv_connection);
3618         if (xconn == NULL) {
3619                 DEBUG(0,("talloc_zero(struct smbXsrv_connection)\n"));
3620                 TALLOC_FREE(frame);
3621                 return NT_STATUS_NO_MEMORY;
3622         }
3623         talloc_steal(frame, xconn);
3624
3625         xconn->ev_ctx = client->ev_ctx;
3626         xconn->msg_ctx = client->msg_ctx;
3627         xconn->transport.sock = sock_fd;
3628         smbd_echo_init(xconn);
3629         xconn->protocol = PROTOCOL_NONE;
3630
3631         /* Ensure child is set to blocking mode */
3632         set_blocking(sock_fd,True);
3633
3634         set_socket_options(sock_fd, "SO_KEEPALIVE");
3635         set_socket_options(sock_fd, lp_socket_options());
3636
3637         sa_socklen = sizeof(ss_clnt);
3638         ret = getpeername(sock_fd, sa_clnt, &sa_socklen);
3639         if (ret != 0) {
3640                 int saved_errno = errno;
3641                 int level = (errno == ENOTCONN)?2:0;
3642                 DEBUG(level,("getpeername() failed - %s\n",
3643                       strerror(saved_errno)));
3644                 TALLOC_FREE(frame);
3645                 return map_nt_error_from_unix_common(saved_errno);
3646         }
3647         ret = tsocket_address_bsd_from_sockaddr(xconn,
3648                                                 sa_clnt, sa_socklen,
3649                                                 &remote_address);
3650         if (ret != 0) {
3651                 int saved_errno = errno;
3652                 DEBUG(0,("%s: tsocket_address_bsd_from_sockaddr remote failed - %s\n",
3653                         __location__, strerror(saved_errno)));
3654                 TALLOC_FREE(frame);
3655                 return map_nt_error_from_unix_common(saved_errno);
3656         }
3657
3658         sa_socklen = sizeof(ss_srv);
3659         ret = getsockname(sock_fd, sa_srv, &sa_socklen);
3660         if (ret != 0) {
3661                 int saved_errno = errno;
3662                 int level = (errno == ENOTCONN)?2:0;
3663                 DEBUG(level,("getsockname() failed - %s\n",
3664                       strerror(saved_errno)));
3665                 TALLOC_FREE(frame);
3666                 return map_nt_error_from_unix_common(saved_errno);
3667         }
3668         ret = tsocket_address_bsd_from_sockaddr(xconn,
3669                                                 sa_srv, sa_socklen,
3670                                                 &local_address);
3671         if (ret != 0) {
3672                 int saved_errno = errno;
3673                 DEBUG(0,("%s: tsocket_address_bsd_from_sockaddr remote failed - %s\n",
3674                         __location__, strerror(saved_errno)));
3675                 TALLOC_FREE(frame);
3676                 return map_nt_error_from_unix_common(saved_errno);
3677         }
3678
3679         if (tsocket_address_is_inet(remote_address, "ip")) {
3680                 remaddr = tsocket_address_inet_addr_string(remote_address,
3681                                                            talloc_tos());
3682                 if (remaddr == NULL) {
3683                         DEBUG(0,("%s: tsocket_address_inet_addr_string remote failed - %s\n",
3684                                  __location__, strerror(errno)));
3685                         TALLOC_FREE(frame);
3686                         return NT_STATUS_NO_MEMORY;
3687                 }
3688         } else {
3689                 remaddr = "0.0.0.0";
3690         }
3691
3692         /*
3693          * Before the first packet, check the global hosts allow/ hosts deny
3694          * parameters before doing any parsing of packets passed to us by the
3695          * client. This prevents attacks on our parsing code from hosts not in
3696          * the hosts allow list.
3697          */
3698
3699         ret = get_remote_hostname(remote_address,
3700                                   &p, talloc_tos());
3701         if (ret < 0) {
3702                 int saved_errno = errno;
3703                 DEBUG(0,("%s: get_remote_hostname failed - %s\n",
3704                         __location__, strerror(saved_errno)));
3705                 TALLOC_FREE(frame);
3706                 return map_nt_error_from_unix_common(saved_errno);
3707         }
3708         rhost = p;
3709         if (strequal(rhost, "UNKNOWN")) {
3710                 rhost = remaddr;
3711         }
3712
3713         xconn->local_address = local_address;
3714         xconn->remote_address = remote_address;
3715         xconn->remote_hostname = talloc_strdup(xconn, rhost);
3716         if (xconn->remote_hostname == NULL) {
3717                 return NT_STATUS_NO_MEMORY;
3718         }
3719
3720         if (!srv_init_signing(xconn)) {
3721                 DEBUG(0, ("Failed to init smb_signing\n"));
3722                 TALLOC_FREE(frame);
3723                 return NT_STATUS_INTERNAL_ERROR;
3724         }
3725
3726         if (!allow_access(lp_hosts_deny(-1), lp_hosts_allow(-1),
3727                           xconn->remote_hostname,
3728                           remaddr)) {
3729                 DEBUG( 1, ("Connection denied from %s to %s\n",
3730                            tsocket_address_string(remote_address, talloc_tos()),
3731                            tsocket_address_string(local_address, talloc_tos())));
3732
3733                 /*
3734                  * We return a valid xconn
3735                  * so that the caller can return an error message
3736                  * to the client
3737                  */
3738                 client->connections = xconn;
3739                 xconn->client = client;
3740                 talloc_steal(client, xconn);
3741
3742                 *_xconn = xconn;
3743                 TALLOC_FREE(frame);
3744                 return NT_STATUS_NETWORK_ACCESS_DENIED;
3745         }
3746
3747         DEBUG(10, ("Connection allowed from %s to %s\n",
3748                    tsocket_address_string(remote_address, talloc_tos()),
3749                    tsocket_address_string(local_address, talloc_tos())));
3750
3751         if (lp_clustering()) {
3752                 /*
3753                  * We need to tell ctdb about our client's TCP
3754                  * connection, so that for failover ctdbd can send
3755                  * tickle acks, triggering a reconnection by the
3756                  * client.
3757                  */
3758                 NTSTATUS status;
3759
3760                 status = smbd_register_ips(xconn, &ss_srv, &ss_clnt);
3761                 if (!NT_STATUS_IS_OK(status)) {
3762                         DEBUG(0, ("ctdbd_register_ips failed: %s\n",
3763                                   nt_errstr(status)));
3764                 }
3765         }
3766
3767         tmp = lp_max_xmit();
3768         tmp = MAX(tmp, SMB_BUFFER_SIZE_MIN);
3769         tmp = MIN(tmp, SMB_BUFFER_SIZE_MAX);
3770
3771         xconn->smb1.negprot.max_recv = tmp;
3772
3773         xconn->smb1.sessions.done_sesssetup = false;
3774         xconn->smb1.sessions.max_send = SMB_BUFFER_SIZE_MAX;
3775
3776         xconn->transport.fde = tevent_add_fd(client->ev_ctx,
3777                                              xconn,
3778                                              sock_fd,
3779                                              TEVENT_FD_READ,
3780                                              smbd_server_connection_handler,
3781                                              xconn);
3782         if (!xconn->transport.fde) {
3783                 TALLOC_FREE(frame);
3784                 return NT_STATUS_NO_MEMORY;
3785         }
3786
3787         /* for now we only have one connection */
3788         DLIST_ADD_END(client->connections, xconn, NULL);
3789         xconn->client = client;
3790         talloc_steal(client, xconn);
3791
3792         *_xconn = xconn;
3793         TALLOC_FREE(frame);
3794         return NT_STATUS_OK;
3795 }
3796
3797 /****************************************************************************
3798  Process commands from the client
3799 ****************************************************************************/
3800
3801 void smbd_process(struct tevent_context *ev_ctx,
3802                   struct messaging_context *msg_ctx,
3803                   int sock_fd,
3804                   bool interactive)
3805 {
3806         struct smbd_tevent_trace_state trace_state = {
3807                 .ev = ev_ctx,
3808                 .frame = talloc_stackframe(),
3809         };
3810         struct smbXsrv_client *client = NULL;
3811         struct smbd_server_connection *sconn = NULL;
3812         struct smbXsrv_connection *xconn = NULL;
3813         const char *locaddr = NULL;
3814         const char *remaddr = NULL;
3815         int ret;
3816         NTSTATUS status;
3817
3818         client = talloc_zero(ev_ctx, struct smbXsrv_client);
3819         if (client == NULL) {
3820                 DEBUG(0,("talloc_zero(struct smbXsrv_client)\n"));
3821                 exit_server_cleanly("talloc_zero(struct smbXsrv_client).\n");
3822         }
3823
3824         /*
3825          * TODO: remove this...:-)
3826          */
3827         global_smbXsrv_client = client;
3828
3829         client->ev_ctx = ev_ctx;
3830         client->msg_ctx = msg_ctx;
3831
3832         sconn = talloc_zero(client, struct smbd_server_connection);
3833         if (sconn == NULL) {
3834                 exit_server("failed to create smbd_server_connection");
3835         }
3836
3837         client->sconn = sconn;
3838         sconn->client = client;
3839
3840         sconn->ev_ctx = ev_ctx;
3841         sconn->msg_ctx = msg_ctx;
3842
3843         if (lp_server_max_protocol() >= PROTOCOL_SMB2_02) {
3844                 /*
3845                  * We're not making the decision here,
3846                  * we're just allowing the client
3847                  * to decide between SMB1 and SMB2
3848                  * with the first negprot
3849                  * packet.
3850                  */
3851                 sconn->using_smb2 = true;
3852         }
3853
3854         if (!interactive) {
3855                 smbd_setup_sig_term_handler(sconn);
3856                 smbd_setup_sig_hup_handler(sconn);
3857
3858                 if (!serverid_register(messaging_server_id(msg_ctx),
3859                                        FLAG_MSG_GENERAL|FLAG_MSG_SMBD
3860                                        |FLAG_MSG_DBWRAP
3861                                        |FLAG_MSG_PRINT_GENERAL)) {
3862                         exit_server_cleanly("Could not register myself in "
3863                                             "serverid.tdb");
3864                 }
3865         }
3866
3867         status = smbd_add_connection(client, sock_fd, &xconn);
3868         if (NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_ACCESS_DENIED)) {
3869                 /*
3870                  * send a negative session response "not listening on calling
3871                  * name"
3872                  */
3873                 unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
3874                 (void)srv_send_smb(xconn,(char *)buf, false,
3875                                    0, false, NULL);
3876                 exit_server_cleanly("connection denied");
3877         } else if (!NT_STATUS_IS_OK(status)) {
3878                 exit_server_cleanly(nt_errstr(status));
3879         }
3880
3881         sconn->local_address =
3882                 tsocket_address_copy(xconn->local_address, sconn);
3883         if (sconn->local_address == NULL) {
3884                 exit_server_cleanly("tsocket_address_copy() failed");
3885         }
3886         sconn->remote_address =
3887                 tsocket_address_copy(xconn->remote_address, sconn);
3888         if (sconn->remote_address == NULL) {
3889                 exit_server_cleanly("tsocket_address_copy() failed");
3890         }
3891         sconn->remote_hostname =
3892                 talloc_strdup(sconn, xconn->remote_hostname);
3893         if (sconn->remote_hostname == NULL) {
3894                 exit_server_cleanly("tsocket_strdup() failed");
3895         }
3896
3897         if (tsocket_address_is_inet(sconn->local_address, "ip")) {
3898                 locaddr = tsocket_address_inet_addr_string(
3899                                 sconn->local_address,
3900                                 talloc_tos());
3901                 if (locaddr == NULL) {
3902                         DEBUG(0,("%s: tsocket_address_inet_addr_string remote failed - %s\n",
3903                                  __location__, strerror(errno)));
3904                         exit_server_cleanly("tsocket_address_inet_addr_string remote failed.\n");
3905                 }
3906         } else {
3907                 locaddr = "0.0.0.0";
3908         }
3909
3910         if (tsocket_address_is_inet(sconn->remote_address, "ip")) {
3911                 remaddr = tsocket_address_inet_addr_string(
3912                                 sconn->remote_address,
3913                                 talloc_tos());
3914                 if (remaddr == NULL) {
3915                         DEBUG(0,("%s: tsocket_address_inet_addr_string remote failed - %s\n",
3916                                  __location__, strerror(errno)));
3917                         exit_server_cleanly("tsocket_address_inet_addr_string remote failed.\n");
3918                 }
3919         } else {
3920                 remaddr = "0.0.0.0";
3921         }
3922
3923         /* this is needed so that we get decent entries
3924            in smbstatus for port 445 connects */
3925         set_remote_machine_name(remaddr, false);
3926         reload_services(sconn, conn_snum_used, true);
3927         sub_set_socket_ids(remaddr,
3928                            sconn->remote_hostname,
3929                            locaddr);
3930
3931         if (lp_preload_modules()) {
3932                 smb_load_modules(lp_preload_modules());
3933         }
3934
3935         smb_perfcount_init();
3936
3937         if (!init_account_policy()) {
3938                 exit_server("Could not open account policy tdb.\n");
3939         }
3940
3941         if (*lp_root_directory(talloc_tos())) {
3942                 if (chroot(lp_root_directory(talloc_tos())) != 0) {
3943                         DEBUG(0,("Failed to change root to %s\n",
3944                                  lp_root_directory(talloc_tos())));
3945                         exit_server("Failed to chroot()");
3946                 }
3947                 if (chdir("/") == -1) {
3948                         DEBUG(0,("Failed to chdir to / on chroot to %s\n", lp_root_directory(talloc_tos())));
3949                         exit_server("Failed to chroot()");
3950                 }
3951                 DEBUG(0,("Changed root to %s\n", lp_root_directory(talloc_tos())));
3952         }
3953
3954         if (!file_init(sconn)) {
3955                 exit_server("file_init() failed");
3956         }
3957
3958         /* Setup oplocks */
3959         if (!init_oplocks(sconn))
3960                 exit_server("Failed to init oplocks");
3961
3962         /* register our message handlers */
3963         messaging_register(sconn->msg_ctx, sconn,
3964                            MSG_SMB_FORCE_TDIS, msg_force_tdis);
3965         messaging_register(sconn->msg_ctx, sconn,
3966                            MSG_SMB_CLOSE_FILE, msg_close_file);
3967         messaging_register(sconn->msg_ctx, sconn,
3968                            MSG_SMB_FILE_RENAME, msg_file_was_renamed);
3969
3970         id_cache_register_msgs(sconn->msg_ctx);
3971         messaging_deregister(sconn->msg_ctx, ID_CACHE_KILL, NULL);
3972         messaging_register(sconn->msg_ctx, sconn,
3973                            ID_CACHE_KILL, smbd_id_cache_kill);
3974
3975         messaging_deregister(sconn->msg_ctx,
3976                              MSG_SMB_CONF_UPDATED, sconn->ev_ctx);
3977         messaging_register(sconn->msg_ctx, sconn,
3978                            MSG_SMB_CONF_UPDATED, smbd_conf_updated);
3979
3980         messaging_deregister(sconn->msg_ctx, MSG_SMB_KILL_CLIENT_IP,
3981                              NULL);
3982         messaging_register(sconn->msg_ctx, sconn,
3983                            MSG_SMB_KILL_CLIENT_IP,
3984                            msg_kill_client_ip);
3985
3986         messaging_deregister(sconn->msg_ctx, MSG_SMB_TELL_NUM_CHILDREN, NULL);
3987
3988         /*
3989          * Use the default MSG_DEBUG handler to avoid rebroadcasting
3990          * MSGs to all child processes
3991          */
3992         messaging_deregister(sconn->msg_ctx,
3993                              MSG_DEBUG, NULL);
3994         messaging_register(sconn->msg_ctx, NULL,
3995                            MSG_DEBUG, debug_message);
3996
3997         if ((lp_keepalive() != 0)
3998             && !(event_add_idle(ev_ctx, NULL,
3999                                 timeval_set(lp_keepalive(), 0),
4000                                 "keepalive", keepalive_fn,
4001                                 sconn))) {
4002                 DEBUG(0, ("Could not add keepalive event\n"));
4003                 exit(1);
4004         }
4005
4006         if (!(event_add_idle(ev_ctx, NULL,
4007                              timeval_set(IDLE_CLOSED_TIMEOUT, 0),
4008                              "deadtime", deadtime_fn, sconn))) {
4009                 DEBUG(0, ("Could not add deadtime event\n"));
4010                 exit(1);
4011         }
4012
4013         if (!(event_add_idle(ev_ctx, NULL,
4014                              timeval_set(SMBD_HOUSEKEEPING_INTERVAL, 0),
4015                              "housekeeping", housekeeping_fn, sconn))) {
4016                 DEBUG(0, ("Could not add housekeeping event\n"));
4017                 exit(1);
4018         }
4019
4020         smbprofile_dump_setup(ev_ctx);
4021
4022         if (!init_dptrs(sconn)) {
4023                 exit_server("init_dptrs() failed");
4024         }
4025
4026         TALLOC_FREE(trace_state.frame);
4027
4028         tevent_set_trace_callback(ev_ctx, smbd_tevent_trace_callback,
4029                                   &trace_state);
4030
4031         ret = tevent_loop_wait(ev_ctx);
4032         if (ret != 0) {
4033                 DEBUG(1, ("tevent_loop_wait failed: %d, %s,"
4034                           " exiting\n", ret, strerror(errno)));
4035         }
4036
4037         TALLOC_FREE(trace_state.frame);
4038
4039         exit_server_cleanly(NULL);
4040 }
4041
4042 bool req_is_in_chain(const struct smb_request *req)
4043 {
4044         if (req->vwv != (const uint16_t *)(req->inbuf+smb_vwv)) {
4045                 /*
4046                  * We're right now handling a subsequent request, so we must
4047                  * be in a chain
4048                  */
4049                 return true;
4050         }
4051
4052         if (!is_andx_req(req->cmd)) {
4053                 return false;
4054         }
4055
4056         if (req->wct < 2) {
4057                 /*
4058                  * Okay, an illegal request, but definitely not chained :-)
4059                  */
4060                 return false;
4061         }
4062
4063         return (CVAL(req->vwv+0, 0) != 0xFF);
4064 }