GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/nfs4/xdr.cc
Date: 2026-11-01 02:41:19
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 39447 inline size_t Pad4(size_t len) { return (4 - (len & 3)) & 3; }
14
15 } // anonymous namespace
16
17 111492 bool XdrReader::Take(size_t len) {
18
4/4
✓ Branch 0 taken 111368 times.
✓ Branch 1 taken 124 times.
✓ Branch 2 taken 160 times.
✓ Branch 3 taken 111208 times.
111492 if (!ok_ || len > size_ - pos_) {
19 284 ok_ = false;
20 284 return false;
21 }
22 111208 return true;
23 }
24
25 91970 bool XdrReader::GetU32(uint32_t *v) {
26
2/2
✓ Branch 1 taken 235 times.
✓ Branch 2 taken 91735 times.
91970 if (!Take(4))
27 235 return false;
28 91735 const unsigned char *p = data_ + pos_;
29 91735 *v = (static_cast<uint32_t>(p[0]) << 24) | (static_cast<uint32_t>(p[1]) << 16)
30 91735 | (static_cast<uint32_t>(p[2]) << 8) | static_cast<uint32_t>(p[3]);
31 91735 pos_ += 4;
32 91735 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 8187 bool XdrReader::GetU64(uint64_t *v) {
44 uint32_t hi, lo;
45
3/6
✓ Branch 1 taken 8187 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8187 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8187 times.
8187 if (!GetU32(&hi) || !GetU32(&lo))
46 ✗ return false;
47 8187 *v = (static_cast<uint64_t>(hi) << 32) | lo;
48 8187 return true;
49 }
50
51 62 bool XdrReader::GetI64(int64_t *v) {
52 uint64_t u;
53
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 62 times.
62 if (!GetU64(&u))
54 ✗ return false;
55 62 *v = static_cast<int64_t>(u);
56 62 return true;
57 }
58
59 2795 bool XdrReader::GetBool(bool *v) {
60 uint32_t u;
61
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2795 times.
2795 if (!GetU32(&u))
62 ✗ return false;
63
2/2
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2746 times.
2795 if (u > 1) {
64 49 ok_ = false;
65 49 return false;
66 }
67 2746 *v = (u == 1);
68 2746 return true;
69 }
70
71 17724 bool XdrReader::GetOpaque(std::string *v, uint32_t max_len) {
72 uint32_t len;
73
2/2
✓ Branch 1 taken 62 times.
✓ Branch 2 taken 17662 times.
17724 if (!GetU32(&len))
74 62 return false;
75
4/4
✓ Branch 0 taken 8884 times.
✓ Branch 1 taken 8778 times.
✓ Branch 2 taken 49 times.
✓ Branch 3 taken 8835 times.
17662 if (max_len != 0 && len > max_len) {
76 49 ok_ = false;
77 49 return false;
78 }
79 17613 const size_t padded = static_cast<size_t>(len) + Pad4(len);
80
2/2
✓ Branch 1 taken 49 times.
✓ Branch 2 taken 17564 times.
17613 if (!Take(padded))
81 49 return false;
82
1/2
✓ Branch 1 taken 17564 times.
✗ Branch 2 not taken.
17564 v->assign(reinterpret_cast<const char *>(data_ + pos_), len);
83 17564 pos_ += padded;
84 17564 return true;
85 }
86
87 1909 bool XdrReader::GetFixedOpaque(unsigned char *v, size_t len) {
88 1909 const size_t padded = len + Pad4(len);
89
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1909 times.
1909 if (!Take(padded))
90 ✗ return false;
91 1909 memcpy(v, data_ + pos_, len);
92 1909 pos_ += padded;
93 1909 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 67584 void XdrWriter::PutU32(uint32_t v) {
105 67584 const char b[4] = {static_cast<char>(v >> 24), static_cast<char>(v >> 16),
106 67584 static_cast<char>(v >> 8), static_cast<char>(v)};
107
1/2
✓ Branch 1 taken 67584 times.
✗ Branch 2 not taken.
67584 buf_.append(b, 4);
108 67584 }
109
110 7680 void XdrWriter::PutU64(uint64_t v) {
111 7680 PutU32(static_cast<uint32_t>(v >> 32));
112 7680 PutU32(static_cast<uint32_t>(v));
113 7680 }
114
115 17954 void XdrWriter::PutOpaque(const void *data, size_t len) {
116 17954 PutU32(static_cast<uint32_t>(len));
117 17954 PutFixedOpaque(data, len);
118 17954 }
119
120 19925 void XdrWriter::PutFixedOpaque(const void *data, size_t len) {
121 19925 buf_.append(static_cast<const char *>(data), len);
122 19925 buf_.append(Pad4(len), '\0');
123 19925 }
124
125 4934 void XdrWriter::PutRaw(const void *data, size_t len) {
126 4934 buf_.append(static_cast<const char *>(data), len);
127 4934 }
128
129 27993 size_t XdrWriter::ReserveU32() {
130 27993 const size_t offset = buf_.size();
131 27993 buf_.append(4, '\0');
132 27993 return offset;
133 }
134
135 33139 void XdrWriter::PatchU32(size_t offset, uint32_t v) {
136 33139 buf_[offset] = static_cast<char>(v >> 24);
137 33139 buf_[offset + 1] = static_cast<char>(v >> 16);
138 33139 buf_[offset + 2] = static_cast<char>(v >> 8);
139 33139 buf_[offset + 3] = static_cast<char>(v);
140 33139 }
141
142 } // namespace nfs4
143