summaryrefslogtreecommitdiff
path: root/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c')
-rw-r--r--usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c61
1 files changed, 58 insertions, 3 deletions
diff --git a/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c b/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c
index 72905f709a..c2f0814025 100644
--- a/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c
+++ b/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -94,6 +94,8 @@ static winreg_keylist_t winreg_keylist;
static boolean_t winreg_key_has_subkey(const char *);
static char *winreg_enum_subkey(ndr_xa_t *, const char *, uint32_t);
static char *winreg_lookup_value(const char *);
+static uint32_t winreg_sd_format(smb_sd_t *);
+uint32_t srvsvc_sd_set_relative(smb_sd_t *, uint8_t *);
static int winreg_s_OpenHKCR(void *, ndr_xa_t *);
static int winreg_s_OpenHKCU(void *, ndr_xa_t *);
@@ -633,17 +635,70 @@ winreg_s_FlushKey(void *arg, ndr_xa_t *mxa)
/*
* winreg_s_GetKeySec
*/
-/*ARGSUSED*/
static int
winreg_s_GetKeySec(void *arg, ndr_xa_t *mxa)
{
struct winreg_GetKeySec *param = arg;
+ struct winreg_value *sd_buf;
+ smb_sd_t sd;
+ uint32_t sd_len;
+ uint32_t status;
+
+ bzero(&sd, sizeof (smb_sd_t));
+
+ if ((status = winreg_sd_format(&sd)) != ERROR_SUCCESS)
+ goto winreg_getkeysec_error;
+
+ sd_len = smb_sd_len(&sd, SMB_ALL_SECINFO);
+
+ param->sd = NDR_MALLOC(mxa, sizeof (struct winreg_secdesc));
+ if (param->sd == NULL) {
+ status = ERROR_NOT_ENOUGH_MEMORY;
+ goto winreg_getkeysec_error;
+ }
+
+ param->sd->sd_len = sd_len;
+ param->sd->sd_size = sd_len;
+
+ sd_buf = NDR_MALLOC(mxa, sd_len + sizeof (struct winreg_value));
+ param->sd->sd_buf = sd_buf;
+ sd_buf->vc_first_is = 0;
+ sd_buf->vc_length_is = sd_len;
+ param->status = srvsvc_sd_set_relative(&sd, sd_buf->value);
+
+ smb_sd_term(&sd);
+ return (NDR_DRC_OK);
+
+winreg_getkeysec_error:
+ smb_sd_term(&sd);
bzero(param, sizeof (struct winreg_GetKeySec));
- param->status = ERROR_ACCESS_DENIED;
+ param->status = status;
return (NDR_DRC_OK);
}
+static uint32_t
+winreg_sd_format(smb_sd_t *sd)
+{
+ smb_fssd_t fs_sd;
+ acl_t *acl;
+ uint32_t status = ERROR_SUCCESS;
+
+ if (acl_fromtext("owner@:rwxpdDaARWcCos::allow", &acl) != 0)
+ return (ERROR_NOT_ENOUGH_MEMORY);
+
+ smb_fssd_init(&fs_sd, SMB_ALL_SECINFO, SMB_FSSD_FLAGS_DIR);
+ fs_sd.sd_uid = 0;
+ fs_sd.sd_gid = 0;
+ fs_sd.sd_zdacl = acl;
+ fs_sd.sd_zsacl = NULL;
+
+ if (smb_sd_fromfs(&fs_sd, sd) != NT_STATUS_SUCCESS)
+ status = ERROR_ACCESS_DENIED;
+ smb_fssd_term(&fs_sd);
+ return (status);
+}
+
/*
* winreg_s_NotifyChange
*/