Commit Graph

40 Commits

Author SHA1 Message Date
Christian Göttsche
2ae2ec3542 Enable and resolve sign comparisson warnings
Comparisson of different signedness can result in unexpected results due
to implicit conversions.

    ../network.c:81:34: warning: comparison of integer expressions of different signedness: ‘__u32’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare]
       81 |           if (rheader->nlmsg_seq != seq_nr)
          |                                  ^~
    ../network.c:83:34: warning: comparison of integer expressions of different signedness: ‘__u32’ {aka ‘unsigned int’} and ‘__pid_t’ {aka ‘int’} [-Wsign-compare]
      83 |           if (rheader->nlmsg_pid != getpid ())
          |                                  ^~

    ../bind-mount.c:268:17: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
      268 |       assert (i < n_lines);
          |                 ^
    ../bind-mount.c:309:13: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
      309 |   assert (i == n_lines);
          |             ^~
    ../bind-mount.c:318:17: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
      318 |   for (i = 0; i < n_lines; i++)
          |                 ^
    ../bind-mount.c:321:17: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
      321 |   for (i = 0; i < n_lines; i++)
          |                 ^

    ../utils.c:818:19: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘ssize_t’ {aka ‘long int’} [-Wsign-compare]
      818 |   while (size - 2 < n);
          |                   ^

    ../bubblewrap.c:489:13: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
      489 |   assert (j < sizeof(dont_close)/sizeof(*dont_close));
          |             ^
    ../bubblewrap.c:994:25: warning: comparison of integer expressions of different signedness: ‘int’ and ‘uid_t’ {aka ‘unsigned int’} [-Wsign-compare]
      994 |       if (setfsuid (-1) != real_uid)
          |                         ^~
    ../bubblewrap.c:1042:61: warning: comparison of integer expressions of different signedness: ‘ssize_t’ {aka ‘long int’} and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
     1042 |       if (write (privileged_op_socket, buffer, buffer_size) != buffer_size)
          |                                                             ^~
    ../bubblewrap.c:1232:25: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
     1232 |           for (i = 0; i < N_ELEMENTS (cover_proc_dirs); i++)
          |                         ^
    ../bubblewrap.c:1260:25: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
     1260 |           for (i = 0; i < N_ELEMENTS (devnodes); i++)
          |                         ^
    ../bubblewrap.c:1272:25: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
     1272 |           for (i = 0; i < N_ELEMENTS (stdionodes); i++)
          |                         ^
    ../bubblewrap.c: In function ‘read_priv_sec_op’:
    ../bubblewrap.c:1556:15: warning: comparison of integer expressions of different signedness: ‘ssize_t’ {aka ‘long int’} and ‘long unsigned int’ [-Wsign-compare]
     1556 |   if (rec_len < sizeof (PrivSepOp))
          |               ^
    ../bubblewrap.c:1626:28: warning: comparison of integer expressions of different signedness: ‘int’ and ‘uint32_t’ {aka ‘unsigned int’} [-Wsign-compare]
     1626 |   if (*total_parsed_argc_p > MAX_ARGS)
          |                            ^
    ../bubblewrap.c:1681:40: warning: comparison of integer expressions of different signedness: ‘int’ and ‘uint32_t’ {aka ‘unsigned int’} [-Wsign-compare]
     1681 |               if (*total_parsed_argc_p > MAX_ARGS)
          |                                        ^
    ../bubblewrap.c:2265:31: warning: comparison of integer expressions of different signedness: ‘uid_t’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare]
     2265 |           if (opt_sandbox_uid != -1)
          |                               ^~
    ../bubblewrap.c:2285:31: warning: comparison of integer expressions of different signedness: ‘gid_t’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare]
     2285 |           if (opt_sandbox_gid != -1)
          |                               ^~
    ../bubblewrap.c:2678:23: warning: comparison of integer expressions of different signedness: ‘uid_t’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare]
     2678 |   if (opt_sandbox_uid == -1)
          |                       ^~
    ../bubblewrap.c:2680:23: warning: comparison of integer expressions of different signedness: ‘gid_t’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare]
     2680 |   if (opt_sandbox_gid == -1)
          |                       ^~

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
2023-02-28 21:53:19 +01:00
Simon McVittie
d4554fcf25 utils: Silence -Wunused-parameter with clang, Meson, and SELinux disabled
These parameters are unused if SELinux happens to be disabled.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-04-05 14:34:47 +01:00
a1346054
366564eaa0 Fix spelling
Signed-off-by: a1346054 <36859588+a1346054@users.noreply.github.com>
2021-10-14 14:40:10 +02:00
Simon McVittie
22af8f72ec die_with_error: Save errno sooner
We need to save errno immediately, otherwise it could be overwritten
by a failing library call somewhere in the implementation of fprintf.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-10-11 09:57:47 +02:00
Simon McVittie
9d187f096d utils: Add warn()
Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-10-10 13:07:28 +01:00
Simon McVittie
a6c90c516b Add SPDX-License-Identifier for files that already specify license
This is a step towards REUSE compliance. Third-party files that we do
not otherwise edit (git.mk, m4/attributes.m4) are excluded here.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-08-31 12:32:40 +01:00
Colin Walters
dca0a31f03 Merge pull request #429 from smcv/selinux-warnings
utils: Remove security_context_t casts for libselinux >= 2.3
2021-06-23 09:30:42 -04:00
Colin Walters
136b3166bb Merge pull request #401 from smcv/clearenv
Add --clearenv option
2021-06-23 09:29:52 -04:00
Simon McVittie
80dc9b5e86 Merge pull request #403 from RyuzakiKK/case_insensitive_fs
Add support for bind-mount on case-insensitive filesystems
2021-06-23 10:17:42 +01:00
Simon McVittie
8f72ceb2c4 Add --clearenv option
This allows environment variables to be set when running bwrap itself
(perhaps a custom LD_LIBRARY_PATH), but cleared for the command that
runs in the container, without having to enumerate all the variables.

Because PWD is set later, as a side-effect of changing directory, this
actually clears everything except PWD.

A portable program would check for clearenv() (and if not found, fall
back to using environ = NULL), but bubblewrap is Linux-specific, and
Linux C libraries (at least glibc and musl) do have clearenv().

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-06-22 17:57:35 +01:00
Simon McVittie
eb48ee8347 utils: Remove security_context_t casts for libselinux >= 2.3
security_context_t has always been a typedef for char * and used more
or less interchangeably with char *, but the use of a typedef turned
out to be bad for const-correctness. The function signatures were
changed to take const char * in libselinux 2.3, in 2014[1] and the
typedef was formally deprecated in 2020[2].

On very old OSs like Ubuntu 14.04, reinstate the casts to suppress
warnings from -Wdiscarded-qualifiers.

[1] https://github.com/SELinuxProject/selinux/commit/9eb9c9327563
[2] https://github.com/SELinuxProject/selinux/commit/7a124ca27581

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-06-22 17:52:53 +01:00
Simon McVittie
a00f39fc4e Don't require mount point for a non-directory to be a regular file
Previously, mounting a socket over the top of an existing socket
would fail, because create_file() opens it with creat():

    $ test -e /run/systemd/resolve/io.systemd.Resolve && echo exists
    exists
    $ bwrap \
      --bind / / \
      --bind /run/systemd/resolve/io.systemd.Resolve \
             /run/systemd/resolve/io.systemd.Resolve \
      /bin/true
    bwrap: Can't create file at /run/systemd/resolve/io.systemd.Resolve: No such device or address

Tolerate the file existing as any type that we will be able to mount
a non-directory onto.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-05-14 12:23:41 +01:00
Ludovico de Nittis
04c0ca17ad Add support for bind-mount on case-insensitive filesystems
If we are using a case-insensitive filesystem the bind-mount operation
might fail when `/proc/self/mountinfo` is checked.

In a case-insensitive filesystem, if we ask to mount a certain
directory, e.g. '/CI_fs/foo', the kernel might add its entry in
`mountinfo` as '/CI_fs/FOO'. This happens because the kernel populates
`mountinfo` with whatever case combination first appeared in the dcache.

With this patch we open the requested path and look at its
`/proc/self/fd`, using readlink(), to get the path case combination that
the kernel is also expected to be using.

Signed-off-by: Ludovico de Nittis <ludovico.denittis@collabora.com>
2021-02-16 13:46:10 +01:00
Alexander Larsson
4a7ecc630f utils: Add fork_intermediate_child() helper
This just forks and exits in the parent, continuing in the child.
2019-11-22 11:17:42 +01:00
Alexander Larsson
d068ec2bfa utils: Add some utility function to pass pids over a socket
This uses SCM_CREDENTIALS as a way to translate pids between the
sender and the destination namespaces.
2019-11-22 11:17:42 +01:00
Jakub Wilk
1622673a4d Print "Out of memory" on stderr, not stdout
Closes: #303
Approved by: smcv
2019-02-26 17:45:46 +00:00
Alexander Larsson
1e90a18a08 Don't rely on mkdir returning EEXISTS (fixing NFS)
For NFS mounts if we call mkdir() on a read-only mount (such as when
we've created a read-only bind mount) the kernel will nor return EEXIST
even when the directory exists, instead returning EROFS.

So, we add (and use) an ensure_dir() helper that stats before calling
mkdir.

Closes: #258
Approved by: giuseppe
2018-03-16 22:07:13 +00:00
Vladimir Panteleev
c09c1e5307 Prefix error messages with program name
It may not always be obvious what the source of any particular error
message is. For instance, "Can't find source path" errors could be
perceived as coming from either the shell, loader, bubblewrap, or the
wrapped application, especially when a previously-configured program
stops working due to some external circumstances.

Thus, disambiguate the source of bubblewrap's error messages by
printing them with a "bwrap: " prefix.

Closes: #234
Approved by: cgwalters
2017-10-08 19:10:07 +00:00
Alexander Larsson
c9c5dda3e1 utils: Add path_equal()
Closes: #118
Approved by: alexlarsson
2016-11-15 13:57:43 +00:00
Alexander Larsson
d69ab9202b Ran uncruftify.sh
Closes: #67
Approved by: cgwalters
2016-05-13 12:21:08 +00:00
Mrunal Patel
4c943ddc5a Convert tabs to spaces
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

Closes: #65
Approved by: cgwalters
2016-05-12 18:24:12 +00:00
Pavel Odvody
2fe416d264 More robust handler for OOM condition
Closes: #63
Approved by: cgwalters
2016-05-12 11:15:42 +00:00
Alexander Larsson
b9c39e5beb Fix fdwalk
It turns out you can't readdir from an O_PATH file-descriptor, so
fdwalk didn't work. Spotted the BADFD in a strace.

Closes: #60
Approved by: cgwalters
2016-05-09 14:41:51 +00:00
Colin Walters
bf6e3564a3 utils: Rename strdup_printf -> xasprintf
I find this clearer since I know about `asprintf`, and the `x` prefix.

Closes: #55
Approved by: alexlarsson
2016-05-07 06:52:05 +00:00
Mrunal Patel
5d83a36d0e Fix typos and whitespace
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

Closes: #57
Approved by: cgwalters
2016-05-06 17:58:26 +00:00
Dan Walsh
35e664940c SELinux: Combine label_valid and label_support into one function
All calls to set an SELinux label should call this function

die_unless_label_valid (opt_exec_label);

It will make sure SELinux is enabled and will make sure the user passed in a
valid label.

Signed-off-by: Alexander Larsson <alexl@redhat.com>

Signed-off-by: Dan Walsh <dwalsh@redhat.com>

Closes: #53
Approved by: cgwalters
2016-05-06 16:31:40 +00:00
Dan Walsh
5601aae36c SELinux: Ensure we validate labels
Verify you are getting a valid SELinux label before proceeding.  Some
SELinux checks were broken.

Signed-off-by: Dan Walsh <dwalsh@redhat.com>

Closes: #43
Approved by: cgwalters
2016-05-05 14:43:39 +00:00
Colin Walters
fefeea889d utils: Squash const warnings for security contexts
It's surprising that `security_context_t` isn't const.

Pull request: #27
Approved by: alexlarsson
2016-03-22 13:09:52 +00:00
Colin Walters
080a031053 utils: Fix OOM error handling for vasprintf()
I noticed on Travis we had a warning about this, and it's actually
right, the man page says on OOM the contents of `*strp` are undefined,
not `NULL`.

(Now possibly it doesn't touch the value, but anyways this follows
 the man page and fixes a compiler warning)

Pull request: #27
Approved by: alexlarsson
2016-03-22 13:09:52 +00:00
Dan Walsh
506fb1b162 Add SELinux Support
Signed-off-by: Dan Walsh <dwalsh@redhat.com>

Pull request: #25
Approved by: alexlarsson
2016-03-22 09:33:46 +00:00
Alexander Larsson
38ca0434ed utils: load_file_data() was growing buffer too large 2016-03-14 16:24:28 +01:00
Alexander Larsson
23b8fb6f1a Add has_path_prefix util 2016-03-07 10:21:06 +01:00
Alexander Larsson
46037fc88f Add seccomp support 2016-02-29 14:44:23 +01:00
Alexander Larsson
4d248d225e Break out load_file_data() helper 2016-02-29 13:58:24 +01:00
Alexander Larsson
c3dd820adf When creating file bind mount destinations, check if they already exist
If they already exist as a regular file then we don't need to create
it, which is good because doing so would break if the filesystem
is readonly. I.e. that returns EROFS instead of EEXISTS in that case.
2016-02-19 10:51:37 +01:00
Alexander Larsson
92712d8cd5 Rename to bubblewrap 2016-02-17 11:54:21 +01:00
Alexander Larsson
f5b006ff0c Support --make-file 2016-02-16 15:55:08 +01:00
Alexander Larsson
c68e0dfef6 Add some more util funcs and clean up utils.c 2016-02-16 10:51:18 +01:00
Alexander Larsson
dafe63b41e Move more helper functions to utils.c 2016-02-16 09:55:01 +01:00
Alexander Larsson
2f58265dce Break out utils to separate file 2016-02-16 09:36:33 +01:00