aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Pärtel <martin.partel@gmail.com>2023-11-19 21:49:53 +0200
committerMartin Pärtel <martin.partel@gmail.com>2023-11-19 21:49:53 +0200
commit5c8390f75925797a81973925a14cdf8ab092a3bc (patch)
treef998c665b983a173cffc6ada9113494ffac96268
parentbea88937f4564e282063fb44aeac485012cfae87 (diff)
parentdb61be1897ffe8f4d1a72bed62c8c892d06a1983 (diff)
downloadbindfs-5c8390f75925797a81973925a14cdf8ab092a3bc.tar.gz
Merge remote-tracking branch 'origin/master' into vagrant-ci
-rw-r--r--.github/workflows/tests.yml15
-rw-r--r--configure.ac2
-rw-r--r--src/bindfs.c45
-rw-r--r--src/misc.c11
-rw-r--r--src/permchain.c14
-rw-r--r--src/usermap.c4
-rw-r--r--tests/odirect_write.c2
7 files changed, 73 insertions, 20 deletions
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index c7a3317..d31deeb 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -12,27 +12,38 @@ on:
jobs:
linux:
- name: Build and test (${{ matrix.cc }} on ${{ matrix.runs-on }})
+ name: Build (${{ matrix.cc }} and ${{ matrix.fuse_package }} on ${{ matrix.runs-on }})
runs-on: ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
include:
+ # FUSE 2
- cc: gcc-13
cxx: g++-13
clang_major_version: null
clang_repo_suffix: null
runs-on: ubuntu-22.04
+ fuse_package: libfuse-dev
+ # FUSE 3
+ - cc: gcc-13
+ cxx: g++-13
+ clang_major_version: null
+ clang_repo_suffix: null
+ runs-on: ubuntu-22.04
+ fuse_package: libfuse3-dev
- cc: clang-17
cxx: clang++-17
clang_major_version: 17
clang_repo_suffix: -17
runs-on: ubuntu-22.04
+ fuse_package: libfuse3-dev
- cc: clang-18
cxx: clang++-18
clang_major_version: 18
clang_repo_suffix:
runs-on: ubuntu-22.04
+ fuse_package: libfuse3-dev
steps:
- name: Add Clang/LLVM repositories
if: "${{ contains(matrix.cxx, 'clang') }}"
@@ -48,7 +59,7 @@ jobs:
sudo apt-get install --yes --no-install-recommends \
autoconf \
automake \
- libfuse3-dev \
+ ${{ matrix.fuse_package }} \
libtool \
pkg-config
diff --git a/configure.ac b/configure.ac
index 00f8ebc..0598619 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,7 +35,7 @@ AM_CONDITIONAL([BUILD_OS_IS_DARWIN], [case $build_os in darwin* ) true ;; * ) fa
# _DARWIN_BETTER_REALPATH fixes MacOS realpath() broken around Catalina (#83).
my_CPPFLAGS="-D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_XOPEN_SOURCE=700 -D__BSD_VISIBLE=1 -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_DARWIN_BETTER_REALPATH"
-my_CFLAGS="-std=c99 -Wall -Wpedantic -fno-common"
+my_CFLAGS="-std=c99 -Wall -Wextra -Wpedantic -fno-common"
my_LDFLAGS="-pthread"
AC_SUBST([my_CPPFLAGS])
AC_SUBST([my_CFLAGS])
diff --git a/src/bindfs.c b/src/bindfs.c
index b4a1f5a..5f52395 100644
--- a/src/bindfs.c
+++ b/src/bindfs.c
@@ -446,9 +446,9 @@ static int getattr_common(const char *procpath, struct stat *stbuf)
}
/* Report user-defined owner/group if specified */
- if (settings.new_uid != -1)
+ if (settings.new_uid != (uid_t)-1)
stbuf->st_uid = settings.new_uid;
- if (settings.new_gid != -1)
+ if (settings.new_gid != (gid_t)-1)
stbuf->st_gid = settings.new_gid;
/* Mirrored user? */
@@ -549,12 +549,12 @@ static int chown_new_file(const char *path, struct fuse_context *fc, int (*chown
}
}
- if (settings.create_for_uid != -1)
+ if (settings.create_for_uid != (uid_t)-1)
file_owner = settings.create_for_uid;
- if (settings.create_for_gid != -1)
+ if (settings.create_for_gid != (gid_t)-1)
file_group = settings.create_for_gid;
- if ((file_owner != -1) || (file_group != -1)) {
+ if ((file_owner != (uid_t)-1) || (file_group != (gid_t)-1)) {
if (chown_func(path, file_owner, file_group) == -1) {
DPRINTF("Failed to chown new file or directory (%d)", errno);
}
@@ -750,6 +750,7 @@ static void *bindfs_init()
static void bindfs_destroy(void *private_data)
{
+ (void)private_data;
}
#ifdef HAVE_FUSE_3
@@ -761,6 +762,9 @@ static int bindfs_getattr(const char *path, struct stat *stbuf)
{
int res;
char *real_path;
+#ifdef HAVE_FUSE_3
+ (void)fi;
+#endif
real_path = process_path(path, true);
if (real_path == NULL)
@@ -827,6 +831,11 @@ static int bindfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
#endif
{
+ (void)offset;
+ (void)fi;
+#ifdef HAVE_FUSE_3
+ (void)flags;
+#endif
char *real_path = process_path(path, true);
if (real_path == NULL) {
return -errno;
@@ -1116,6 +1125,9 @@ static int bindfs_chmod(const char *path, mode_t mode)
struct stat st;
mode_t diff = 0;
char *real_path;
+#ifdef HAVE_FUSE_3
+ (void)fi;
+#endif
real_path = process_path(path, true);
if (real_path == NULL)
@@ -1181,8 +1193,11 @@ static int bindfs_chown(const char *path, uid_t uid, gid_t gid)
{
int res;
char *real_path;
+#ifdef HAVE_FUSE_3
+ (void)fi;
+#endif
- if (uid != -1) {
+ if (uid != (uid_t)-1) {
switch (settings.chown_policy) {
case CHOWN_NORMAL:
uid = usermap_get_uid_or_default(settings.usermap_reverse, uid, uid);
@@ -1198,7 +1213,7 @@ static int bindfs_chown(const char *path, uid_t uid, gid_t gid)
}
}
- if (gid != -1) {
+ if (gid != (gid_t)-1) {
switch (settings.chgrp_policy) {
case CHGRP_NORMAL:
gid = usermap_get_gid_or_default(settings.usermap_reverse, gid, gid);
@@ -1214,7 +1229,7 @@ static int bindfs_chown(const char *path, uid_t uid, gid_t gid)
}
}
- if (uid != -1 || gid != -1) {
+ if (uid != (uid_t)-1 || gid != (gid_t)-1) {
real_path = process_path(path, true);
if (real_path == NULL)
return -errno;
@@ -1237,6 +1252,9 @@ static int bindfs_truncate(const char *path, off_t size)
{
int res;
char *real_path;
+#ifdef HAVE_FUSE_3
+ (void)fi;
+#endif
real_path = process_path(path, true);
if (real_path == NULL)
@@ -1273,6 +1291,9 @@ static int bindfs_utimens(const char *path, const struct timespec ts[2])
{
int res;
char *real_path;
+#ifdef HAVE_FUSE_3
+ (void)fi;
+#endif
real_path = process_path(path, true);
if (real_path == NULL)
@@ -1437,6 +1458,7 @@ static int bindfs_write(const char *path, const char *buf, size_t size,
static int bindfs_lock(const char *path, struct fuse_file_info *fi, int cmd,
struct flock *lock)
{
+ (void)path;
int res = fcntl(fi->fh, cmd, lock);
if (res == -1) {
return -errno;
@@ -1447,6 +1469,7 @@ static int bindfs_lock(const char *path, struct fuse_file_info *fi, int cmd,
/* This callback is only installed if lock forwarding is enabled. */
static int bindfs_flock(const char *path, struct fuse_file_info *fi, int op)
{
+ (void)path;
int res = flock(fi->fh, op);
if (res == -1) {
return -errno;
@@ -1464,6 +1487,9 @@ static int bindfs_ioctl(const char *path, int cmd, void *arg,
void *data)
#endif
{
+ (void)path;
+ (void)arg;
+ (void)flags;
int res = ioctl(fi->fh, cmd, data);
if (res == -1) {
return -errno;
@@ -1891,6 +1917,8 @@ enum OptionKey {
static int process_option(void *data, const char *arg, int key,
struct fuse_args *outargs)
{
+ (void)data;
+ (void)outargs;
switch ((enum OptionKey)key)
{
case OPTKEY_HELP:
@@ -2322,6 +2350,7 @@ static void setup_signal_handling()
static void signal_handler(int sig)
{
+ (void)sig;
invalidate_user_cache();
}
diff --git a/src/misc.c b/src/misc.c
index 122497d..fdebff9 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -19,6 +19,7 @@
#include "misc.h"
#include <stdarg.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -166,7 +167,7 @@ bool path_starts_with(const char *path, const char* prefix, size_t prefix_len)
const char* path_part = path + (prefix_part - prefix);
const char* path_slash = strchr(path_part, '/');
- size_t path_part_len = path_slash ? path_slash - path_part : path_len - (path_part - path);
+ size_t path_part_len = path_slash ? (size_t)(path_slash - path_part) : path_len - (path_part - path);
return prefix_part_len == path_part_len;
}
@@ -328,12 +329,12 @@ void grow_memory_block(struct memory_block *a, size_t amount)
if (new_cap == 0) {
new_cap = 8;
} else {
+ if (new_cap > SIZE_MAX / 2) {
+ fprintf(stderr, "Memory block too large.");
+ abort();
+ }
new_cap *= 2;
}
- if (new_cap < 0) { // Overflow
- fprintf(stderr, "Memory block too large.");
- abort();
- }
}
a->ptr = (char *)realloc(a->ptr, new_cap);
a->capacity = new_cap;
diff --git a/src/permchain.c b/src/permchain.c
index b95bd8b..d101aa1 100644
--- a/src/permchain.c
+++ b/src/permchain.c
@@ -67,6 +67,8 @@ static int add_chmod_rule_to_permchain(const char *start, const char *end,
int len = end - start;
char *buf = malloc((len + 1) * sizeof(char));
+ if (buf == NULL)
+ return -1;
const char *p = buf;
enum {LHS, RHS} state = LHS;
@@ -149,8 +151,18 @@ error:
static int add_octal_rule_to_permchain(const char *start, const char *end,
struct permchain *pc)
{
+ // Make [start..end[ available as a null-terminated string to `strtol`
+ const int len = end - start;
+ char * const buf = malloc((len + 1) * sizeof(char));
+ if (buf == NULL)
+ return -1;
+ memcpy(buf, start, len);
+ buf[len] = '\0';
+
struct permchain *newpc = permchain_create();
- long mode = strtol(start, NULL, 8);
+
+ long mode = strtol(buf, NULL, 8);
+ free(buf);
if (mode < 0 || mode > 0777) {
permchain_destroy(newpc);
diff --git a/src/usermap.c b/src/usermap.c
index f745e74..eb7b61c 100644
--- a/src/usermap.c
+++ b/src/usermap.c
@@ -52,7 +52,7 @@ UsermapStatus usermap_add_uid(UserMap *map, uid_t from, uid_t to)
map->user_from = (uid_t*)realloc(map->user_from, map->user_capacity * sizeof(uid_t));
map->user_to = (uid_t*)realloc(map->user_to, map->user_capacity * sizeof(uid_t));
}
- if (usermap_get_uid_or_default(map, from, -1) != -1) {
+ if (usermap_get_uid_or_default(map, from, -1) != (uid_t)-1) {
return usermap_status_duplicate_key;
}
i = map->user_size;
@@ -77,7 +77,7 @@ UsermapStatus usermap_add_gid(UserMap *map, gid_t from, gid_t to)
map->group_from = (gid_t*)realloc(map->group_from, map->group_capacity * sizeof(gid_t));
map->group_to = (gid_t*)realloc(map->group_to, map->group_capacity * sizeof(gid_t));
}
- if (usermap_get_gid_or_default(map, from, -1) != -1) {
+ if (usermap_get_gid_or_default(map, from, -1) != (gid_t)-1) {
return usermap_status_duplicate_key;
}
i = map->group_size;
diff --git a/tests/odirect_write.c b/tests/odirect_write.c
index 10b63f9..bc9040f 100644
--- a/tests/odirect_write.c
+++ b/tests/odirect_write.c
@@ -55,7 +55,7 @@ int main(int argc, char** argv) {
perror("failed to write");
return 1;
}
- if (res != buf_size) {
+ if ((size_t)res != buf_size) {
// Too lazy to write a loop here unless it turns out to be necessary.
fprintf(stderr, "Failed to write exactly %lu bytes", (unsigned long)amt_read);
}