summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Gaskin <patrick@pgaskin.net>2021-05-30 15:28:46 -0400
committerPulseAudio Marge Bot <pulseaudio-maintainers@lists.freedesktop.org>2021-06-16 09:17:27 +0000
commitce962563eba7ee18ad4641f700d097adbea6b6d7 (patch)
tree689a536018fd0b495326899b13c5cd0c804ef8b8
parent4f3ca10d9ec2db1d39b1da4bbc2c84ae5ade0aff (diff)
win32: Add DACLs for directories created by system daemonv14.99.2
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/549>
-rw-r--r--src/daemon/main.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/daemon/main.c b/src/daemon/main.c
index ec1ec3cac..924a4d4aa 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -62,6 +62,8 @@
#ifdef HAVE_WINDOWS_H
#include <windows.h>
+#include <aclapi.h>
+#include <sddl.h>
#endif
#include <pulse/client-conf.h>
@@ -180,7 +182,58 @@ static int change_user(void) {
char *run_path = pa_sprintf_malloc("%s" PA_PATH_SEP "run", pa_win32_get_system_appdata());
char *lib_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib", pa_win32_get_system_appdata());
- /* TODO: directory ACLs */
+ /* https://docs.microsoft.com/en-us/windows/win32/secauthz/ace-strings */
+ /* https://docs.microsoft.com/en-us/windows/win32/secauthz/modifying-the-acls-of-an-object-in-c-- */
+ /* https://docs.microsoft.com/en-us/windows/win32/api/sddl/nf-sddl-convertstringsecuritydescriptortosecuritydescriptora */
+ {
+ mkdir(run_path);
+ PSECURITY_DESCRIPTOR sd;
+ if (ConvertStringSecurityDescriptorToSecurityDescriptorA(
+ "D:PAI" /* DACL, disable inheritance from parent, enable propagation to children */
+ "(A;OICI;FA;;;SY)" /* give system full access */
+ "(A;OICI;FA;;;CO)" /* give owner full access */
+ "(A;OICI;FA;;;BA)" /* give administrators full access */
+ "(A;OICI;0x1200a9;;;WD)", /* give everyone read/write/execute access */
+ SDDL_REVISION_1, &sd, NULL
+ )) {
+ PACL acl;
+ BOOL acl_present, acl_default;
+ if (GetSecurityDescriptorDacl(sd, &acl_present, &acl, &acl_default)) {
+ if (SetNamedSecurityInfo(run_path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, acl, NULL) != ERROR_SUCCESS) {
+ pa_log_warn("Failed to set DACL for runtime dir: failed to apply DACL: error %lu.", GetLastError());
+ }
+ LocalFree(acl);
+ } else {
+ pa_log_warn("Failed to set DACL for runtime dir: failed to get security descriptor DACL: error %lu.", GetLastError());
+ }
+ } else {
+ pa_log_warn("Failed to set DACL for runtime dir: failed to parse security descriptor: error %lu.", GetLastError());
+ }
+ }
+ {
+ mkdir(lib_path);
+ PSECURITY_DESCRIPTOR sd;
+ if (ConvertStringSecurityDescriptorToSecurityDescriptorA(
+ "D:PAI" /* DACL, disable inheritance from parent, enable propagation to children */
+ "(A;OICI;FA;;;SY)" /* give system full access */
+ "(A;OICI;FA;;;CO)" /* give owner full access */
+ "(A;OICI;FA;;;BA)", /* give administrators full access */
+ SDDL_REVISION_1, &sd, NULL
+ )) {
+ PACL acl;
+ BOOL acl_present, acl_default;
+ if (GetSecurityDescriptorDacl(sd, &acl_present, &acl, &acl_default)) {
+ if (SetNamedSecurityInfo(lib_path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, acl, NULL) != ERROR_SUCCESS) {
+ pa_log_warn("Failed to set DACL for lib dir: failed to apply DACL: error %lu.", GetLastError());
+ }
+ LocalFree(acl);
+ } else {
+ pa_log_warn("Failed to set DACL for lib dir: failed to get security descriptor DACL: error %lu.", GetLastError());
+ }
+ } else {
+ pa_log_warn("Failed to set DACL for lib dir: failed to parse security descriptor: error %lu.", GetLastError());
+ }
+ }
pa_set_env("HOME", run_path);
if (!getenv("PULSE_RUNTIME_PATH"))