1/* 2 Unix SMB/Netbios implementation. 3 smbd globals 4 Copyright (C) Stefan Metzmacher 2009 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18*/ 19 20#if defined(WITH_AIO) 21struct aio_extra; 22extern struct aio_extra *aio_list_head; 23extern struct tevent_signal *aio_signal_event; 24extern int aio_pending_size; 25extern int outstanding_aio_calls; 26#endif 27 28/* dlink list we store pending lock records on. */ 29extern struct blocking_lock_record *blocking_lock_queue; 30 31/* dlink list we move cancelled lock records onto. */ 32extern struct blocking_lock_record *blocking_lock_cancelled_queue; 33 34/* The event that makes us process our blocking lock queue */ 35extern struct timed_event *brl_timeout; 36 37extern bool blocking_lock_unlock_state; 38extern bool blocking_lock_cancel_state; 39 40#ifdef USE_DMAPI 41struct smbd_dmapi_context; 42extern struct smbd_dmapi_context *dmapi_ctx; 43#endif 44 45extern bool dfree_broken; 46 47/* how many write cache buffers have been allocated */ 48extern unsigned int allocated_write_caches; 49 50extern int real_max_open_files; 51extern struct bitmap *file_bmap; 52extern files_struct *Files; 53extern int files_used; 54/* A singleton cache to speed up searching by dev/inode. */ 55struct fsp_singleton_cache { 56 files_struct *fsp; 57 struct file_id id; 58}; 59extern struct fsp_singleton_cache fsp_fi_cache; 60extern unsigned long file_gen_counter; 61extern int first_file; 62 63extern const struct mangle_fns *mangle_fns; 64 65extern unsigned char *chartest; 66extern TDB_CONTEXT *tdb_mangled_cache; 67 68/* these tables are used to provide fast tests for characters */ 69extern unsigned char char_flags[256]; 70/* 71 this determines how many characters are used from the original filename 72 in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions. 73 The largest possible value is 6. 74*/ 75extern unsigned mangle_prefix; 76extern unsigned char base_reverse[256]; 77 78extern char *last_from; 79extern char *last_to; 80 81struct msg_state; 82extern struct msg_state *smbd_msg_state; 83 84extern bool logged_ioctl_message; 85 86extern int trans_num; 87 88extern pid_t mypid; 89extern time_t last_smb_conf_reload_time; 90extern time_t last_printer_reload_time; 91/**************************************************************************** 92 structure to hold a linked list of queued messages. 93 for processing. 94****************************************************************************/ 95struct pending_message_list; 96extern struct pending_message_list *deferred_open_queue; 97extern uint32_t common_flags2; 98 99struct smb_srv_trans_enc_ctx; 100extern struct smb_srv_trans_enc_ctx *partial_srv_trans_enc_ctx; 101extern struct smb_srv_trans_enc_ctx *srv_trans_enc_ctx; 102 103struct sec_ctx { 104 UNIX_USER_TOKEN ut; 105 NT_USER_TOKEN *token; 106}; 107/* A stack of security contexts. We include the current context as being 108 the first one, so there is room for another MAX_SEC_CTX_DEPTH more. */ 109extern struct sec_ctx sec_ctx_stack[MAX_SEC_CTX_DEPTH + 1]; 110extern int sec_ctx_stack_ndx; 111extern bool become_uid_done; 112extern bool become_gid_done; 113 114extern connection_struct *last_conn; 115extern uint16_t last_flags; 116 117extern struct db_context *session_db_ctx_ptr; 118 119extern uint32_t global_client_caps; 120 121extern uint16_t fnf_handle; 122 123struct conn_ctx { 124 connection_struct *conn; 125 uint16 vuid; 126}; 127/* A stack of current_user connection contexts. */ 128extern struct conn_ctx conn_ctx_stack[MAX_SEC_CTX_DEPTH]; 129extern int conn_ctx_stack_ndx; 130 131struct vfs_init_function_entry; 132extern struct vfs_init_function_entry *backends; 133extern char *sparse_buf; 134extern char *LastDir; 135 136/* Current number of oplocks we have outstanding. */ 137extern int32_t exclusive_oplocks_open; 138extern int32_t level_II_oplocks_open; 139extern bool global_client_failed_oplock_break; 140extern struct kernel_oplocks *koplocks; 141 142extern int am_parent; 143extern int server_fd; 144extern struct event_context *smbd_event_ctx; 145extern struct messaging_context *smbd_msg_ctx; 146extern struct memcache *smbd_memcache_ctx; 147extern bool exit_firsttime; 148struct child_pid; 149extern struct child_pid *children; 150extern int num_children; 151 152struct tstream_context; 153struct smbd_smb2_request; 154struct smbd_smb2_session; 155struct smbd_smb2_tcon; 156 157DATA_BLOB negprot_spnego(void); 158 159NTSTATUS smb2_signing_sign_pdu(DATA_BLOB session_key, 160 struct iovec *vector, 161 int count); 162NTSTATUS smb2_signing_check_pdu(DATA_BLOB session_key, 163 const struct iovec *vector, 164 int count); 165 166struct smbd_lock_element { 167 uint32_t smbpid; 168 enum brl_type brltype; 169 uint64_t offset; 170 uint64_t count; 171}; 172 173NTSTATUS smbd_do_locking(struct smb_request *req, 174 files_struct *fsp, 175 uint8_t type, 176 int32_t timeout, 177 uint16_t num_ulocks, 178 struct smbd_lock_element *ulocks, 179 uint16_t num_locks, 180 struct smbd_lock_element *locks, 181 bool *async); 182 183NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn, 184 TALLOC_CTX *mem_ctx, 185 uint16_t info_level, 186 files_struct *fsp, 187 struct smb_filename *smb_fname, 188 bool delete_pending, 189 struct timespec write_time_ts, 190 bool ms_dfs_link, 191 struct ea_list *ea_list, 192 int lock_data_count, 193 char *lock_data, 194 uint16_t flags2, 195 unsigned int max_data_bytes, 196 char **ppdata, 197 unsigned int *pdata_size); 198 199NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn, 200 struct smb_request *req, 201 TALLOC_CTX *mem_ctx, 202 uint16_t info_level, 203 files_struct *fsp, 204 struct smb_filename *smb_fname, 205 char **ppdata, int total_data, 206 int *ret_data_size); 207 208NTSTATUS smbd_do_qfsinfo(connection_struct *conn, 209 TALLOC_CTX *mem_ctx, 210 uint16_t info_level, 211 uint16_t flags2, 212 unsigned int max_data_bytes, 213 char **ppdata, 214 int *ret_data_len); 215 216bool smbd_dirptr_get_entry(TALLOC_CTX *ctx, 217 struct dptr_struct *dirptr, 218 const char *mask, 219 uint32_t dirtype, 220 bool dont_descend, 221 bool ask_sharemode, 222 bool (*match_fn)(TALLOC_CTX *ctx, 223 void *private_data, 224 const char *dname, 225 const char *mask, 226 char **_fname), 227 bool (*mode_fn)(TALLOC_CTX *ctx, 228 void *private_data, 229 struct smb_filename *smb_fname, 230 uint32_t *_mode), 231 void *private_data, 232 char **_fname, 233 struct smb_filename **_smb_fname, 234 uint32_t *_mode, 235 long *_prev_offset); 236 237bool smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx, 238 connection_struct *conn, 239 struct dptr_struct *dirptr, 240 uint16 flags2, 241 const char *path_mask, 242 uint32 dirtype, 243 int info_level, 244 int requires_resume_key, 245 bool dont_descend, 246 bool ask_sharemode, 247 uint8_t align, 248 bool do_pad, 249 char **ppdata, 250 char *base_data, 251 char *end_data, 252 int space_remaining, 253 bool *out_of_space, 254 bool *got_exact_match, 255 int *_last_entry_off, 256 struct ea_list *name_list); 257 258NTSTATUS smbd_check_open_rights(struct connection_struct *conn, 259 const struct smb_filename *smb_fname, 260 uint32_t access_mask, 261 uint32_t *access_granted); 262 263void smbd_notify_cancel_by_smbreq(struct smbd_server_connection *sconn, 264 const struct smb_request *smbreq); 265 266void smbd_server_connection_terminate_ex(struct smbd_server_connection *sconn, 267 const char *reason, 268 const char *location); 269#define smbd_server_connection_terminate(sconn, reason) \ 270 smbd_server_connection_terminate_ex(sconn, reason, __location__) 271 272bool smbd_is_smb2_header(const uint8_t *inbuf, size_t size); 273 274void reply_smb2002(struct smb_request *req, uint16_t choice); 275void smbd_smb2_first_negprot(struct smbd_server_connection *sconn, 276 const uint8_t *inbuf, size_t size); 277 278NTSTATUS smbd_smb2_request_error_ex(struct smbd_smb2_request *req, 279 NTSTATUS status, 280 DATA_BLOB *info, 281 const char *location); 282#define smbd_smb2_request_error(req, status) \ 283 smbd_smb2_request_error_ex(req, status, NULL, __location__) 284NTSTATUS smbd_smb2_request_done_ex(struct smbd_smb2_request *req, 285 NTSTATUS status, 286 DATA_BLOB body, DATA_BLOB *dyn, 287 const char *location); 288#define smbd_smb2_request_done(req, body, dyn) \ 289 smbd_smb2_request_done_ex(req, NT_STATUS_OK, body, dyn, __location__) 290 291NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn, 292 uint64_t file_id_persistent, 293 uint64_t file_id_volatile, 294 uint8_t oplock_level); 295 296NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req, 297 struct tevent_req *subreq); 298 299NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req); 300NTSTATUS smbd_smb2_request_check_tcon(struct smbd_smb2_request *req); 301 302struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req); 303 304NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req); 305NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *req); 306NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req); 307NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req); 308NTSTATUS smbd_smb2_request_process_tdis(struct smbd_smb2_request *req); 309NTSTATUS smbd_smb2_request_process_create(struct smbd_smb2_request *req); 310NTSTATUS smbd_smb2_request_process_close(struct smbd_smb2_request *req); 311NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req); 312NTSTATUS smbd_smb2_request_process_read(struct smbd_smb2_request *req); 313NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req); 314NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req); 315NTSTATUS smbd_smb2_request_process_ioctl(struct smbd_smb2_request *req); 316NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req); 317NTSTATUS smbd_smb2_request_process_find(struct smbd_smb2_request *req); 318NTSTATUS smbd_smb2_request_process_notify(struct smbd_smb2_request *req); 319NTSTATUS smbd_smb2_request_process_getinfo(struct smbd_smb2_request *req); 320NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req); 321NTSTATUS smbd_smb2_request_process_break(struct smbd_smb2_request *req); 322 323struct smbd_smb2_request { 324 struct smbd_smb2_request *prev, *next; 325 326 TALLOC_CTX *mem_pool; 327 struct smbd_smb2_request **parent; 328 329 struct smbd_server_connection *sconn; 330 331 /* the session the request operates on, maybe NULL */ 332 struct smbd_smb2_session *session; 333 334 /* the tcon the request operates on, maybe NULL */ 335 struct smbd_smb2_tcon *tcon; 336 337 int current_idx; 338 bool do_signing; 339 340 struct files_struct *compat_chain_fsp; 341 342 NTSTATUS next_status; 343 344 /* 345 * The sub request for async backend calls. 346 * This is used for SMB2 Cancel. 347 */ 348 struct tevent_req *subreq; 349 350 struct { 351 /* the NBT header is not allocated */ 352 uint8_t nbt_hdr[4]; 353 /* 354 * vector[0] NBT 355 * . 356 * vector[1] SMB2 357 * vector[2] fixed body 358 * vector[3] dynamic body 359 * . 360 * . 361 * . 362 * vector[4] SMB2 363 * vector[5] fixed body 364 * vector[6] dynamic body 365 * . 366 * . 367 * . 368 */ 369 struct iovec *vector; 370 int vector_count; 371 } in; 372 struct { 373 /* the NBT header is not allocated */ 374 uint8_t nbt_hdr[4]; 375 /* 376 * vector[0] NBT 377 * . 378 * vector[1] SMB2 379 * vector[2] fixed body 380 * vector[3] dynamic body 381 * . 382 * . 383 * . 384 * vector[4] SMB2 385 * vector[5] fixed body 386 * vector[6] dynamic body 387 * . 388 * . 389 * . 390 */ 391 struct iovec *vector; 392 int vector_count; 393 } out; 394}; 395 396struct smbd_server_connection; 397 398struct smbd_smb2_session { 399 struct smbd_smb2_session *prev, *next; 400 struct smbd_server_connection *sconn; 401 NTSTATUS status; 402 uint64_t vuid; 403 AUTH_NTLMSSP_STATE *auth_ntlmssp_state; 404 struct auth_serversupplied_info *server_info; 405 DATA_BLOB session_key; 406 bool do_signing; 407 408 user_struct *compat_vuser; 409 410 struct { 411 /* an id tree used to allocate tids */ 412 struct idr_context *idtree; 413 414 /* this is the limit of tid values for this connection */ 415 uint32_t limit; 416 417 struct smbd_smb2_tcon *list; 418 } tcons; 419}; 420 421struct smbd_smb2_tcon { 422 struct smbd_smb2_tcon *prev, *next; 423 struct smbd_smb2_session *session; 424 uint32_t tid; 425 int snum; 426 connection_struct *compat_conn; 427}; 428 429struct pending_auth_data; 430 431struct smbd_server_connection { 432 struct { 433 bool got_session; 434 } nbt; 435 bool allow_smb2; 436 struct { 437 struct fd_event *fde; 438 uint64_t num_requests; 439 struct { 440 bool encrypted_passwords; 441 bool spnego; 442 struct auth_context *auth_context; 443 bool done; 444 /* 445 * Size of the data we can receive. Set by us. 446 * Can be modified by the max xmit parameter. 447 */ 448 int max_recv; 449 } negprot; 450 451 struct { 452 bool done_sesssetup; 453 /* 454 * Size of data we can send to client. Set 455 * by the client for all protocols above CORE. 456 * Set by us for CORE protocol. 457 */ 458 int max_send; 459 uint16_t last_session_tag; 460 461 /* users from session setup */ 462 char *session_userlist; 463 /* workgroup from session setup. */ 464 char *session_workgroup; 465 /* 466 * this holds info on user ids that are already 467 * validated for this VC 468 */ 469 user_struct *validated_users; 470 uint16_t next_vuid; 471 int num_validated_vuids; 472#ifdef HAVE_NETGROUP 473 char *my_yp_domain; 474#endif 475 } sessions; 476 struct { 477 connection_struct *Connections; 478 /* number of open connections */ 479 struct bitmap *bmap; 480 int num_open; 481 } tcons; 482 struct smb_signing_state *signing_state; 483 /* List to store partial SPNEGO auth fragments. */ 484 struct pending_auth_data *pd_list; 485 486 struct notify_mid_map *notify_mid_maps; 487 488 struct { 489 struct bitmap *dptr_bmap; 490 struct dptr_struct *dirptrs; 491 int dirhandles_open; 492 } searches; 493 } smb1; 494 struct { 495 struct tevent_context *event_ctx; 496 struct tevent_queue *recv_queue; 497 struct tevent_queue *send_queue; 498 struct tstream_context *stream; 499 struct { 500 /* an id tree used to allocate vuids */ 501 /* this holds info on session vuids that are already 502 * validated for this VC */ 503 struct idr_context *idtree; 504 505 /* this is the limit of vuid values for this connection */ 506 uint64_t limit; 507 508 struct smbd_smb2_session *list; 509 } sessions; 510 struct smbd_smb2_request *requests; 511 } smb2; 512}; 513 514extern struct smbd_server_connection *smbd_server_conn; 515 516void smbd_init_globals(void); 517