Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
d6828b19
Commit
d6828b19
authored
Dec 01, 2004
by
Dave Kleikamp
Committed by
Dave Kleikamp
Dec 01, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
JFS: add security and trusted xattrs
Signed-off-by:
Dave Kleikamp
<
shaggy@austin.ibm.com
>
parent
90d5ce21
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
4 deletions
+67
-4
fs/Kconfig
fs/Kconfig
+12
-0
fs/jfs/xattr.c
fs/jfs/xattr.c
+55
-4
No files found.
fs/Kconfig
View file @
d6828b19
...
@@ -266,6 +266,18 @@ config JFS_POSIX_ACL
...
@@ -266,6 +266,18 @@ config JFS_POSIX_ACL
If you don't know what Access Control Lists are, say N
If you don't know what Access Control Lists are, say N
config JFS_SECURITY
bool "JFS Security Labels"
depends on JFS_FS
help
Security labels support alternative access control models
implemented by security modules like SELinux. This option
enables an extended attribute handler for file security
labels in the jfs filesystem.
If you are not using a security module that requires using
extended attributes for file security labels, say N.
config JFS_DEBUG
config JFS_DEBUG
bool "JFS debugging"
bool "JFS debugging"
depends on JFS_FS
depends on JFS_FS
...
...
fs/jfs/xattr.c
View file @
d6828b19
...
@@ -91,6 +91,12 @@ struct ea_buffer {
...
@@ -91,6 +91,12 @@ struct ea_buffer {
#define XATTR_OS2_PREFIX "os2."
#define XATTR_OS2_PREFIX "os2."
#define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1)
#define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1)
/* XATTR_SECURITY_PREFIX is defined in include/linux/xattr.h */
#define XATTR_SECURITY_PREFIX_LEN (sizeof (XATTR_SECURITY_PREFIX) - 1)
#define XATTR_TRUSTED_PREFIX "trusted."
#define XATTR_TRUSTED_PREFIX_LEN (sizeof (XATTR_TRUSTED_PREFIX) - 1)
/*
/*
* These three routines are used to recognize on-disk extended attributes
* These three routines are used to recognize on-disk extended attributes
* that are in a recognized namespace. If the attribute is not recognized,
* that are in a recognized namespace. If the attribute is not recognized,
...
@@ -110,6 +116,19 @@ static inline int is_os2_xattr(struct jfs_ea *ea)
...
@@ -110,6 +116,19 @@ static inline int is_os2_xattr(struct jfs_ea *ea)
if
((
ea
->
namelen
>=
XATTR_USER_PREFIX_LEN
)
&&
if
((
ea
->
namelen
>=
XATTR_USER_PREFIX_LEN
)
&&
!
strncmp
(
ea
->
name
,
XATTR_USER_PREFIX
,
XATTR_USER_PREFIX_LEN
))
!
strncmp
(
ea
->
name
,
XATTR_USER_PREFIX
,
XATTR_USER_PREFIX_LEN
))
return
FALSE
;
return
FALSE
;
/*
* Check for "security."
*/
if
((
ea
->
namelen
>=
XATTR_SECURITY_PREFIX_LEN
)
&&
!
strncmp
(
ea
->
name
,
XATTR_SECURITY_PREFIX
,
XATTR_SECURITY_PREFIX_LEN
))
return
FALSE
;
/*
* Check for "trusted."
*/
if
((
ea
->
namelen
>=
XATTR_TRUSTED_PREFIX_LEN
)
&&
!
strncmp
(
ea
->
name
,
XATTR_TRUSTED_PREFIX
,
XATTR_TRUSTED_PREFIX_LEN
))
return
FALSE
;
/*
/*
* Add any other valid namespace prefixes here
* Add any other valid namespace prefixes here
*/
*/
...
@@ -770,6 +789,15 @@ static int can_set_xattr(struct inode *inode, const char *name,
...
@@ -770,6 +789,15 @@ static int can_set_xattr(struct inode *inode, const char *name,
*/
*/
return
can_set_system_xattr
(
inode
,
name
,
value
,
value_len
);
return
can_set_system_xattr
(
inode
,
name
,
value
,
value_len
);
if
(
strncmp
(
name
,
XATTR_TRUSTED_PREFIX
,
XATTR_TRUSTED_PREFIX_LEN
)
!=
0
)
return
(
capable
(
CAP_SYS_ADMIN
)
?
0
:
-
EPERM
);
#ifdef CONFIG_JFS_SECURITY
if
(
strncmp
(
name
,
XATTR_SECURITY_PREFIX
,
XATTR_SECURITY_PREFIX_LEN
)
!=
0
)
return
0
;
/* Leave it to the security module */
#endif
if
((
strncmp
(
name
,
XATTR_USER_PREFIX
,
XATTR_USER_PREFIX_LEN
)
!=
0
)
&&
if
((
strncmp
(
name
,
XATTR_USER_PREFIX
,
XATTR_USER_PREFIX_LEN
)
!=
0
)
&&
(
strncmp
(
name
,
XATTR_OS2_PREFIX
,
XATTR_OS2_PREFIX_LEN
)
!=
0
))
(
strncmp
(
name
,
XATTR_OS2_PREFIX
,
XATTR_OS2_PREFIX_LEN
)
!=
0
))
return
-
EOPNOTSUPP
;
return
-
EOPNOTSUPP
;
...
@@ -937,8 +965,17 @@ int jfs_setxattr(struct dentry *dentry, const char *name, const void *value,
...
@@ -937,8 +965,17 @@ int jfs_setxattr(struct dentry *dentry, const char *name, const void *value,
static
int
can_get_xattr
(
struct
inode
*
inode
,
const
char
*
name
)
static
int
can_get_xattr
(
struct
inode
*
inode
,
const
char
*
name
)
{
{
#ifdef CONFIG_JFS_SECURITY
if
(
strncmp
(
name
,
XATTR_SECURITY_PREFIX
,
XATTR_SECURITY_PREFIX_LEN
)
==
0
)
return
0
;
#endif
if
(
strncmp
(
name
,
XATTR_TRUSTED_PREFIX
,
XATTR_TRUSTED_PREFIX_LEN
)
==
0
)
return
(
capable
(
CAP_SYS_ADMIN
)
?
0
:
-
EPERM
);
if
(
strncmp
(
name
,
XATTR_SYSTEM_PREFIX
,
XATTR_SYSTEM_PREFIX_LEN
)
==
0
)
if
(
strncmp
(
name
,
XATTR_SYSTEM_PREFIX
,
XATTR_SYSTEM_PREFIX_LEN
)
==
0
)
return
0
;
return
0
;
return
permission
(
inode
,
MAY_READ
,
NULL
);
return
permission
(
inode
,
MAY_READ
,
NULL
);
}
}
...
@@ -1021,6 +1058,16 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
...
@@ -1021,6 +1058,16 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
return
err
;
return
err
;
}
}
/*
* No special permissions are needed to list attributes except for trusted.*
*/
static
inline
int
can_list
(
struct
jfs_ea
*
ea
)
{
return
(
strncmp
(
ea
->
name
,
XATTR_TRUSTED_PREFIX
,
XATTR_TRUSTED_PREFIX_LEN
)
||
capable
(
CAP_SYS_ADMIN
));
}
ssize_t
jfs_listxattr
(
struct
dentry
*
dentry
,
char
*
data
,
size_t
buf_size
)
ssize_t
jfs_listxattr
(
struct
dentry
*
dentry
,
char
*
data
,
size_t
buf_size
)
{
{
struct
inode
*
inode
=
dentry
->
d_inode
;
struct
inode
*
inode
=
dentry
->
d_inode
;
...
@@ -1045,8 +1092,10 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
...
@@ -1045,8 +1092,10 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
ealist
=
(
struct
jfs_ea_list
*
)
ea_buf
.
xattr
;
ealist
=
(
struct
jfs_ea_list
*
)
ea_buf
.
xattr
;
/* compute required size of list */
/* compute required size of list */
for
(
ea
=
FIRST_EA
(
ealist
);
ea
<
END_EALIST
(
ealist
);
ea
=
NEXT_EA
(
ea
))
for
(
ea
=
FIRST_EA
(
ealist
);
ea
<
END_EALIST
(
ealist
);
ea
=
NEXT_EA
(
ea
))
{
size
+=
name_size
(
ea
)
+
1
;
if
(
can_list
(
ea
))
size
+=
name_size
(
ea
)
+
1
;
}
if
(
!
data
)
if
(
!
data
)
goto
release
;
goto
release
;
...
@@ -1059,8 +1108,10 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
...
@@ -1059,8 +1108,10 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
/* Copy attribute names to buffer */
/* Copy attribute names to buffer */
buffer
=
data
;
buffer
=
data
;
for
(
ea
=
FIRST_EA
(
ealist
);
ea
<
END_EALIST
(
ealist
);
ea
=
NEXT_EA
(
ea
))
{
for
(
ea
=
FIRST_EA
(
ealist
);
ea
<
END_EALIST
(
ealist
);
ea
=
NEXT_EA
(
ea
))
{
int
namelen
=
copy_name
(
buffer
,
ea
);
if
(
can_list
(
ea
))
{
buffer
+=
namelen
+
1
;
int
namelen
=
copy_name
(
buffer
,
ea
);
buffer
+=
namelen
+
1
;
}
}
}
release:
release:
...
...
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