Directory: | cvmfs/ |
---|---|
File: | cvmfs/cvmfs_suid_util.cc |
Date: | 2025-04-20 02:34:28 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 33 | 33 | 100.0% |
Branches: | 39 | 60 | 65.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /** | ||
2 | * This file is part of the CernVM File System | ||
3 | */ | ||
4 | |||
5 | #include "cvmfs_suid_util.h" | ||
6 | |||
7 | #include <sys/stat.h> | ||
8 | #include <unistd.h> | ||
9 | |||
10 | #include <cassert> | ||
11 | #include <climits> | ||
12 | #include <cstdlib> | ||
13 | |||
14 | #include "sanitizer.h" | ||
15 | |||
16 | using namespace std; // NOLINT | ||
17 | |||
18 | namespace cvmfs_suid { | ||
19 | |||
20 | /** | ||
21 | * Makes a systemd mount unit string from the given path, such as | ||
22 | * a-b-c.mount from /a/b/c | ||
23 | */ | ||
24 | 8 | string EscapeSystemdUnit(const string &path) { | |
25 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
|
8 | assert(!path.empty()); |
26 | |||
27 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | string normalized_path(path); |
28 | size_t pos; | ||
29 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 8 times.
|
15 | while ((pos = normalized_path.find("//")) != string::npos) { |
30 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | normalized_path.replace(pos, 2, "/"); |
31 | } | ||
32 | |||
33 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
|
8 | if (normalized_path == "/") |
34 |
1/2✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
|
4 | return "-.mount"; |
35 | |||
36 |
2/4✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
|
8 | sanitizer::InputSanitizer sanitizer("az AZ 09 _"); |
37 | 4 | unsigned length = normalized_path.length(); | |
38 | 4 | string result; | |
39 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 4 times.
|
32 | for (unsigned i = 0; i < length; ++i) { |
40 |
1/2✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
|
28 | char c = normalized_path[i]; |
41 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 16 times.
|
28 | if (c == '/') { |
42 |
4/4✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 8 times.
|
12 | if ((i == 0) || (i == length - 1)) |
43 | 4 | continue; | |
44 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | result.push_back('-'); |
45 |
4/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
|
16 | } else if ((c == '.') && (i > 0)) { |
46 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | result.push_back('.'); |
47 |
4/6✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 13 times.
✓ Branch 10 taken 2 times.
|
15 | } else if (sanitizer.IsValid(string(&c, 1))) { |
48 |
1/2✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
|
13 | result.push_back(c); |
49 | } else { | ||
50 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | result.push_back('\\'); |
51 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | result.push_back('x'); |
52 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | result.push_back((c / 16) + ((c / 16 <= 9) ? '0' : 'a'-10)); |
53 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
2 | result.push_back((c % 16) + ((c % 16 <= 9) ? '0' : 'a'-10)); |
54 | } | ||
55 | } | ||
56 | |||
57 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | return result + ".mount"; |
58 | 8 | } | |
59 | |||
60 | |||
61 | 2 | bool PathExists(const std::string &path) { | |
62 | struct stat info; | ||
63 | 2 | int retval = stat(path.c_str(), &info); | |
64 | 2 | return retval == 0; | |
65 | } | ||
66 | |||
67 | |||
68 | 3 | string ResolvePath(const std::string &path) { | |
69 | char buf[PATH_MAX]; | ||
70 | 3 | char *retval = realpath(path.c_str(), buf); | |
71 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
3 | if (retval == NULL) return ""; |
72 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
3 | return string(buf); |
73 | } | ||
74 | |||
75 | } // namespace cvmfs_suid | ||
76 |