GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/nfs4/xdr.cc
Date: 2026-10-18 02:40:11
Exec Total Coverage
Lines: 77 91 84.6%
Branches: 24 36 66.7%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "nfs4/xdr.h"
6
7 #include <cstring>
8
9 namespace nfs4 {
10
11 namespace {
12
13 16357 inline size_t Pad4(size_t len) { return (4 - (len & 3)) & 3; }
14
15 } // anonymous namespace
16
17 45308 bool XdrReader::Take(size_t len) {
18
4/4
✓ Branch 0 taken 45256 times.
✓ Branch 1 taken 52 times.
✓ Branch 2 taken 92 times.
✓ Branch 3 taken 45164 times.
45308 if (!ok_ || len > size_ - pos_) {
19 144 ok_ = false;
20 144 return false;
21 }
22 45164 return true;
23 }
24
25 37214 bool XdrReader::GetU32(uint32_t *v) {
26
2/2
✓ Branch 1 taken 111 times.
✓ Branch 2 taken 37103 times.
37214 if (!Take(4))
27 111 return false;
28 37103 const unsigned char *p = data_ + pos_;
29 37103 *v = (static_cast<uint32_t>(p[0]) << 24) | (static_cast<uint32_t>(p[1]) << 16)
30 37103 | (static_cast<uint32_t>(p[2]) << 8) | static_cast<uint32_t>(p[3]);
31 37103 pos_ += 4;
32 37103 return true;
33 }
34
35 ✗ bool XdrReader::GetI32(int32_t *v) {
36 uint32_t u;
37 ✗ if (!GetU32(&u))
38 ✗ return false;
39 ✗ *v = static_cast<int32_t>(u);
40 ✗ return true;
41 }
42
43 3126 bool XdrReader::GetU64(uint64_t *v) {
44 uint32_t hi, lo;
45
3/6
✓ Branch 1 taken 3126 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3126 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3126 times.
3126 if (!GetU32(&hi) || !GetU32(&lo))
46 ✗ return false;
47 3126 *v = (static_cast<uint64_t>(hi) << 32) | lo;
48 3126 return true;
49 }
50
51 26 bool XdrReader::GetI64(int64_t *v) {
52 uint64_t u;
53
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 26 times.
26 if (!GetU64(&u))
54 ✗ return false;
55 26 *v = static_cast<int64_t>(u);
56 26 return true;
57 }
58
59 1184 bool XdrReader::GetBool(bool *v) {
60 uint32_t u;
61
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1184 times.
1184 if (!GetU32(&u))
62 ✗ return false;
63
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 1151 times.
1184 if (u > 1) {
64 33 ok_ = false;
65 33 return false;
66 }
67 1151 *v = (u == 1);
68 1151 return true;
69 }
70
71 7353 bool XdrReader::GetOpaque(std::string *v, uint32_t max_len) {
72 uint32_t len;
73
2/2
✓ Branch 1 taken 26 times.
✓ Branch 2 taken 7327 times.
7353 if (!GetU32(&len))
74 26 return false;
75
4/4
✓ Branch 0 taken 3660 times.
✓ Branch 1 taken 3667 times.
✓ Branch 2 taken 33 times.
✓ Branch 3 taken 3627 times.
7327 if (max_len != 0 && len > max_len) {
76 33 ok_ = false;
77 33 return false;
78 }
79 7294 const size_t padded = static_cast<size_t>(len) + Pad4(len);
80
2/2
✓ Branch 1 taken 33 times.
✓ Branch 2 taken 7261 times.
7294 if (!Take(padded))
81 33 return false;
82
1/2
✓ Branch 1 taken 7261 times.
✗ Branch 2 not taken.
7261 v->assign(reinterpret_cast<const char *>(data_ + pos_), len);
83 7261 pos_ += padded;
84 7261 return true;
85 }
86
87 800 bool XdrReader::GetFixedOpaque(unsigned char *v, size_t len) {
88 800 const size_t padded = len + Pad4(len);
89
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 800 times.
800 if (!Take(padded))
90 ✗ return false;
91 800 memcpy(v, data_ + pos_, len);
92 800 pos_ += padded;
93 800 return true;
94 }
95
96 ✗ bool XdrReader::Skip(size_t len) {
97 ✗ if (!Take(len))
98 ✗ return false;
99 ✗ pos_ += len;
100 ✗ return true;
101 }
102
103
104 27920 void XdrWriter::PutU32(uint32_t v) {
105 27920 const char b[4] = {static_cast<char>(v >> 24), static_cast<char>(v >> 16),
106 27920 static_cast<char>(v >> 8), static_cast<char>(v)};
107
1/2
✓ Branch 1 taken 27920 times.
✗ Branch 2 not taken.
27920 buf_.append(b, 4);
108 27920 }
109
110 3159 void XdrWriter::PutU64(uint64_t v) {
111 3159 PutU32(static_cast<uint32_t>(v >> 32));
112 3159 PutU32(static_cast<uint32_t>(v));
113 3159 }
114
115 7437 void XdrWriter::PutOpaque(const void *data, size_t len) {
116 7437 PutU32(static_cast<uint32_t>(len));
117 7437 PutFixedOpaque(data, len);
118 7437 }
119
120 8263 void XdrWriter::PutFixedOpaque(const void *data, size_t len) {
121 8263 buf_.append(static_cast<const char *>(data), len);
122 8263 buf_.append(Pad4(len), '\0');
123 8263 }
124
125 2021 void XdrWriter::PutRaw(const void *data, size_t len) {
126 2021 buf_.append(static_cast<const char *>(data), len);
127 2021 }
128
129 11531 size_t XdrWriter::ReserveU32() {
130 11531 const size_t offset = buf_.size();
131 11531 buf_.append(4, '\0');
132 11531 return offset;
133 }
134
135 13650 void XdrWriter::PatchU32(size_t offset, uint32_t v) {
136 13650 buf_[offset] = static_cast<char>(v >> 24);
137 13650 buf_[offset + 1] = static_cast<char>(v >> 16);
138 13650 buf_[offset + 2] = static_cast<char>(v >> 8);
139 13650 buf_[offset + 3] = static_cast<char>(v);
140 13650 }
141
142 } // namespace nfs4
143