GCC Code Coverage Report


Directory: ./
File: pdserv/src/TLS.cpp
Date: 2026-10-18 04:09:42
Exec Total Coverage
Lines: 11 78 14.1%
Branches: 2 78 2.6%

Line Branch Exec Source
1 /*****************************************************************************
2 *
3 * Copyright 2016 Richard Hacker (lerichi at gmx dot net)
4 *
5 * This file is part of the pdserv library.
6 *
7 * The pdserv library is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation, either version 3 of the License, or (at
10 * your option) any later version.
11 *
12 * The pdserv library is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with the pdserv library. If not, see <http://www.gnu.org/licenses/>.
19 *
20 ****************************************************************************/
21
22 #include "TLS.h"
23
24 #include "Debug.h"
25
26 #include <cstring>
27 #include <algorithm>
28
29 /////////////////////////////////////////////////////////////////////////////
30 ✗ static unsigned char hexchar(char c)
31 {
32 ✗ if (c >= 'A' and c <= 'F')
33 ✗ return c - ('A' - 10);
34
35 ✗ if (c >= 'a' and c <= 'f')
36 ✗ return c - ('a' - 10);
37
38 ✗ if (c >= '0' and c <= '9')
39 ✗ return c - '0';
40
41 ✗ return 0;
42 }
43
44 /////////////////////////////////////////////////////////////////////////////
45 /////////////////////////////////////////////////////////////////////////////
46 ✗ datum_string::datum_string(size_t len)
47 {
48 ✗ reserve(len);
49 }
50
51 /////////////////////////////////////////////////////////////////////////////
52 ✗ datum_string::datum_string(const gnutls_datum_t& value)
53 {
54 ✗ append(value.data, value.size);
55 }
56
57 /////////////////////////////////////////////////////////////////////////////
58 ✗ datum_string::datum_string(const pointer data, size_t len)
59 {
60 ✗ append(data, len);
61 }
62
63 /////////////////////////////////////////////////////////////////////////////
64 ✗ datum_string::datum_string(const char* hexdata, size_t len)
65 {
66 ✗ len = std::min(hexdata ? ::strlen(hexdata) : 0U, len) / 2;
67
68 ✗ reserve(len);
69
70 ✗ while (len--) {
71 ✗ append(1, (hexchar(hexdata[0]) << 4) + hexchar(hexdata[1]));
72 ✗ hexdata += 2;
73 }
74 }
75
76 /////////////////////////////////////////////////////////////////////////////
77 ✗ datum_string::operator std::string() const
78 {
79 static const char* table = "0123456789abcdef";
80 ✗ std::string s;
81 ✗ for (const_iterator it = begin(); it != end(); ++it) {
82 ✗ s.append(1, table[((*it) >> 4) & 0x0F]);
83 ✗ s.append(1, table[ (*it) & 0x0F]);
84 }
85 ✗ return s;
86 }
87
88 /////////////////////////////////////////////////////////////////////////////
89 ✗ datum_string::operator gnutls_datum_t() const
90 {
91 ✗ gnutls_datum_t res;
92 ✗ res.size = size();
93 ✗ res.data = reinterpret_cast<pointer>(res.size);
94 ✗ std::copy(begin(), end(), res.data);
95 ✗ return res;
96 }
97
98 /////////////////////////////////////////////////////////////////////////////
99 /////////////////////////////////////////////////////////////////////////////
100 157 TlsSessionDB::TlsSessionDB(pthread::Mutex* mutex, size_t max):
101 157 mutex(mutex), maxSize(max)
102 {
103 157 }
104
105 /////////////////////////////////////////////////////////////////////////////
106 ✗ int TlsSessionDB::store(
107 const gnutls_datum_t& key, const gnutls_datum_t& value)
108 {
109 ✗ if (key.size > TLS_DB_MAX_ENTRY_SIZE
110 ✗ or value.size > TLS_DB_MAX_ENTRY_SIZE)
111 ✗ return -1;
112
113 ✗ pthread::MutexLock lock(*mutex);
114
115 ✗ map_type::iterator it =
116 ✗ map.insert(std::make_pair(key, value)).first;
117
118 ✗ list.remove(it);
119
120 ✗ while (list.size() > maxSize) {
121 ✗ map.erase(*list.begin());
122 ✗ list.pop_front();
123 }
124 ✗ list.push_back(it);
125
126 ✗ return 0;
127 }
128
129 /////////////////////////////////////////////////////////////////////////////
130 ✗ int TlsSessionDB::erase(const gnutls_datum_t& key)
131 {
132 ✗ pthread::MutexLock lock(*mutex);
133
134 ✗ map_type::iterator it = map.find(key);
135
136 ✗ if (it == map.end())
137 ✗ return -1;
138
139 ✗ list.remove(it);
140 ✗ map.erase(it);
141 ✗ return 0;
142 }
143
144 /////////////////////////////////////////////////////////////////////////////
145 ✗ gnutls_datum_t TlsSessionDB::retrieve(const gnutls_datum_t& key)
146 {
147 ✗ pthread::MutexLock lock(*mutex);
148
149 ✗ map_type::const_iterator it = map.find(key);
150 static const gnutls_datum_t res = { NULL, 0 };
151 ✗ return it == map.end()
152 ? res
153 ✗ : static_cast<gnutls_datum_t>(it->second);
154 }
155
156 66 void TlsDeleter::operator()(gnutls_session_t s)
157 {
158
1/2
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
66 if (s)
159 66 gnutls_deinit(s);
160 66 }
161 ✗ void TlsDeleter::operator()(gnutls_dh_params_t d)
162 {
163 ✗ if (d)
164 ✗ gnutls_dh_params_deinit(d);
165 }
166 ✗ void TlsDeleter::operator()(gnutls_priority_t p)
167 {
168 ✗ if (p)
169 ✗ gnutls_priority_deinit(p);
170 }
171 27 void TlsDeleter::operator()(gnutls_x509_crt_t c)
172 {
173
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
27 if (c)
174 27 gnutls_x509_crt_deinit(c);
175 27 }
176 ✗ void TlsDeleter::operator()(gnutls_certificate_credentials_t cc)
177 {
178 ✗ if (cc)
179 ✗ gnutls_certificate_free_credentials(cc);
180 }
181