2
* OpenVPN -- An application to securely tunnel IP networks
3
* over a single UDP port, with support for SSL/TLS-based
4
* session authentication and key exchange,
5
* packet encryption, packet authentication, and
8
* Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License version 2
12
* as published by the Free Software Foundation.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program (see the file COPYING included with this
21
* distribution); if not, write to the Free Software Foundation, Inc.,
22
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31
#define BUF_SIZE_MAX 1000000
34
* Define verify_align function, otherwise
37
/* #define VERIFY_ALIGNMENT */
40
* Keep track of source file/line of buf_init calls
42
#ifdef VERIFY_ALIGNMENT
43
#define BUF_INIT_TRACKING
46
/**************************************************************************/
48
* Wrapper structure for dynamically allocated memory.
50
* The actual content stored in a \c buffer structure starts at the memory
51
* location \c buffer.data \c + \c buffer.offset, and has a length of \c
52
* buffer.len bytes. This, together with the space available before and
53
* after the content, is represented in the pseudocode below:
55
uint8_t *content_start = buffer.data + buffer.offset;
56
uint8_t *content_end = buffer.data + buffer.offset + buffer.len;
57
int prepend_capacity = buffer.offset;
58
int append_capacity = buffer.capacity - (buffer.offset + buffer.len);
63
int capacity; /**< Size in bytes of memory allocated by
65
int offset; /**< Offset in bytes of the actual content
66
* within the allocated memory. */
67
int len; /**< Length in bytes of the actual content
68
* within the allocated memory. */
69
uint8_t *data; /**< Pointer to the allocated memory. */
71
#ifdef BUF_INIT_TRACKING
72
const char *debug_file;
78
/**************************************************************************/
80
* Garbage collection entry for one dynamically allocated block of memory.
82
* This structure represents one link in the linked list contained in a \c
83
* gc_arena structure. Each time the \c gc_malloc() function is called,
84
* it allocates \c sizeof(gc_entry) + the requested number of bytes. The
85
* \c gc_entry is then stored as a header in front of the memory address
86
* returned to the caller.
90
struct gc_entry *next; /**< Pointer to the next item in the
96
* Garbage collection arena used to keep track of dynamically allocated
99
* This structure contains a linked list of \c gc_entry structures. When
100
* a block of memory is allocated using the \c gc_malloc() function, the
101
* allocation is registered in the function's \c gc_arena argument. All
102
* the dynamically allocated memory registered in a \c gc_arena can be
103
* freed using the \c gc_free() function.
107
struct gc_entry *list; /**< First element of the linked list of
108
* \c gc_entry structures. */
112
#define BPTR(buf) (buf_bptr(buf))
113
#define BEND(buf) (buf_bend(buf))
114
#define BLAST(buf) (buf_blast(buf))
115
#define BLEN(buf) (buf_len(buf))
116
#define BDEF(buf) (buf_defined(buf))
117
#define BSTR(buf) (buf_str(buf))
118
#define BCAP(buf) (buf_forward_capacity (buf))
120
void buf_clear (struct buffer *buf);
122
struct buffer clear_buf (void);
123
void free_buf (struct buffer *buf);
125
bool buf_assign (struct buffer *dest, const struct buffer *src);
127
void string_clear (char *str);
128
int string_array_len (const char **array);
130
size_t array_mult_safe (const size_t m1, const size_t m2, const size_t extra);
132
#define PA_BRACKET (1<<0)
133
char *print_argv (const char **p, struct gc_arena *gc, const unsigned int flags);
135
void buf_size_error (const size_t size);
137
/* for dmalloc debugging */
141
#define alloc_buf(size) alloc_buf_debug (size, __FILE__, __LINE__)
142
#define alloc_buf_gc(size, gc) alloc_buf_gc_debug (size, gc, __FILE__, __LINE__);
143
#define clone_buf(buf) clone_buf_debug (buf, __FILE__, __LINE__);
144
#define gc_malloc(size, clear, arena) gc_malloc_debug (size, clear, arena, __FILE__, __LINE__)
145
#define string_alloc(str, gc) string_alloc_debug (str, gc, __FILE__, __LINE__)
146
#define string_alloc_buf(str, gc) string_alloc_buf_debug (str, gc, __FILE__, __LINE__)
148
struct buffer alloc_buf_debug (size_t size, const char *file, int line);
149
struct buffer alloc_buf_gc_debug (size_t size, struct gc_arena *gc, const char *file, int line);
150
struct buffer clone_buf_debug (const struct buffer* buf, const char *file, int line);
151
void *gc_malloc_debug (size_t size, bool clear, struct gc_arena *a, const char *file, int line);
152
char *string_alloc_debug (const char *str, struct gc_arena *gc, const char *file, int line);
153
struct buffer string_alloc_buf_debug (const char *str, struct gc_arena *gc, const char *file, int line);
157
struct buffer alloc_buf (size_t size);
158
struct buffer alloc_buf_gc (size_t size, struct gc_arena *gc); /* allocate buffer with garbage collection */
159
struct buffer clone_buf (const struct buffer* buf);
160
void *gc_malloc (size_t size, bool clear, struct gc_arena *a);
161
char *string_alloc (const char *str, struct gc_arena *gc);
162
struct buffer string_alloc_buf (const char *str, struct gc_arena *gc);
166
#ifdef BUF_INIT_TRACKING
167
#define buf_init(buf, offset) buf_init_debug (buf, offset, __FILE__, __LINE__)
168
bool buf_init_debug (struct buffer *buf, int offset, const char *file, int line);
170
#define buf_init(buf, offset) buf_init_dowork (buf, offset)
174
/* inline functions */
177
buf_defined (const struct buffer *buf)
179
return buf->data != NULL;
183
buf_valid (const struct buffer *buf)
185
return likely (buf->data != NULL) && likely (buf->len >= 0);
188
static inline uint8_t *
189
buf_bptr (const struct buffer *buf)
192
return buf->data + buf->offset;
198
buf_len (const struct buffer *buf)
206
static inline uint8_t *
207
buf_bend (const struct buffer *buf)
209
return buf_bptr (buf) + buf_len (buf);
212
static inline uint8_t *
213
buf_blast (const struct buffer *buf)
215
if (buf_len (buf) > 0)
216
return buf_bptr (buf) + buf_len (buf) - 1;
222
buf_size_valid (const size_t size)
224
return likely (size < BUF_SIZE_MAX);
228
buf_size_valid_signed (const int size)
230
return likely (size >= -BUF_SIZE_MAX) && likely (size < BUF_SIZE_MAX);
234
buf_str (const struct buffer *buf)
236
return (char *)buf_bptr(buf);
240
buf_reset (struct buffer *buf)
249
buf_reset_len (struct buffer *buf)
256
buf_init_dowork (struct buffer *buf, int offset)
258
if (offset < 0 || offset > buf->capacity || buf->data == NULL)
261
buf->offset = offset;
266
buf_set_write (struct buffer *buf, uint8_t *data, int size)
268
if (!buf_size_valid (size))
269
buf_size_error (size);
272
buf->capacity = size;
274
if (size > 0 && data)
279
buf_set_read (struct buffer *buf, const uint8_t *data, int size)
281
if (!buf_size_valid (size))
282
buf_size_error (size);
283
buf->len = buf->capacity = size;
285
buf->data = (uint8_t *)data;
288
/* Like strncpy but makes sure dest is always null terminated */
290
strncpynt (char *dest, const char *src, size_t maxlen)
292
strncpy (dest, src, maxlen);
294
dest[maxlen - 1] = 0;
297
/* return true if string contains at least one numerical digit */
299
has_digit (const unsigned char* src)
311
* printf append to a buffer with overflow check
313
bool buf_printf (struct buffer *buf, const char *format, ...)
315
#if __USE_MINGW_ANSI_STDIO
316
__attribute__ ((format (gnu_printf, 2, 3)))
318
__attribute__ ((format (__printf__, 2, 3)))
324
* puts append to a buffer with overflow check
326
bool buf_puts (struct buffer *buf, const char *str);
329
* Like snprintf but guarantees null termination for size > 0
331
bool openvpn_snprintf(char *str, size_t size, const char *format, ...)
333
#if __USE_MINGW_ANSI_STDIO
334
__attribute__ ((format (gnu_printf, 3, 4)))
336
__attribute__ ((format (__printf__, 3, 4)))
342
* remove/add trailing characters
345
void buf_null_terminate (struct buffer *buf);
346
void buf_chomp (struct buffer *buf);
347
void buf_rmtail (struct buffer *buf, uint8_t remove);
350
* non-buffer string functions
352
void chomp (char *str);
353
void rm_trailing_chars (char *str, const char *what_to_delete);
354
const char *skip_leading_whitespace (const char *str);
355
void string_null_terminate (char *str, int len, int capacity);
358
* Write string in buf to file descriptor fd.
359
* NOTE: requires that string be null terminated.
361
void buf_write_string_file (const struct buffer *buf, const char *filename, int fd);
364
* write a string to the end of a buffer that was
365
* truncated by buf_printf
367
void buf_catrunc (struct buffer *buf, const char *str);
370
* convert a multi-line output to one line
372
void convert_to_one_line (struct buffer *buf);
375
* Parse a string based on a given delimiter char
377
bool buf_parse (struct buffer *buf, const int delim, char *line, const int size);
380
* Hex dump -- Output a binary buffer to a hex string and return it.
383
format_hex_ex (const uint8_t *data, int size, int maxoutput,
384
int space_break, const char* separator,
385
struct gc_arena *gc);
388
format_hex (const uint8_t *data, int size, int maxoutput, struct gc_arena *gc)
390
return format_hex_ex (data, size, maxoutput, 4, " ", gc);
394
* Return a buffer that is a subset of another buffer.
396
struct buffer buf_sub (struct buffer *buf, int size, bool prepend);
399
* Check if sufficient space to append to buffer.
403
buf_safe (const struct buffer *buf, int len)
405
return buf_valid (buf) && buf_size_valid (len)
406
&& buf->offset + buf->len + len <= buf->capacity;
410
buf_safe_bidir (const struct buffer *buf, int len)
412
if (buf_valid (buf) && buf_size_valid_signed (len))
414
const int newlen = buf->len + len;
415
return newlen >= 0 && buf->offset + newlen <= buf->capacity;
422
buf_forward_capacity (const struct buffer *buf)
426
int ret = buf->capacity - (buf->offset + buf->len);
436
buf_forward_capacity_total (const struct buffer *buf)
440
int ret = buf->capacity - buf->offset;
450
buf_reverse_capacity (const struct buffer *buf)
459
buf_inc_len (struct buffer *buf, int inc)
461
if (!buf_safe_bidir (buf, inc))
468
* Make space to prepend to a buffer.
469
* Return NULL if no space.
472
static inline uint8_t *
473
buf_prepend (struct buffer *buf, int size)
475
if (!buf_valid (buf) || size < 0 || size > buf->offset)
483
buf_advance (struct buffer *buf, int size)
485
if (!buf_valid (buf) || size < 0 || buf->len < size)
493
* Return a pointer to allocated space inside a buffer.
494
* Return NULL if no space.
497
static inline uint8_t *
498
buf_write_alloc (struct buffer *buf, int size)
501
if (!buf_safe (buf, size))
503
ret = BPTR (buf) + buf->len;
508
static inline uint8_t *
509
buf_write_alloc_prepend (struct buffer *buf, int size, bool prepend)
511
return prepend ? buf_prepend (buf, size) : buf_write_alloc (buf, size);
514
static inline uint8_t *
515
buf_read_alloc (struct buffer *buf, int size)
518
if (size < 0 || buf->len < size)
527
buf_write (struct buffer *dest, const void *src, int size)
529
uint8_t *cp = buf_write_alloc (dest, size);
532
memcpy (cp, src, size);
537
buf_write_prepend (struct buffer *dest, const void *src, int size)
539
uint8_t *cp = buf_prepend (dest, size);
542
memcpy (cp, src, size);
547
buf_write_u8 (struct buffer *dest, int data)
549
uint8_t u8 = (uint8_t) data;
550
return buf_write (dest, &u8, sizeof (uint8_t));
554
buf_write_u16 (struct buffer *dest, int data)
556
uint16_t u16 = htons ((uint16_t) data);
557
return buf_write (dest, &u16, sizeof (uint16_t));
561
buf_write_u32 (struct buffer *dest, int data)
563
uint32_t u32 = htonl ((uint32_t) data);
564
return buf_write (dest, &u32, sizeof (uint32_t));
568
buf_copy (struct buffer *dest, const struct buffer *src)
570
return buf_write (dest, BPTR (src), BLEN (src));
574
buf_copy_n (struct buffer *dest, struct buffer *src, int n)
576
uint8_t *cp = buf_read_alloc (src, n);
579
return buf_write (dest, cp, n);
583
buf_copy_range (struct buffer *dest,
585
const struct buffer *src,
591
|| src_index + src_len > src->len
593
|| dest->offset + dest_index + src_len > dest->capacity)
595
memcpy (dest->data + dest->offset + dest_index, src->data + src->offset + src_index, src_len);
596
if (dest_index + src_len > dest->len)
597
dest->len = dest_index + src_len;
601
/* truncate src to len, copy excess data beyond len to dest */
603
buf_copy_excess (struct buffer *dest,
611
struct buffer b = *src;
613
if (!buf_advance (&b, len))
615
return buf_copy (dest, &b);
624
buf_read (struct buffer *src, void *dest, int size)
626
uint8_t *cp = buf_read_alloc (src, size);
629
memcpy (dest, cp, size);
634
buf_read_u8 (struct buffer *buf)
640
buf_advance (buf, 1);
645
buf_read_u16 (struct buffer *buf)
648
if (!buf_read (buf, &ret, sizeof (uint16_t)))
653
static inline uint32_t
654
buf_read_u32 (struct buffer *buf, bool *good)
657
if (!buf_read (buf, &ret, sizeof (uint32_t)))
672
* Compare src buffer contents with match.
673
* *NOT* constant time. Do not use when comparing HMACs.
676
buf_string_match (const struct buffer *src, const void *match, int size)
678
if (size != src->len)
680
return memcmp (BPTR (src), match, size) == 0;
684
* Compare first size bytes of src buffer contents with match.
685
* *NOT* constant time. Do not use when comparing HMACs.
688
buf_string_match_head (const struct buffer *src, const void *match, int size)
690
if (size < 0 || size > src->len)
692
return memcmp (BPTR (src), match, size) == 0;
695
bool buf_string_match_head_str (const struct buffer *src, const char *match);
696
bool buf_string_compare_advance (struct buffer *src, const char *match);
697
int buf_substring_len (const struct buffer *buf, int delim);
700
* Print a string which might be NULL
702
const char *np (const char *str);
704
/*#define CHARACTER_CLASS_DEBUG*/
706
/* character classes */
708
#define CC_ANY (1<<0)
709
#define CC_NULL (1<<1)
711
#define CC_ALNUM (1<<2)
712
#define CC_ALPHA (1<<3)
713
#define CC_ASCII (1<<4)
714
#define CC_CNTRL (1<<5)
715
#define CC_DIGIT (1<<6)
716
#define CC_PRINT (1<<7)
717
#define CC_PUNCT (1<<8)
718
#define CC_SPACE (1<<9)
719
#define CC_XDIGIT (1<<10)
721
#define CC_BLANK (1<<11)
722
#define CC_NEWLINE (1<<12)
723
#define CC_CR (1<<13)
725
#define CC_BACKSLASH (1<<14)
726
#define CC_UNDERBAR (1<<15)
727
#define CC_DASH (1<<16)
728
#define CC_DOT (1<<17)
729
#define CC_COMMA (1<<18)
730
#define CC_COLON (1<<19)
731
#define CC_SLASH (1<<20)
732
#define CC_SINGLE_QUOTE (1<<21)
733
#define CC_DOUBLE_QUOTE (1<<22)
734
#define CC_REVERSE_QUOTE (1<<23)
735
#define CC_AT (1<<24)
736
#define CC_EQUAL (1<<25)
737
#define CC_LESS_THAN (1<<26)
738
#define CC_GREATER_THAN (1<<27)
739
#define CC_PIPE (1<<28)
740
#define CC_QUESTION_MARK (1<<29)
741
#define CC_ASTERISK (1<<30)
744
#define CC_NAME (CC_ALNUM|CC_UNDERBAR)
745
#define CC_CRLF (CC_CR|CC_NEWLINE)
747
bool char_class (const unsigned char c, const unsigned int flags);
748
bool string_class (const char *str, const unsigned int inclusive, const unsigned int exclusive);
749
bool string_mod (char *str, const unsigned int inclusive, const unsigned int exclusive, const char replace);
751
const char *string_mod_const (const char *str,
752
const unsigned int inclusive,
753
const unsigned int exclusive,
755
struct gc_arena *gc);
757
void string_replace_leading (char *str, const char match, const char replace);
759
#ifdef CHARACTER_CLASS_DEBUG
760
void character_class_debug (void);
764
* Verify that a pointer is correctly aligned
766
#ifdef VERIFY_ALIGNMENT
767
void valign4 (const struct buffer *buf, const char *file, const int line);
768
# define verify_align_4(ptr) valign4(buf, __FILE__, __LINE__)
770
# define verify_align_4(ptr)
774
* Very basic garbage collection, mostly for routines that return
775
* char ptrs to malloced strings.
778
void gc_transfer (struct gc_arena *dest, struct gc_arena *src);
780
void x_gc_free (struct gc_arena *a);
783
gc_defined (struct gc_arena *a)
785
return a->list != NULL;
789
gc_init (struct gc_arena *a)
795
gc_detach (struct gc_arena *a)
800
static inline struct gc_arena
809
gc_free (struct gc_arena *a)
816
gc_reset (struct gc_arena *a)
822
* Allocate memory to hold a structure
825
#define ALLOC_OBJ(dptr, type) \
827
check_malloc_return ((dptr) = (type *) malloc (sizeof (type))); \
830
#define ALLOC_OBJ_CLEAR(dptr, type) \
832
ALLOC_OBJ (dptr, type); \
833
memset ((dptr), 0, sizeof(type)); \
836
#define ALLOC_ARRAY(dptr, type, n) \
838
check_malloc_return ((dptr) = (type *) malloc (array_mult_safe (sizeof (type), (n), 0))); \
841
#define ALLOC_ARRAY_GC(dptr, type, n, gc) \
843
(dptr) = (type *) gc_malloc (array_mult_safe (sizeof (type), (n), 0), false, (gc)); \
846
#define ALLOC_ARRAY_CLEAR(dptr, type, n) \
848
ALLOC_ARRAY (dptr, type, n); \
849
memset ((dptr), 0, (array_mult_safe (sizeof(type), (n), 0))); \
852
#define ALLOC_ARRAY_CLEAR_GC(dptr, type, n, gc) \
854
(dptr) = (type *) gc_malloc (array_mult_safe (sizeof (type), (n), 0), true, (gc)); \
857
#define ALLOC_VAR_ARRAY_CLEAR_GC(dptr, type, atype, n, gc) \
859
(dptr) = (type *) gc_malloc (array_mult_safe (sizeof (atype), (n), sizeof (type)), true, (gc)); \
862
#define ALLOC_OBJ_GC(dptr, type, gc) \
864
(dptr) = (type *) gc_malloc (sizeof (type), false, (gc)); \
867
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc) \
869
(dptr) = (type *) gc_malloc (sizeof (type), true, (gc)); \
873
check_malloc_return (void *p)
880
* Manage lists of buffers
883
#ifdef ENABLE_BUFFER_LIST
888
struct buffer_entry *next;
893
struct buffer_entry *head; /* next item to pop/peek */
894
struct buffer_entry *tail; /* last item pushed */
895
int size; /* current number of entries */
896
int max_size; /* maximum size list should grow to */
899
struct buffer_list *buffer_list_new (const int max_size);
900
void buffer_list_free (struct buffer_list *ol);
902
bool buffer_list_defined (const struct buffer_list *ol);
903
void buffer_list_reset (struct buffer_list *ol);
905
void buffer_list_push (struct buffer_list *ol, const unsigned char *str);
906
struct buffer_entry *buffer_list_push_data (struct buffer_list *ol, const uint8_t *data, size_t size);
907
struct buffer *buffer_list_peek (struct buffer_list *ol);
908
void buffer_list_advance (struct buffer_list *ol, int n);
909
void buffer_list_pop (struct buffer_list *ol);
911
void buffer_list_aggregate (struct buffer_list *bl, const size_t max);
913
struct buffer_list *buffer_list_file (const char *fn, int max_line_len);
917
#endif /* BUFFER_H */