summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/security.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-04-08 07:57:28 +0000
committerCorinna Vinschen <corinna@vinschen.de>2004-04-08 07:57:28 +0000
commita9a5b2eab006f3479087bed7030a16b86cd791aa (patch)
tree74290bb4248d1700262db6b57176f68d63b875e3 /winsup/cygwin/security.cc
parent284a55c33e0739e57436e02460b7997c3e70253f (diff)
downloadcygnal-a9a5b2eab006f3479087bed7030a16b86cd791aa.tar.gz
cygnal-a9a5b2eab006f3479087bed7030a16b86cd791aa.tar.bz2
cygnal-a9a5b2eab006f3479087bed7030a16b86cd791aa.zip
* fhandler.cc (fhandler_base::open): Set query access mode according
to query_open setting. (fhandler_base::fhandler_base): Initialize query_open. * fhandler.h (FH_QUERYOPEN): Drop. (enum query_state): Add. (class fhandler_base): Add query_open member. (fhandler_base::get_query_open): Redefine to use query_open. (fhandler_base::set_query_open): Ditto. * fhandler_disk_file.cc (fhandler_base::fstat_fs): Remove O_DIROPEN from open_flags since it's added in open_fs anyway. Remove query_open_already. Use new query_open settings. Rearrange slightly. (fhandler_base::fstat_helper): Add get_io_handle as parameter to get_file_attribute. * security.cc (get_nt_object_attribute): Make returning an int. Return -1 on error, 0 otherwise. (get_file_attribute): Take an object handle as argument. Move down to allow calling get_nt_object_attribute in case a non-NULL handle is given. * security.h (get_file_attribute): Add handle to argument list. * syscalls.cc (chown_worker): Accomodate new definition of get_file_attribute.
Diffstat (limited to 'winsup/cygwin/security.cc')
-rw-r--r--winsup/cygwin/security.cc76
1 files changed, 41 insertions, 35 deletions
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc
index 8195298ad..c7533dee0 100644
--- a/winsup/cygwin/security.cc
+++ b/winsup/cygwin/security.cc
@@ -1367,40 +1367,7 @@ get_nt_attribute (const char *file, mode_t *attribute,
get_info_from_sd (sd, attribute, uidret, gidret);
}
-int
-get_file_attribute (int use_ntsec, const char *file,
- mode_t *attribute, __uid32_t *uidret, __gid32_t *gidret)
-{
- int res;
- syscall_printf ("file: %s", file);
-
- if (use_ntsec && allow_ntsec && wincap.has_security ())
- {
- get_nt_attribute (file, attribute, uidret, gidret);
- return 0;
- }
-
- if (uidret)
- *uidret = myself->uid;
- if (gidret)
- *gidret = myself->gid;
-
- if (!attribute)
- return 0;
-
- if (allow_ntea)
- {
- int oatt = *attribute;
- res = NTReadEA (file, ".UNIXATTR", (char *)attribute, sizeof (*attribute));
- *attribute |= oatt;
- }
- else
- res = 0;
-
- return res > 0 ? 0 : -1;
-}
-
-static void
+static int
get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
mode_t *attribute, __uid32_t *uidret,
__gid32_t *gidret)
@@ -1436,12 +1403,16 @@ get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
| GROUP_SECURITY_INFORMATION
| OWNER_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL, &psd)))
- __seterrno_from_win_error (ret);
+ {
+ __seterrno_from_win_error (ret);
+ return -1;
+ }
else
{
get_info_from_sd (psd, attribute, uidret, gidret);
LocalFree (psd);
}
+ return 0;
}
int
@@ -1457,6 +1428,41 @@ get_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
return -1;
}
+int
+get_file_attribute (int use_ntsec, HANDLE handle, const char *file,
+ mode_t *attribute, __uid32_t *uidret, __gid32_t *gidret)
+{
+ int res;
+ syscall_printf ("file: %s", file);
+
+ if (use_ntsec && allow_ntsec && wincap.has_security ())
+ {
+ if (handle && get_nt_object_attribute (handle, SE_FILE_OBJECT,
+ attribute, uidret, gidret))
+ get_nt_attribute (file, attribute, uidret, gidret);
+ return 0;
+ }
+
+ if (uidret)
+ *uidret = myself->uid;
+ if (gidret)
+ *gidret = myself->gid;
+
+ if (!attribute)
+ return 0;
+
+ if (allow_ntea)
+ {
+ int oatt = *attribute;
+ res = NTReadEA (file, ".UNIXATTR", (char *)attribute, sizeof (*attribute));
+ *attribute |= oatt;
+ }
+ else
+ res = 0;
+
+ return res > 0 ? 0 : -1;
+}
+
bool
add_access_allowed_ace (PACL acl, int offset, DWORD attributes,
PSID sid, size_t &len_add, DWORD inherit)