4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  25  */
  26 
  27 #include <smbsrv/smb_kproto.h>
  28 
  29 static void smb_encode_sacl(mbuf_chain_t *, smb_acl_t *);
  30 static void smb_encode_dacl(mbuf_chain_t *, smb_acl_t *);
  31 static smb_acl_t *smb_decode_acl(mbuf_chain_t *, uint32_t);
  32 
  33 /*
  34  * smb_nt_transact_query_security_info
  35  *
  36  * This command allows the client to retrieve the security descriptor
  37  * on a file. The result of the call is returned to the client in the
  38  * Data part of the transaction response.
  39  *
  40  * Some clients specify a non-zero maximum data return size (mdrcnt)
  41  * for the SD and some specify zero. In either case, if the mdrcnt is
  42  * too small we need to return NT_STATUS_BUFFER_TOO_SMALL and a buffer
  43  * size hint. The client should then retry with the appropriate buffer
  44  * size.
 
 
 354                 ace = list_next(&acl->sl_sorted, ace);
 355         }
 356 }
 357 
 358 /*
 359  * smb_decode_sd
 360  *
 361  * Decodes the security descriptor in the request buffer
 362  * and set the fields of 'sd' appropraitely. Upon successful
 363  * return, caller must free allocated memories by calling
 364  * smb_sd_term().
 365  */
 366 uint32_t
 367 smb_decode_sd(mbuf_chain_t *mbc, smb_sd_t *sd)
 368 {
 369         struct mbuf_chain sdbuf;
 370         uint32_t owner_offs;
 371         uint32_t group_offs;
 372         uint32_t sacl_offs;
 373         uint32_t dacl_offs;
 374 
 375         smb_sd_init(sd, SECURITY_DESCRIPTOR_REVISION);
 376 
 377         (void) MBC_SHADOW_CHAIN(&sdbuf, mbc,
 378             mbc->chain_offset,
 379             mbc->max_bytes - mbc->chain_offset);
 380 
 381         if (smb_mbc_decodef(&sdbuf, "b.wllll",
 382             &sd->sd_revision, &sd->sd_control,
 383             &owner_offs, &group_offs, &sacl_offs, &dacl_offs))
 384                 goto decode_error;
 385 
 386         sd->sd_control &= ~SE_SELF_RELATIVE;
 387 
 388         if (owner_offs != 0) {
 389                 if (owner_offs < SMB_SD_HDRSIZE)
 390                         goto decode_error;
 391 
 392                 sd->sd_owner = smb_decode_sid(mbc, owner_offs);
 393                 if (sd->sd_owner == NULL)
 394                         goto decode_error;
 395         }
 396 
 397         if (group_offs != 0) {
 398                 if (group_offs < SMB_SD_HDRSIZE)
 399                         goto decode_error;
 400 
 401                 sd->sd_group = smb_decode_sid(mbc, group_offs);
 402                 if (sd->sd_group == NULL)
 403                         goto decode_error;
 404         }
 405 
 406         if (sacl_offs != 0) {
 
 | 
 
 
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
  25  */
  26 
  27 #include <smbsrv/smb_kproto.h>
  28 
  29 static void smb_encode_sacl(mbuf_chain_t *, smb_acl_t *);
  30 static void smb_encode_dacl(mbuf_chain_t *, smb_acl_t *);
  31 static smb_acl_t *smb_decode_acl(mbuf_chain_t *, uint32_t);
  32 
  33 /*
  34  * smb_nt_transact_query_security_info
  35  *
  36  * This command allows the client to retrieve the security descriptor
  37  * on a file. The result of the call is returned to the client in the
  38  * Data part of the transaction response.
  39  *
  40  * Some clients specify a non-zero maximum data return size (mdrcnt)
  41  * for the SD and some specify zero. In either case, if the mdrcnt is
  42  * too small we need to return NT_STATUS_BUFFER_TOO_SMALL and a buffer
  43  * size hint. The client should then retry with the appropriate buffer
  44  * size.
 
 
 354                 ace = list_next(&acl->sl_sorted, ace);
 355         }
 356 }
 357 
 358 /*
 359  * smb_decode_sd
 360  *
 361  * Decodes the security descriptor in the request buffer
 362  * and set the fields of 'sd' appropraitely. Upon successful
 363  * return, caller must free allocated memories by calling
 364  * smb_sd_term().
 365  */
 366 uint32_t
 367 smb_decode_sd(mbuf_chain_t *mbc, smb_sd_t *sd)
 368 {
 369         struct mbuf_chain sdbuf;
 370         uint32_t owner_offs;
 371         uint32_t group_offs;
 372         uint32_t sacl_offs;
 373         uint32_t dacl_offs;
 374         int rc;
 375 
 376         smb_sd_init(sd, SECURITY_DESCRIPTOR_REVISION);
 377 
 378         (void) MBC_SHADOW_CHAIN(&sdbuf, mbc,
 379             mbc->chain_offset,
 380             mbc->max_bytes - mbc->chain_offset);
 381 
 382         rc = smb_mbc_decodef(&sdbuf, "b.wllll",
 383             &sd->sd_revision, &sd->sd_control,
 384             &owner_offs, &group_offs, &sacl_offs, &dacl_offs);
 385 
 386         /* Prevent disallowed flags in smb_sd_term. */
 387         sd->sd_control &= ~SE_SELF_RELATIVE;
 388         if (rc != 0)
 389                 goto decode_error;
 390 
 391         if (owner_offs != 0) {
 392                 if (owner_offs < SMB_SD_HDRSIZE)
 393                         goto decode_error;
 394 
 395                 sd->sd_owner = smb_decode_sid(mbc, owner_offs);
 396                 if (sd->sd_owner == NULL)
 397                         goto decode_error;
 398         }
 399 
 400         if (group_offs != 0) {
 401                 if (group_offs < SMB_SD_HDRSIZE)
 402                         goto decode_error;
 403 
 404                 sd->sd_group = smb_decode_sid(mbc, group_offs);
 405                 if (sd->sd_group == NULL)
 406                         goto decode_error;
 407         }
 408 
 409         if (sacl_offs != 0) {
 
 |