29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * CDDL HEADER START
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * The contents of this file are subject to the terms of the
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Common Development and Distribution License (the "License").
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * You may not use this file except in compliance with the License.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * or http://www.opensolaris.org/os/licensing.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * See the License for the specific language governing permissions
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * and limitations under the License.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * When distributing Covered Code, include this CDDL HEADER in each
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * If applicable, add the following below this CDDL HEADER, with the
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * fields enclosed by brackets "[]" replaced with your own identifying
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * information: Portions Copyright [yyyy] [name of copyright owner]
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * CDDL HEADER END
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This is a helper file to get/set Windows SD. This is used by
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * SRVSVC service.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#include <strings.h>
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#include <libzfs.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <smbsrv/libsmb.h>
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#include <smbsrv/libmlsvc.h>
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#include <smbsrv/ndl/srvsvc.ndl>
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/* Size of offset members in mslm_security_descriptor structure */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#define SRVSVC_SD_OFFSET_SZ 16
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#define SRVSVC_ACE_OFFSET 8
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#define SRVSVC_SID_OFFSET 8
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wrightuint32_t srvsvc_sd_set_relative(smb_sd_t *, uint8_t *);
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wright
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krierstatic uint32_t srvsvc_sd_get_autohome(const smb_share_t *, smb_sd_t *);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic uint32_t srvsvc_sd_status_to_error(uint32_t);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic uint32_t srvsvc_sd_set_absolute(uint8_t *, smb_sd_t *);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method computes ACL on share path from a share name.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Return 0 upon success, -1 upon failure.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_shareacl_getpath(smb_share_t *si, char *shr_acl_path)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright char dataset[MAXPATHLEN];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright char mp[ZFS_MAXPROPLEN];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright libzfs_handle_t *libhd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright zfs_handle_t *zfshd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int ret = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ret = smb_getdataset(si->shr_path, dataset, MAXPATHLEN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (ret != 0)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ret);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((libhd = libzfs_init()) == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (-1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright libzfs_fini(libhd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (-1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (zfs_prop_get(zfshd, ZFS_PROP_MOUNTPOINT, mp, sizeof (mp), NULL,
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright NULL, 0, B_FALSE) != 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright zfs_close(zfshd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright libzfs_fini(libhd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (-1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright zfs_close(zfshd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright libzfs_fini(libhd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) snprintf(shr_acl_path, MAXPATHLEN, "%s/.zfs/shares/%s",
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright mp, si->shr_name);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ret);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method sets Security Descriptor on a share path.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns:
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_SUCCESS
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_NOT_ENOUGH_MEMORY
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_ACL
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_SID
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_SECURITY_DESCR
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_NONE_MAPPED
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INTERNAL_ERROR
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_PATH_NOT_FOUND
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightuint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_sd_set(smb_share_t *si, uint8_t *sdbuf)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_t sd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint32_t status = ERROR_SUCCESS;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright char path[MAXPATHLEN];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int ret = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ret = srvsvc_shareacl_getpath(si, path);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (ret != 0)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_PATH_NOT_FOUND);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_init(&sd, 0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_sd_set_absolute(sdbuf, &sd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status != ERROR_SUCCESS) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_term(&sd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = smb_sd_write(path, &sd, SMB_DACL_SECINFO);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_sd_status_to_error(status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_term(&sd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method returns a Security Descriptor of a share path in self relative
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * format. Call to this function with NULL buffer, returns the size of the
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * security descriptor, which can be used to allocate buffer.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns:
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_SUCCESS
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_NOT_ENOUGH_MEMORY
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_ACL
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_SID
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_SECURITY_DESCR
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INVALID_PARAMETER
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_NONE_MAPPED
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_INTERNAL_ERROR
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * ERROR_PATH_NOT_FOUND
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightuint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_sd_get(smb_share_t *si, uint8_t *sdbuf, uint32_t *size)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_t sd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint32_t status = ERROR_SUCCESS;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright char path[MAXPATHLEN];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int ret = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sdbuf == NULL && size == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_PARAMETER);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bzero(&sd, sizeof (smb_sd_t));
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (si->shr_flags & SMB_SHRF_AUTOHOME) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier status = srvsvc_sd_get_autohome(si, &sd);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier } else {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier ret = srvsvc_shareacl_getpath(si, path);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (ret != 0)
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier return (ERROR_PATH_NOT_FOUND);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier status = smb_sd_read(path, &sd, SMB_ALL_SECINFO);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier status = srvsvc_sd_status_to_error(status);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status != ERROR_SUCCESS) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_term(&sd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sdbuf == NULL) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *size = smb_sd_len(&sd, SMB_ALL_SECINFO);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_term(&sd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_sd_set_relative(&sd, sdbuf);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_sd_term(&sd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krierstatic uint32_t
fe1c642d06e14b412cd83ae2179303186ab08972Bill Kriersrvsvc_sd_get_autohome(const smb_share_t *si, smb_sd_t *sd)
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier{
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_fssd_t fs_sd;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier acl_t *acl;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier uint32_t status;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (acl_fromtext("owner@:rwxpdDaARWcCos::allow", &acl) != 0)
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier return (ERROR_NOT_ENOUGH_MEMORY);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_fssd_init(&fs_sd, SMB_ALL_SECINFO, SMB_FSSD_FLAGS_DIR);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier fs_sd.sd_uid = si->shr_uid;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier fs_sd.sd_gid = si->shr_gid;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier fs_sd.sd_zdacl = acl;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier fs_sd.sd_zsacl = NULL;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier status = smb_sd_fromfs(&fs_sd, sd);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier status = srvsvc_sd_status_to_error(status);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_fssd_term(&fs_sd);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier return (status);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier}
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method converts an ACE from absolute (pointer) to
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * self relative (flat buffer) format.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns Win32 error codes.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic uint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_ace_set_relative(mslm_ace_t *m_ace, struct mslm_sid *m_sid,
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_ace_t *ace)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((m_ace == NULL) || (ace == NULL))
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_PARAMETER);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(&ace->se_hdr, &m_ace->header, sizeof (mslm_ace_hdr_t));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_ace->mask = ace->se_mask;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((ace->se_sid == NULL) || (m_sid == NULL))
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_PARAMETER);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(ace->se_sid, m_sid, smb_sid_len(ace->se_sid));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_SUCCESS);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method converts an ACL from absolute (pointer) to
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * self relative (flat buffer) format.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns an initialized mslm_acl structure on success.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns NULL on failure.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic struct mslm_acl *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_acl_set_relative(uint8_t *sdbuf, smb_acl_t *acl)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright struct mslm_acl *m_acl;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sdbuf == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (NULL);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_acl = (struct mslm_acl *)sdbuf;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_acl->revision = acl->sl_revision;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_acl->sbz1 = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_acl->size = acl->sl_bsize;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_acl->sbz2 = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_acl->ace_count = acl->sl_acecnt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (m_acl);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method converts Security Descriptor from absolute (pointer) to
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * self relative (flat buffer) format.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns Win32 error codes.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
f96bd5c800e73e351b0b6e4bd7f00b578dad29bbAlan Wrightuint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_sd_set_relative(smb_sd_t *sd, uint8_t *sdbuf)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright mslm_security_descriptor_t *msd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int offset, len, i;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_ace_t *ace;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright mslm_ace_t *m_ace;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright struct mslm_sid *m_sid;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint16_t ace_cnt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint32_t status = ERROR_SUCCESS;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd = (mslm_security_descriptor_t *)sdbuf;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_SECURITY_DESCR);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->revision = sd->sd_revision;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->sbz1 = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->control = sd->sd_control | SE_SELF_RELATIVE;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset = sizeof (mslm_security_descriptor_t) - SRVSVC_SD_OFFSET_SZ;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->offset_owner = msd->offset_group = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->offset_sacl = msd->offset_dacl = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_owner != NULL) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->offset_owner = offset;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_owner == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright len = smb_sid_len(sd->sd_owner);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(sd->sd_owner, &sdbuf[offset], len);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += len;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_group != NULL) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->offset_group = offset;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_group == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright len = smb_sid_len(sd->sd_group);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(sd->sd_group, &sdbuf[offset], len);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += len;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_sacl != NULL) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->offset_sacl = offset;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->sacl = srvsvc_acl_set_relative(&sdbuf[offset],
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sd->sd_sacl);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd->sacl == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_PARAMETER);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace = sd->sd_sacl->sl_aces;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace_cnt = msd->sacl->ace_count;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += SRVSVC_ACE_OFFSET;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < ace_cnt; i++, ace++) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_ace = (mslm_ace_t *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += SRVSVC_SID_OFFSET;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_sid = (struct mslm_sid *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_ace_set_relative(m_ace, m_sid, ace);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status != ERROR_SUCCESS)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += smb_sid_len(ace->se_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_dacl != NULL) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->offset_dacl = offset;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd->dacl = srvsvc_acl_set_relative(&sdbuf[offset],
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sd->sd_dacl);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd->dacl == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_PARAMETER);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace = sd->sd_dacl->sl_aces;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace_cnt = msd->dacl->ace_count;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += SRVSVC_ACE_OFFSET;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < ace_cnt; i++, ace++) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_ace = (mslm_ace_t *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += SRVSVC_SID_OFFSET;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_sid = (struct mslm_sid *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_ace_set_relative(m_ace, m_sid, ace);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status != ERROR_SUCCESS)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += smb_sid_len(ace->se_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method converts an ACE from self relative (flat buffer) to
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * absolute (pointer) format.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns Win32 error codes.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic uint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_ace_set_absolute(mslm_ace_t *m_ace, struct mslm_sid *m_sid,
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_ace_t *ace)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int sid_size = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((m_ace == NULL) || (ace == NULL) || (m_sid == NULL))
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_PARAMETER);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bzero(ace, sizeof (smb_ace_t));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(&m_ace->header, &ace->se_hdr, sizeof (mslm_ace_hdr_t));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace->se_mask = m_ace->mask;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sid_size = smb_sid_len((smb_sid_t *)m_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((ace->se_sid = malloc(sid_size)) == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(m_sid, ace->se_sid, sid_size);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_SUCCESS);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method converts an ACL from self relative (flat buffer) to
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * absolute (pointer) format.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns an initialized smb_acl_t structure on success.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns NULL on failure.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic smb_acl_t *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_acl_set_absolute(uint8_t *sdbuf, int *offset)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint8_t rev;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint16_t sz, ace_cnt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_acl_t *acl;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(&sdbuf[*offset], &rev, sizeof (uint8_t));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *offset += 2; /* Pad for Sbz1 */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(&sdbuf[*offset], &sz, sizeof (uint16_t));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *offset += 2;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(&sdbuf[*offset], &ace_cnt, sizeof (uint16_t));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *offset += 4; /* Pad for Sbz2 */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright acl = smb_acl_alloc(rev, sz, ace_cnt);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (acl);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method converts Security Descriptor from self relative (flat buffer) to
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * absolute (pointer) format.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Returns Win32 error codes.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic uint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_sd_set_absolute(uint8_t *sdbuf, smb_sd_t *sd)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright mslm_security_descriptor_t *msd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright mslm_ace_t *m_ace;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright struct mslm_sid *m_sid;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_ace_t *ace;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint16_t ace_cnt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int offset, i, sid_size;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint32_t status = ERROR_SUCCESS;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sdbuf == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INVALID_SECURITY_DESCR);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright msd = (mslm_security_descriptor_t *)sdbuf;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sd->sd_revision = msd->revision;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sd->sd_control = msd->control & (~SE_SELF_RELATIVE);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd->offset_owner != 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_sid = (struct mslm_sid *)&sdbuf[msd->offset_owner];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sid_size = smb_sid_len((smb_sid_t *)m_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((sd->sd_owner = malloc(sid_size)) == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(m_sid, sd->sd_owner, sid_size);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd->offset_group != 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_sid = (struct mslm_sid *)&sdbuf[msd->offset_group];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sid_size = smb_sid_len((smb_sid_t *)m_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if ((sd->sd_group = malloc(sid_size)) == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bcopy(m_sid, sd->sd_group, sid_size);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd->offset_sacl != 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset = msd->offset_sacl;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sd->sd_sacl = srvsvc_acl_set_absolute(sdbuf, &offset);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_sacl == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace = sd->sd_sacl->sl_aces;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace_cnt = sd->sd_sacl->sl_acecnt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < ace_cnt; i++, ace++) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_ace = (mslm_ace_t *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += SRVSVC_SID_OFFSET;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_sid = (struct mslm_sid *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_ace_set_absolute(m_ace, m_sid, ace);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status != ERROR_SUCCESS)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += smb_sid_len(ace->se_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (msd->offset_dacl != 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset = msd->offset_dacl;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright sd->sd_dacl = srvsvc_acl_set_absolute(sdbuf, &offset);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (sd->sd_dacl == NULL)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_NOT_ENOUGH_MEMORY);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace = sd->sd_dacl->sl_aces;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ace_cnt = sd->sd_dacl->sl_acecnt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < ace_cnt; i++, ace++) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_ace = (mslm_ace_t *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += SRVSVC_SID_OFFSET;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*LINTED E_BAD_PTR_CAST_ALIGN*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright m_sid = (struct mslm_sid *)&sdbuf[offset];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright status = srvsvc_ace_set_absolute(m_ace, m_sid, ace);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status != ERROR_SUCCESS)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright offset += smb_sid_len(ace->se_sid);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (status);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method maps NT status codes into Win 32 error codes.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * This method operates on status codes that are related
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * to processing of Security Descriptor.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic uint32_t
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsrvsvc_sd_status_to_error(uint32_t status)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int i;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright static struct {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint32_t nt_status;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright uint32_t err_code;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright } errmap[] = {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright { NT_STATUS_SUCCESS, ERROR_SUCCESS },
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright { NT_STATUS_INVALID_ACL, ERROR_INVALID_ACL },
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright { NT_STATUS_INVALID_SID, ERROR_INVALID_SID },
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright { NT_STATUS_NONE_MAPPED, ERROR_NONE_MAPPED }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright };
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < (sizeof (errmap) / sizeof (errmap[0])); ++i) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (status == errmap[i].nt_status)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (errmap[i].err_code);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (ERROR_INTERNAL_ERROR);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}