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-2009 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
/* basic buffer class for OpenVPN */
50
int capacity; /* size of buffer allocated by malloc */
51
int offset; /* data starts at data + offset, offset > 0 to allow for efficient prepending */
52
int len; /* length of data that starts at data + offset */
55
#ifdef BUF_INIT_TRACKING
56
const char *debug_file;
61
/* for garbage collection */
65
struct gc_entry *next;
70
struct gc_entry *list;
73
#define BPTR(buf) (buf_bptr(buf))
74
#define BEND(buf) (buf_bend(buf))
75
#define BLAST(buf) (buf_blast(buf))
76
#define BLEN(buf) (buf_len(buf))
77
#define BDEF(buf) (buf_defined(buf))
78
#define BSTR(buf) (buf_str(buf))
79
#define BCAP(buf) (buf_forward_capacity (buf))
81
void buf_clear (struct buffer *buf);
83
struct buffer clear_buf (void);
84
void free_buf (struct buffer *buf);
86
bool buf_assign (struct buffer *dest, const struct buffer *src);
88
void string_clear (char *str);
89
int string_array_len (const char **array);
91
size_t array_mult_safe (const size_t m1, const size_t m2, const size_t extra);
93
#define PA_BRACKET (1<<0)
94
char *print_argv (const char **p, struct gc_arena *gc, const unsigned int flags);
96
void buf_size_error (const size_t size);
98
/* for dmalloc debugging */
102
#define alloc_buf(size) alloc_buf_debug (size, __FILE__, __LINE__)
103
#define alloc_buf_gc(size, gc) alloc_buf_gc_debug (size, gc, __FILE__, __LINE__);
104
#define clone_buf(buf) clone_buf_debug (buf, __FILE__, __LINE__);
105
#define gc_malloc(size, clear, arena) gc_malloc_debug (size, clear, arena, __FILE__, __LINE__)
106
#define string_alloc(str, gc) string_alloc_debug (str, gc, __FILE__, __LINE__)
107
#define string_alloc_buf(str, gc) string_alloc_buf_debug (str, gc, __FILE__, __LINE__)
109
struct buffer alloc_buf_debug (size_t size, const char *file, int line);
110
struct buffer alloc_buf_gc_debug (size_t size, struct gc_arena *gc, const char *file, int line);
111
struct buffer clone_buf_debug (const struct buffer* buf, const char *file, int line);
112
void *gc_malloc_debug (size_t size, bool clear, struct gc_arena *a, const char *file, int line);
113
char *string_alloc_debug (const char *str, struct gc_arena *gc, const char *file, int line);
114
struct buffer string_alloc_buf_debug (const char *str, struct gc_arena *gc, const char *file, int line);
118
struct buffer alloc_buf (size_t size);
119
struct buffer alloc_buf_gc (size_t size, struct gc_arena *gc); /* allocate buffer with garbage collection */
120
struct buffer clone_buf (const struct buffer* buf);
121
void *gc_malloc (size_t size, bool clear, struct gc_arena *a);
122
char *string_alloc (const char *str, struct gc_arena *gc);
123
struct buffer string_alloc_buf (const char *str, struct gc_arena *gc);
127
#ifdef BUF_INIT_TRACKING
128
#define buf_init(buf, offset) buf_init_debug (buf, offset, __FILE__, __LINE__)
129
bool buf_init_debug (struct buffer *buf, int offset, const char *file, int line);
131
#define buf_init(buf, offset) buf_init_dowork (buf, offset)
135
/* inline functions */
138
buf_defined (const struct buffer *buf)
140
return buf->data != NULL;
144
buf_valid (const struct buffer *buf)
146
return likely (buf->data != NULL) && likely (buf->len >= 0);
149
static inline uint8_t *
150
buf_bptr (const struct buffer *buf)
153
return buf->data + buf->offset;
159
buf_len (const struct buffer *buf)
167
static inline uint8_t *
168
buf_bend (const struct buffer *buf)
170
return buf_bptr (buf) + buf_len (buf);
173
static inline uint8_t *
174
buf_blast (const struct buffer *buf)
176
if (buf_len (buf) > 0)
177
return buf_bptr (buf) + buf_len (buf) - 1;
183
buf_size_valid (const size_t size)
185
return likely (size < BUF_SIZE_MAX);
189
buf_size_valid_signed (const int size)
191
return likely (size >= -BUF_SIZE_MAX) && likely (size < BUF_SIZE_MAX);
195
buf_str (const struct buffer *buf)
197
return (char *)buf_bptr(buf);
201
buf_reset (struct buffer *buf)
210
buf_reset_len (struct buffer *buf)
217
buf_init_dowork (struct buffer *buf, int offset)
219
if (offset < 0 || offset > buf->capacity || buf->data == NULL)
222
buf->offset = offset;
227
buf_set_write (struct buffer *buf, uint8_t *data, int size)
229
if (!buf_size_valid (size))
230
buf_size_error (size);
233
buf->capacity = size;
235
if (size > 0 && data)
240
buf_set_read (struct buffer *buf, const uint8_t *data, int size)
242
if (!buf_size_valid (size))
243
buf_size_error (size);
244
buf->len = buf->capacity = size;
246
buf->data = (uint8_t *)data;
249
/* Like strncpy but makes sure dest is always null terminated */
251
strncpynt (char *dest, const char *src, size_t maxlen)
253
strncpy (dest, src, maxlen);
255
dest[maxlen - 1] = 0;
258
/* return true if string contains at least one numerical digit */
260
has_digit (const unsigned char* src)
272
* printf append to a buffer with overflow check
274
bool buf_printf (struct buffer *buf, const char *format, ...)
276
__attribute__ ((format (printf, 2, 3)))
281
* Like snprintf but guarantees null termination for size > 0
283
int openvpn_snprintf(char *str, size_t size, const char *format, ...)
285
__attribute__ ((format (printf, 3, 4)))
290
* remove/add trailing characters
293
void buf_null_terminate (struct buffer *buf);
294
void buf_chomp (struct buffer *buf);
295
void buf_rmtail (struct buffer *buf, uint8_t remove);
298
* non-buffer string functions
300
void chomp (char *str);
301
void rm_trailing_chars (char *str, const char *what_to_delete);
302
const char *skip_leading_whitespace (const char *str);
303
void string_null_terminate (char *str, int len, int capacity);
306
* Write string in buf to file descriptor fd.
307
* NOTE: requires that string be null terminated.
309
void buf_write_string_file (const struct buffer *buf, const char *filename, int fd);
312
* write a string to the end of a buffer that was
313
* truncated by buf_printf
315
void buf_catrunc (struct buffer *buf, const char *str);
318
* convert a multi-line output to one line
320
void convert_to_one_line (struct buffer *buf);
323
* Parse a string based on a given delimiter char
325
bool buf_parse (struct buffer *buf, const int delim, char *line, const int size);
328
* Hex dump -- Output a binary buffer to a hex string and return it.
331
format_hex_ex (const uint8_t *data, int size, int maxoutput,
332
int space_break, const char* separator,
333
struct gc_arena *gc);
336
format_hex (const uint8_t *data, int size, int maxoutput, struct gc_arena *gc)
338
return format_hex_ex (data, size, maxoutput, 4, " ", gc);
342
* Return a buffer that is a subset of another buffer.
344
struct buffer buf_sub (struct buffer *buf, int size, bool prepend);
347
* Check if sufficient space to append to buffer.
351
buf_safe (const struct buffer *buf, int len)
353
return buf_valid (buf) && buf_size_valid (len)
354
&& buf->offset + buf->len + len <= buf->capacity;
358
buf_safe_bidir (const struct buffer *buf, int len)
360
if (buf_valid (buf) && buf_size_valid_signed (len))
362
const int newlen = buf->len + len;
363
return newlen >= 0 && buf->offset + newlen <= buf->capacity;
370
buf_forward_capacity (const struct buffer *buf)
374
int ret = buf->capacity - (buf->offset + buf->len);
384
buf_forward_capacity_total (const struct buffer *buf)
388
int ret = buf->capacity - buf->offset;
398
buf_reverse_capacity (const struct buffer *buf)
407
buf_inc_len (struct buffer *buf, int inc)
409
if (!buf_safe_bidir (buf, inc))
416
* Make space to prepend to a buffer.
417
* Return NULL if no space.
420
static inline uint8_t *
421
buf_prepend (struct buffer *buf, int size)
423
if (!buf_valid (buf) || size < 0 || size > buf->offset)
431
buf_advance (struct buffer *buf, int size)
433
if (!buf_valid (buf) || size < 0 || buf->len < size)
441
* Return a pointer to allocated space inside a buffer.
442
* Return NULL if no space.
445
static inline uint8_t *
446
buf_write_alloc (struct buffer *buf, int size)
449
if (!buf_safe (buf, size))
451
ret = BPTR (buf) + buf->len;
456
static inline uint8_t *
457
buf_write_alloc_prepend (struct buffer *buf, int size, bool prepend)
459
return prepend ? buf_prepend (buf, size) : buf_write_alloc (buf, size);
462
static inline uint8_t *
463
buf_read_alloc (struct buffer *buf, int size)
466
if (size < 0 || buf->len < size)
475
buf_write (struct buffer *dest, const void *src, int size)
477
uint8_t *cp = buf_write_alloc (dest, size);
480
memcpy (cp, src, size);
485
buf_write_prepend (struct buffer *dest, const void *src, int size)
487
uint8_t *cp = buf_prepend (dest, size);
490
memcpy (cp, src, size);
495
buf_write_u8 (struct buffer *dest, int data)
497
uint8_t u8 = (uint8_t) data;
498
return buf_write (dest, &u8, sizeof (uint8_t));
502
buf_write_u16 (struct buffer *dest, int data)
504
uint16_t u16 = htons ((uint16_t) data);
505
return buf_write (dest, &u16, sizeof (uint16_t));
509
buf_write_u32 (struct buffer *dest, int data)
511
uint32_t u32 = htonl ((uint32_t) data);
512
return buf_write (dest, &u32, sizeof (uint32_t));
516
buf_copy (struct buffer *dest, const struct buffer *src)
518
return buf_write (dest, BPTR (src), BLEN (src));
522
buf_copy_n (struct buffer *dest, struct buffer *src, int n)
524
uint8_t *cp = buf_read_alloc (src, n);
527
return buf_write (dest, cp, n);
531
buf_copy_range (struct buffer *dest,
533
const struct buffer *src,
539
|| src_index + src_len > src->len
541
|| dest->offset + dest_index + src_len > dest->capacity)
543
memcpy (dest->data + dest->offset + dest_index, src->data + src->offset + src_index, src_len);
544
if (dest_index + src_len > dest->len)
545
dest->len = dest_index + src_len;
549
/* truncate src to len, copy excess data beyond len to dest */
551
buf_copy_excess (struct buffer *dest,
559
struct buffer b = *src;
561
if (!buf_advance (&b, len))
563
return buf_copy (dest, &b);
572
buf_read (struct buffer *src, void *dest, int size)
574
uint8_t *cp = buf_read_alloc (src, size);
577
memcpy (dest, cp, size);
582
buf_read_u8 (struct buffer *buf)
588
buf_advance (buf, 1);
593
buf_read_u16 (struct buffer *buf)
596
if (!buf_read (buf, &ret, sizeof (uint16_t)))
601
static inline uint32_t
602
buf_read_u32 (struct buffer *buf, bool *good)
605
if (!buf_read (buf, &ret, sizeof (uint32_t)))
620
buf_string_match (const struct buffer *src, const void *match, int size)
622
if (size != src->len)
624
return memcmp (BPTR (src), match, size) == 0;
628
buf_string_match_head (const struct buffer *src, const void *match, int size)
630
if (size < 0 || size > src->len)
632
return memcmp (BPTR (src), match, size) == 0;
635
bool buf_string_match_head_str (const struct buffer *src, const char *match);
636
bool buf_string_compare_advance (struct buffer *src, const char *match);
637
int buf_substring_len (const struct buffer *buf, int delim);
643
xor (uint8_t *dest, const uint8_t *src, int len)
650
* Print a string which might be NULL
652
const char *np (const char *str);
654
/*#define CHARACTER_CLASS_DEBUG*/
656
/* character classes */
658
#define CC_ANY (1<<0)
659
#define CC_NULL (1<<1)
661
#define CC_ALNUM (1<<2)
662
#define CC_ALPHA (1<<3)
663
#define CC_ASCII (1<<4)
664
#define CC_CNTRL (1<<5)
665
#define CC_DIGIT (1<<6)
666
#define CC_PRINT (1<<7)
667
#define CC_PUNCT (1<<8)
668
#define CC_SPACE (1<<9)
669
#define CC_XDIGIT (1<<10)
671
#define CC_BLANK (1<<11)
672
#define CC_NEWLINE (1<<12)
673
#define CC_CR (1<<13)
675
#define CC_BACKSLASH (1<<14)
676
#define CC_UNDERBAR (1<<15)
677
#define CC_DASH (1<<16)
678
#define CC_DOT (1<<17)
679
#define CC_COMMA (1<<18)
680
#define CC_COLON (1<<19)
681
#define CC_SLASH (1<<20)
682
#define CC_SINGLE_QUOTE (1<<21)
683
#define CC_DOUBLE_QUOTE (1<<22)
684
#define CC_REVERSE_QUOTE (1<<23)
685
#define CC_AT (1<<24)
686
#define CC_EQUAL (1<<25)
689
#define CC_NAME (CC_ALNUM|CC_UNDERBAR)
690
#define CC_CRLF (CC_CR|CC_NEWLINE)
692
bool char_class (const unsigned char c, const unsigned int flags);
693
bool string_class (const char *str, const unsigned int inclusive, const unsigned int exclusive);
694
bool string_mod (char *str, const unsigned int inclusive, const unsigned int exclusive, const char replace);
696
const char *string_mod_const (const char *str,
697
const unsigned int inclusive,
698
const unsigned int exclusive,
700
struct gc_arena *gc);
702
void string_replace_leading (char *str, const char match, const char replace);
704
#ifdef CHARACTER_CLASS_DEBUG
705
void character_class_debug (void);
709
* Verify that a pointer is correctly aligned
711
#ifdef VERIFY_ALIGNMENT
712
void valign4 (const struct buffer *buf, const char *file, const int line);
713
# define verify_align_4(ptr) valign4(buf, __FILE__, __LINE__)
715
# define verify_align_4(ptr)
719
* Very basic garbage collection, mostly for routines that return
720
* char ptrs to malloced strings.
723
void gc_transfer (struct gc_arena *dest, struct gc_arena *src);
725
void x_gc_free (struct gc_arena *a);
728
gc_init (struct gc_arena *a)
734
gc_detach (struct gc_arena *a)
739
static inline struct gc_arena
748
gc_free (struct gc_arena *a)
755
gc_reset (struct gc_arena *a)
761
* Allocate memory to hold a structure
764
void out_of_memory (void);
766
#define ALLOC_OBJ(dptr, type) \
768
check_malloc_return ((dptr) = (type *) malloc (sizeof (type))); \
771
#define ALLOC_OBJ_CLEAR(dptr, type) \
773
ALLOC_OBJ (dptr, type); \
774
memset ((dptr), 0, sizeof(type)); \
777
#define ALLOC_ARRAY(dptr, type, n) \
779
check_malloc_return ((dptr) = (type *) malloc (array_mult_safe (sizeof (type), (n), 0))); \
782
#define ALLOC_ARRAY_GC(dptr, type, n, gc) \
784
(dptr) = (type *) gc_malloc (array_mult_safe (sizeof (type), (n), 0), false, (gc)); \
787
#define ALLOC_ARRAY_CLEAR(dptr, type, n) \
789
ALLOC_ARRAY (dptr, type, n); \
790
memset ((dptr), 0, (array_mult_safe (sizeof(type), (n), 0))); \
793
#define ALLOC_ARRAY_CLEAR_GC(dptr, type, n, gc) \
795
(dptr) = (type *) gc_malloc (array_mult_safe (sizeof (type), (n), 0), true, (gc)); \
798
#define ALLOC_VAR_ARRAY_CLEAR_GC(dptr, type, atype, n, gc) \
800
(dptr) = (type *) gc_malloc (array_mult_safe (sizeof (atype), (n), sizeof (type)), true, (gc)); \
803
#define ALLOC_OBJ_GC(dptr, type, gc) \
805
(dptr) = (type *) gc_malloc (sizeof (type), false, (gc)); \
808
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc) \
810
(dptr) = (type *) gc_malloc (sizeof (type), true, (gc)); \
814
check_malloc_return (void *p)
816
void out_of_memory (void);
822
* Manage lists of buffers
825
#ifdef ENABLE_BUFFER_LIST
830
struct buffer_entry *next;
835
struct buffer_entry *head; /* next item to pop/peek */
836
struct buffer_entry *tail; /* last item pushed */
837
int size; /* current number of entries */
838
int max_size; /* maximum size list should grow to */
841
struct buffer_list *buffer_list_new (const int max_size);
842
void buffer_list_free (struct buffer_list *ol);
844
bool buffer_list_defined (const struct buffer_list *ol);
845
void buffer_list_reset (struct buffer_list *ol);
847
void buffer_list_push (struct buffer_list *ol, const unsigned char *str);
848
const struct buffer *buffer_list_peek (struct buffer_list *ol);
849
void buffer_list_advance (struct buffer_list *ol, int n);
851
struct buffer_list *buffer_list_file (const char *fn, int max_line_len);
855
#endif /* BUFFER_H */