Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
d87af3df
Commit
d87af3df
authored
Nov 03, 2008
by
Paul Bryan Roberts
Committed by
Alexandre Julliard
Nov 07, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Refactor server side implementation of GetFileSecurity().
parent
27037218
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
55 additions
and
49 deletions
+55
-49
file.c
server/file.c
+53
-49
file.h
server/file.h
+2
-0
No files found.
server/file.c
View file @
d87af3df
...
...
@@ -75,7 +75,6 @@ static void file_destroy( struct object *obj );
static
int
file_get_poll_events
(
struct
fd
*
fd
);
static
void
file_flush
(
struct
fd
*
fd
,
struct
event
**
event
);
static
enum
server_fd_type
file_get_fd_type
(
struct
fd
*
fd
);
static
mode_t
sd_to_mode
(
const
struct
security_descriptor
*
sd
,
const
SID
*
owner
);
static
const
struct
object_ops
file_ops
=
{
...
...
@@ -291,14 +290,9 @@ static unsigned int generic_file_map_access( unsigned int access )
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
st
atic
struct
security_descriptor
*
file_get_sd
(
struct
object
*
obj
)
st
ruct
security_descriptor
*
mode_to_sd
(
mode_t
mode
,
const
SID
*
user
,
const
SID
*
group
)
{
struct
file
*
file
=
(
struct
file
*
)
obj
;
struct
stat
st
;
int
unix_fd
;
struct
security_descriptor
*
sd
;
const
SID
*
user
;
const
SID
*
group
;
size_t
dacl_size
;
ACE_HEADER
*
current_ace
;
ACCESS_ALLOWED_ACE
*
aaa
;
...
...
@@ -308,34 +302,17 @@ static struct security_descriptor *file_get_sd( struct object *obj )
const
SID
*
world_sid
=
security_world_sid
;
const
SID
*
local_system_sid
=
security_local_system_sid
;
assert
(
obj
->
ops
==
&
file_ops
);
unix_fd
=
get_file_unix_fd
(
file
);
if
(
unix_fd
==
-
1
)
return
obj
->
sd
;
if
(
fstat
(
unix_fd
,
&
st
)
==
-
1
)
return
obj
->
sd
;
/* mode and uid the same? if so, no need to re-generate security descriptor */
if
(
obj
->
sd
&&
(
st
.
st_mode
&
(
S_IRWXU
|
S_IRWXO
))
==
(
file
->
mode
&
(
S_IRWXU
|
S_IRWXO
))
&&
(
st
.
st_uid
==
file
->
uid
))
return
obj
->
sd
;
user
=
security_unix_uid_to_sid
(
st
.
st_uid
);
group
=
token_get_primary_group
(
current
->
process
->
token
);
dacl_size
=
sizeof
(
ACL
)
+
FIELD_OFFSET
(
ACCESS_ALLOWED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
local_system_sid
->
SubAuthorityCount
]);
if
(
st
.
st_
mode
&
S_IRWXU
)
if
(
mode
&
S_IRWXU
)
dacl_size
+=
FIELD_OFFSET
(
ACCESS_ALLOWED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
]);
if
((
!
(
st
.
st_mode
&
S_IRUSR
)
&&
(
st
.
st_
mode
&
(
S_IRGRP
|
S_IROTH
)))
||
(
!
(
st
.
st_mode
&
S_IWUSR
)
&&
(
st
.
st_
mode
&
(
S_IWGRP
|
S_IWOTH
)))
||
(
!
(
st
.
st_mode
&
S_IXUSR
)
&&
(
st
.
st_
mode
&
(
S_IXGRP
|
S_IXOTH
))))
if
((
!
(
mode
&
S_IRUSR
)
&&
(
mode
&
(
S_IRGRP
|
S_IROTH
)))
||
(
!
(
mode
&
S_IWUSR
)
&&
(
mode
&
(
S_IWGRP
|
S_IWOTH
)))
||
(
!
(
mode
&
S_IXUSR
)
&&
(
mode
&
(
S_IXGRP
|
S_IXOTH
))))
dacl_size
+=
FIELD_OFFSET
(
ACCESS_DENIED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
]);
if
(
st
.
st_
mode
&
S_IRWXO
)
if
(
mode
&
S_IRWXO
)
dacl_size
+=
FIELD_OFFSET
(
ACCESS_ALLOWED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
world_sid
->
SubAuthorityCount
]);
...
...
@@ -343,7 +320,7 @@ static struct security_descriptor *file_get_sd( struct object *obj )
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
])
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
group
->
SubAuthorityCount
])
+
dacl_size
);
if
(
!
sd
)
return
obj
->
sd
;
if
(
!
sd
)
return
sd
;
sd
->
control
=
SE_DACL_PRESENT
;
sd
->
owner_len
=
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
]);
...
...
@@ -361,10 +338,10 @@ static struct security_descriptor *file_get_sd( struct object *obj )
dacl
->
AclRevision
=
ACL_REVISION
;
dacl
->
Sbz1
=
0
;
dacl
->
AclSize
=
dacl_size
;
dacl
->
AceCount
=
1
+
(
st
.
st_mode
&
S_IRWXU
?
1
:
0
)
+
(
st
.
st_
mode
&
S_IRWXO
?
1
:
0
);
if
((
!
(
st
.
st_mode
&
S_IRUSR
)
&&
(
st
.
st_
mode
&
(
S_IRGRP
|
S_IROTH
)))
||
(
!
(
st
.
st_mode
&
S_IWUSR
)
&&
(
st
.
st_
mode
&
(
S_IWGRP
|
S_IWOTH
)))
||
(
!
(
st
.
st_mode
&
S_IXUSR
)
&&
(
st
.
st_
mode
&
(
S_IXGRP
|
S_IXOTH
))))
dacl
->
AceCount
=
1
+
(
mode
&
S_IRWXU
?
1
:
0
)
+
(
mode
&
S_IRWXO
?
1
:
0
);
if
((
!
(
mode
&
S_IRUSR
)
&&
(
mode
&
(
S_IRGRP
|
S_IROTH
)))
||
(
!
(
mode
&
S_IWUSR
)
&&
(
mode
&
(
S_IWGRP
|
S_IWOTH
)))
||
(
!
(
mode
&
S_IXUSR
)
&&
(
mode
&
(
S_IXGRP
|
S_IXOTH
))))
dacl
->
AceCount
++
;
dacl
->
Sbz2
=
0
;
...
...
@@ -379,7 +356,7 @@ static struct security_descriptor *file_get_sd( struct object *obj )
sid
=
(
SID
*
)
&
aaa
->
SidStart
;
memcpy
(
sid
,
local_system_sid
,
FIELD_OFFSET
(
SID
,
SubAuthority
[
local_system_sid
->
SubAuthorityCount
])
);
if
(
st
.
st_
mode
&
S_IRWXU
)
if
(
mode
&
S_IRWXU
)
{
/* appropriate access rights for the user */
aaa
=
(
ACCESS_ALLOWED_ACE
*
)
ace_next
(
current_ace
);
...
...
@@ -389,18 +366,18 @@ static struct security_descriptor *file_get_sd( struct object *obj )
aaa
->
Header
.
AceSize
=
FIELD_OFFSET
(
ACCESS_ALLOWED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
]);
aaa
->
Mask
=
WRITE_DAC
|
WRITE_OWNER
;
if
(
st
.
st_
mode
&
S_IRUSR
)
if
(
mode
&
S_IRUSR
)
aaa
->
Mask
|=
FILE_GENERIC_READ
;
if
(
st
.
st_
mode
&
S_IWUSR
)
if
(
mode
&
S_IWUSR
)
aaa
->
Mask
|=
FILE_GENERIC_WRITE
|
DELETE
;
if
(
st
.
st_
mode
&
S_IXUSR
)
if
(
mode
&
S_IXUSR
)
aaa
->
Mask
|=
FILE_GENERIC_EXECUTE
;
sid
=
(
SID
*
)
&
aaa
->
SidStart
;
memcpy
(
sid
,
user
,
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
])
);
}
if
((
!
(
st
.
st_mode
&
S_IRUSR
)
&&
(
st
.
st_
mode
&
(
S_IRGRP
|
S_IROTH
)))
||
(
!
(
st
.
st_mode
&
S_IWUSR
)
&&
(
st
.
st_
mode
&
(
S_IWGRP
|
S_IWOTH
)))
||
(
!
(
st
.
st_mode
&
S_IXUSR
)
&&
(
st
.
st_
mode
&
(
S_IXGRP
|
S_IXOTH
))))
if
((
!
(
mode
&
S_IRUSR
)
&&
(
mode
&
(
S_IRGRP
|
S_IROTH
)))
||
(
!
(
mode
&
S_IWUSR
)
&&
(
mode
&
(
S_IWGRP
|
S_IWOTH
)))
||
(
!
(
mode
&
S_IXUSR
)
&&
(
mode
&
(
S_IXGRP
|
S_IXOTH
))))
{
/* deny just in case the user is a member of the group */
ACCESS_DENIED_ACE
*
ada
=
(
ACCESS_DENIED_ACE
*
)
ace_next
(
current_ace
);
...
...
@@ -410,17 +387,17 @@ static struct security_descriptor *file_get_sd( struct object *obj )
ada
->
Header
.
AceSize
=
FIELD_OFFSET
(
ACCESS_DENIED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
]);
ada
->
Mask
=
0
;
if
(
!
(
st
.
st_mode
&
S_IRUSR
)
&&
(
st
.
st_
mode
&
(
S_IRGRP
|
S_IROTH
)))
if
(
!
(
mode
&
S_IRUSR
)
&&
(
mode
&
(
S_IRGRP
|
S_IROTH
)))
ada
->
Mask
|=
FILE_GENERIC_READ
;
if
(
!
(
st
.
st_mode
&
S_IWUSR
)
&&
(
st
.
st_
mode
&
(
S_IWGRP
|
S_IROTH
)))
if
(
!
(
mode
&
S_IWUSR
)
&&
(
mode
&
(
S_IWGRP
|
S_IROTH
)))
ada
->
Mask
|=
FILE_GENERIC_WRITE
|
DELETE
;
if
(
!
(
st
.
st_mode
&
S_IXUSR
)
&&
(
st
.
st_
mode
&
(
S_IXGRP
|
S_IXOTH
)))
if
(
!
(
mode
&
S_IXUSR
)
&&
(
mode
&
(
S_IXGRP
|
S_IXOTH
)))
ada
->
Mask
|=
FILE_GENERIC_EXECUTE
;
ada
->
Mask
&=
~
STANDARD_RIGHTS_ALL
;
/* never deny standard rights */
sid
=
(
SID
*
)
&
ada
->
SidStart
;
memcpy
(
sid
,
user
,
FIELD_OFFSET
(
SID
,
SubAuthority
[
user
->
SubAuthorityCount
])
);
}
if
(
st
.
st_
mode
&
S_IRWXO
)
if
(
mode
&
S_IRWXO
)
{
/* appropriate access rights for Everyone */
aaa
=
(
ACCESS_ALLOWED_ACE
*
)
ace_next
(
current_ace
);
...
...
@@ -430,16 +407,43 @@ static struct security_descriptor *file_get_sd( struct object *obj )
aaa
->
Header
.
AceSize
=
FIELD_OFFSET
(
ACCESS_ALLOWED_ACE
,
SidStart
)
+
FIELD_OFFSET
(
SID
,
SubAuthority
[
world_sid
->
SubAuthorityCount
]);
aaa
->
Mask
=
0
;
if
(
st
.
st_
mode
&
S_IROTH
)
if
(
mode
&
S_IROTH
)
aaa
->
Mask
|=
FILE_GENERIC_READ
;
if
(
st
.
st_
mode
&
S_IWOTH
)
if
(
mode
&
S_IWOTH
)
aaa
->
Mask
|=
FILE_GENERIC_WRITE
|
DELETE
;
if
(
st
.
st_
mode
&
S_IXOTH
)
if
(
mode
&
S_IXOTH
)
aaa
->
Mask
|=
FILE_GENERIC_EXECUTE
;
sid
=
(
SID
*
)
&
aaa
->
SidStart
;
memcpy
(
sid
,
world_sid
,
FIELD_OFFSET
(
SID
,
SubAuthority
[
world_sid
->
SubAuthorityCount
])
);
}
return
sd
;
}
static
struct
security_descriptor
*
file_get_sd
(
struct
object
*
obj
)
{
struct
file
*
file
=
(
struct
file
*
)
obj
;
struct
stat
st
;
int
unix_fd
;
struct
security_descriptor
*
sd
;
assert
(
obj
->
ops
==
&
file_ops
);
unix_fd
=
get_file_unix_fd
(
file
);
if
(
unix_fd
==
-
1
||
fstat
(
unix_fd
,
&
st
)
==
-
1
)
return
obj
->
sd
;
/* mode and uid the same? if so, no need to re-generate security descriptor */
if
(
obj
->
sd
&&
(
st
.
st_mode
&
(
S_IRWXU
|
S_IRWXO
))
==
(
file
->
mode
&
(
S_IRWXU
|
S_IRWXO
))
&&
(
st
.
st_uid
==
file
->
uid
))
return
obj
->
sd
;
sd
=
mode_to_sd
(
st
.
st_mode
,
security_unix_uid_to_sid
(
st
.
st_uid
),
token_get_primary_group
(
current
->
process
->
token
));
if
(
!
sd
)
return
obj
->
sd
;
file
->
mode
=
st
.
st_mode
;
file
->
uid
=
st
.
st_uid
;
free
(
obj
->
sd
);
...
...
@@ -447,7 +451,7 @@ static struct security_descriptor *file_get_sd( struct object *obj )
return
sd
;
}
static
mode_t
sd_to_mode
(
const
struct
security_descriptor
*
sd
,
const
SID
*
owner
)
mode_t
sd_to_mode
(
const
struct
security_descriptor
*
sd
,
const
SID
*
owner
)
{
mode_t
new_mode
=
0
;
mode_t
denied_mode
=
0
;
...
...
server/file.h
View file @
d87af3df
...
...
@@ -112,6 +112,8 @@ extern struct file *grab_file_unless_removable( struct file *file );
extern
int
grow_file
(
struct
file
*
file
,
file_pos_t
size
);
extern
struct
file
*
create_temp_file
(
int
access
);
extern
void
file_set_error
(
void
);
extern
struct
security_descriptor
*
mode_to_sd
(
mode_t
mode
,
const
SID
*
user
,
const
SID
*
group
);
extern
mode_t
sd_to_mode
(
const
struct
security_descriptor
*
sd
,
const
SID
*
owner
);
/* change notification functions */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment