aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEytan Heidingsfeld <{ID}+{username}@users.noreply.github.com>2019-03-26 21:09:54 +0000
committerEytan Heidingsfeld <{ID}+{username}@users.noreply.github.com>2019-03-26 21:09:54 +0000
commitb197a7ed3cd9b5ae6aec7dfbea706bdf4ccfced7 (patch)
tree8ee2e84477561c158e975babb3b7a203c17d065e
parenta5b1877fa1bcdf289faf83654c88bf6a7a44e7e5 (diff)
downloadbindfs-b197a7ed3cd9b5ae6aec7dfbea706bdf4ccfced7.tar.gz
Fix issue where sgid is set and gid-offset is used
-rw-r--r--src/bindfs.c15
-rw-r--r--src/usermap.c2
2 files changed, 12 insertions, 5 deletions
diff --git a/src/bindfs.c b/src/bindfs.c
index baacb82..b5455f1 100644
--- a/src/bindfs.c
+++ b/src/bindfs.c
@@ -450,13 +450,18 @@ static int chown_new_file(const char *path, struct fuse_context *fc, int (*chown
file_owner = usermap_get_uid_or_default(settings.usermap_reverse, fc->uid, file_owner);
file_group = usermap_get_gid_or_default(settings.usermap_reverse, fc->gid, file_group);
- if (!unapply_uid_offset(&file_owner)) {
- return -UID_GID_OVERFLOW_ERRNO;
- }
- if (!unapply_gid_offset(&file_group)) {
- return -UID_GID_OVERFLOW_ERRNO;
+ if (file_owner != (uid_t)-1) {
+ if (!unapply_uid_offset(&file_owner)) {
+ return -UID_GID_OVERFLOW_ERRNO;
+ }
}
+ if (file_group != (gid_t)-1) {
+ if (!unapply_gid_offset(&file_group)) {
+ return -UID_GID_OVERFLOW_ERRNO;
+ }
+ }
+
if (settings.create_for_uid != -1)
file_owner = settings.create_for_uid;
if (settings.create_for_gid != -1)
diff --git a/src/usermap.c b/src/usermap.c
index f745e74..a85b597 100644
--- a/src/usermap.c
+++ b/src/usermap.c
@@ -99,6 +99,7 @@ const char* usermap_errorstr(UsermapStatus status)
uid_t usermap_get_uid_or_default(UserMap *map, uid_t u, uid_t deflt)
{
int i;
+ if (u == -1) return -1;
for (i = 0; i < map->user_size; ++i) {
if (map->user_from[i] == u) {
return map->user_to[i];
@@ -110,6 +111,7 @@ uid_t usermap_get_uid_or_default(UserMap *map, uid_t u, uid_t deflt)
gid_t usermap_get_gid_or_default(UserMap *map, gid_t g, gid_t deflt)
{
int i;
+ if (g == -1) return -1;
for (i = 0; i < map->group_size; ++i) {
if (map->group_from[i] == g) {
return map->group_to[i];