GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/cvmfs_suid_util.cc
Date: 2024-04-28 02:33:07
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