Tor 0.4.9.0-alpha-dev
trunnel-impl.h
1/* trunnel-impl.h -- copied from Trunnel v1.5.3
2 * https://gitweb.torproject.org/trunnel.git
3 * You probably shouldn't edit this file.
4 */
5/* trunnel-impl.h -- Implementation helpers for trunnel, included by
6 * generated trunnel files
7 *
8 * Copyright 2014-2019, The Tor Project, Inc.
9 * See license at the end of this file for copying information.
10 */
11
12#ifndef TRUNNEL_IMPL_H_INCLUDED_
13#define TRUNNEL_IMPL_H_INCLUDED_
14#ifdef TRUNNEL_LOCAL_H
15#include "trunnel-local.h"
16#endif
17#include "trunnel.h"
18#include <assert.h>
19#include <string.h>
20#include <stdlib.h>
21
22#if defined(_MSC_VER) && (_MSC_VER < 1600)
23#define uint8_t unsigned char
24#define uint16_t unsigned short
25#define uint32_t unsigned int
26#define uint64_t unsigned __int64
27#define inline __inline
28#else
29#include <stdint.h>
30#endif
31
32#ifdef _WIN32
33uint32_t trunnel_htonl(uint32_t a);
34uint32_t trunnel_ntohl(uint32_t a);
35uint16_t trunnel_htons(uint16_t a);
36uint16_t trunnel_ntohs(uint16_t a);
37#else
38#include <arpa/inet.h>
39#define trunnel_htonl(x) htonl(x)
40#define trunnel_htons(x) htons(x)
41#define trunnel_ntohl(x) ntohl(x)
42#define trunnel_ntohs(x) ntohs(x)
43#endif
44uint64_t trunnel_htonll(uint64_t a);
45uint64_t trunnel_ntohll(uint64_t a);
46
47#ifndef trunnel_assert
48#define trunnel_assert(x) assert(x)
49#endif
50
51static inline void
52trunnel_set_uint64(void *p, uint64_t v) {
53 memcpy(p, &v, 8);
54}
55static inline void
56trunnel_set_uint32(void *p, uint32_t v) {
57 memcpy(p, &v, 4);
58}
59static inline void
60trunnel_set_uint16(void *p, uint16_t v) {
61 memcpy(p, &v, 2);
62}
63static inline void
64trunnel_set_uint8(void *p, uint8_t v) {
65 memcpy(p, &v, 1);
66}
67
68static inline uint64_t
69trunnel_get_uint64(const void *p) {
70 uint64_t x;
71 memcpy(&x, p, 8);
72 return x;
73}
74static inline uint32_t
75trunnel_get_uint32(const void *p) {
76 uint32_t x;
77 memcpy(&x, p, 4);
78 return x;
79}
80static inline uint16_t
81trunnel_get_uint16(const void *p) {
82 uint16_t x;
83 memcpy(&x, p, 2);
84 return x;
85}
86static inline uint8_t
87trunnel_get_uint8(const void *p) {
88 return *(const uint8_t*)p;
89}
90
91
92#ifdef TRUNNEL_DEBUG_FAILING_ALLOC
93extern int trunnel_provoke_alloc_failure;
94
95static inline void *
96trunnel_malloc(size_t n)
97{
98 if (trunnel_provoke_alloc_failure) {
99 if (--trunnel_provoke_alloc_failure == 0)
100 return NULL;
101 }
102 return malloc(n);
103}
104static inline void *
105trunnel_calloc(size_t a, size_t b)
106{
107 if (trunnel_provoke_alloc_failure) {
108 if (--trunnel_provoke_alloc_failure == 0)
109 return NULL;
110 }
111 return calloc(a,b);
112}
113static inline char *
114trunnel_strdup(const char *s)
115{
116 if (trunnel_provoke_alloc_failure) {
117 if (--trunnel_provoke_alloc_failure == 0)
118 return NULL;
119 }
120 return strdup(s);
121}
122#else
123#ifndef trunnel_malloc
124#define trunnel_malloc(x) (malloc((x)))
125#endif
126#ifndef trunnel_calloc
127#define trunnel_calloc(a,b) (calloc((a),(b)))
128#endif
129#ifndef trunnel_strdup
130#define trunnel_strdup(s) (strdup((s)))
131#endif
132#endif
133
134#ifndef trunnel_realloc
135#define trunnel_realloc(a,b) realloc((a),(b))
136#endif
137
138#ifndef trunnel_free_
139#define trunnel_free_(x) (free(x))
140#endif
141#define trunnel_free(x) ((x) ? (trunnel_free_(x),0) : (0))
142
143#ifndef trunnel_abort
144#define trunnel_abort() abort()
145#endif
146
147#ifndef trunnel_memwipe
148#define trunnel_memwipe(mem, len) ((void)0)
149#define trunnel_wipestr(s) ((void)0)
150#else
151#define trunnel_wipestr(s) do { \
152 if (s) \
153 trunnel_memwipe(s, strlen(s)); \
154 } while (0)
155#endif
156
157/* ====== dynamic arrays ======== */
158
159#ifdef NDEBUG
160#define TRUNNEL_DYNARRAY_GET(da, n) \
161 ((da)->elts_[(n)])
162#else
163/** Return the 'n'th element of 'da'. */
164#define TRUNNEL_DYNARRAY_GET(da, n) \
165 (((n) >= (da)->n_ ? (trunnel_abort(),0) : 0), (da)->elts_[(n)])
166#endif
167
168/** Change the 'n'th element of 'da' to 'v'. */
169#define TRUNNEL_DYNARRAY_SET(da, n, v) do { \
170 trunnel_assert((n) < (da)->n_); \
171 (da)->elts_[(n)] = (v); \
172 } while (0)
173
174/** Expand the dynamic array 'da' of 'elttype' so that it can hold at least
175 * 'howmanymore' elements than its current capacity. Always tries to increase
176 * the length of the array. On failure, run the code in 'on_fail' and goto
177 * trunnel_alloc_failed. */
178#define TRUNNEL_DYNARRAY_EXPAND(elttype, da, howmanymore, on_fail) do { \
179 elttype *newarray; \
180 newarray = trunnel_dynarray_expand(&(da)->allocated_, \
181 (da)->elts_, (howmanymore), \
182 sizeof(elttype)); \
183 if (newarray == NULL) { \
184 on_fail; \
185 goto trunnel_alloc_failed; \
186 } \
187 (da)->elts_ = newarray; \
188 } while (0)
189
190/** Add 'v' to the end of the dynamic array 'da' of 'elttype', expanding it if
191 * necessary. code in 'on_fail' and goto trunnel_alloc_failed. */
192#define TRUNNEL_DYNARRAY_ADD(elttype, da, v, on_fail) do { \
193 if ((da)->n_ == (da)->allocated_) { \
194 TRUNNEL_DYNARRAY_EXPAND(elttype, da, 1, on_fail); \
195 } \
196 (da)->elts_[(da)->n_++] = (v); \
197 } while (0)
198
199/** Return the number of elements in 'da'. */
200#define TRUNNEL_DYNARRAY_LEN(da) ((da)->n_)
201
202/** Remove all storage held by 'da' and set it to be empty. Does not free
203 * storage held by the elements themselves. */
204#define TRUNNEL_DYNARRAY_CLEAR(da) do { \
205 trunnel_free((da)->elts_); \
206 (da)->elts_ = NULL; \
207 (da)->n_ = (da)->allocated_ = 0; \
208 } while (0)
209
210/** Remove all storage held by 'da' and set it to be empty. Does not free
211 * storage held by the elements themselves. */
212#define TRUNNEL_DYNARRAY_WIPE(da) do { \
213 trunnel_memwipe((da)->elts_, (da)->allocated_ * sizeof((da)->elts_[0])); \
214 } while (0)
215
216/** Helper: wraps or implements an OpenBSD-style reallocarray. Behaves
217 * as realloc(a, x*y), but verifies that no overflow will occur in the
218 * multiplication. Returns NULL on failure. */
219#ifndef trunnel_reallocarray
220void *trunnel_reallocarray(void *a, size_t x, size_t y);
221#endif
222
223/** Helper to expand a dynamic array. Behaves as TRUNNEL_DYNARRAY_EXPAND(),
224 * taking the array of elements in 'ptr', a pointer to thethe current number
225 * of allocated elements in allocated_p, the minimum numbeer of elements to
226 * add in 'howmanymore', and the size of a single element in 'eltsize'.
227 *
228 * On success, adjust *allocated_p, and return the new value for the array of
229 * elements. On failure, adjust nothing and return NULL.
230 */
231void *trunnel_dynarray_expand(size_t *allocated_p, void *ptr,
232 size_t howmanymore, size_t eltsize);
233
234/** Type for a function to free members of a dynarray of pointers. */
235typedef void (*trunnel_free_fn_t)(void *);
236
237/**
238 * Helper to change the length of a dynamic array. Takes pointers to the
239 * current allocated and n fields of the array in 'allocated_p' and 'len_p',
240 * and the current array of elements in 'ptr'; takes the length of a single
241 * element in 'eltsize'. Changes the length to 'newlen'. If 'newlen' is
242 * greater than the current length, pads the new elements with 0. If newlen
243 * is less than the current length, and free_fn is non-NULL, treat the
244 * array as an array of void *, and invoke free_fn() on each removed element.
245 *
246 * On success, adjust *allocated_p and *len_p, and return the new value for
247 * the array of elements. On failure, adjust nothing, set *errcode_ptr to 1,
248 * and return NULL.
249 */
250void *trunnel_dynarray_setlen(size_t *allocated_p, size_t *len_p,
251 void *ptr, size_t newlen,
252 size_t eltsize, trunnel_free_fn_t free_fn,
253 uint8_t *errcode_ptr);
254
255/**
256 * Helper: return a pointer to the value of 'str' as a NUL-terminated string.
257 * Might have to reallocate the storage for 'str' in order to fit in the final
258 * NUL character. On allocation failure, return NULL.
259 */
260const char *trunnel_string_getstr(trunnel_string_t *str);
261
262/**
263 * Helper: change the contents of 'str' to hold the 'len'-byte string in
264 * 'inp'. Adjusts the storage to have a terminating NUL that doesn't count
265 * towards the length of the string. On success, return 0. On failure, set
266 * *errcode_ptr to 1 and return -1.
267 */
268int trunnel_string_setstr0(trunnel_string_t *str, const char *inp, size_t len,
269 uint8_t *errcode_ptr);
270
271/**
272 * As trunnel_dynarray_setlen, but adjusts a string rather than a dynamic
273 * array, and ensures that the new string is NUL-terminated.
274 */
275int trunnel_string_setlen(trunnel_string_t *str, size_t newlen,
276 uint8_t *errcode_ptr);
277
278#endif
279
280
281/*
282Copyright 2014 The Tor Project, Inc.
283
284Redistribution and use in source and binary forms, with or without
285modification, are permitted provided that the following conditions are
286met:
287
288 * Redistributions of source code must retain the above copyright
289notice, this list of conditions and the following disclaimer.
290
291 * Redistributions in binary form must reproduce the above
292copyright notice, this list of conditions and the following disclaimer
293in the documentation and/or other materials provided with the
294distribution.
295
296 * Neither the names of the copyright owners nor the names of its
297contributors may be used to endorse or promote products derived from
298this software without specific prior written permission.
299
300THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
301"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
302LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
303A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
304OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
305SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
306LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
307DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
308THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
309(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
310OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
311*/