Coverage Report

Created: 2025-07-11 06:08

/src/unbound/sldns/sbuffer.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * buffer.c -- generic memory buffer .
3
 *
4
 * Copyright (c) 2001-2008, NLnet Labs. All rights reserved.
5
 *
6
 * See LICENSE for the license.
7
 *
8
 */
9
/**
10
 * \file
11
 *
12
 * This file contains the definition of sldns_buffer, and functions to manipulate those.
13
 */
14
#include "config.h"
15
#include "sldns/sbuffer.h"
16
#include <stdarg.h>
17
18
sldns_buffer *
19
sldns_buffer_new(size_t capacity)
20
3.83k
{
21
3.83k
  sldns_buffer *buffer = (sldns_buffer*)malloc(sizeof(sldns_buffer));
22
23
3.83k
  if (!buffer) {
24
0
    return NULL;
25
0
  }
26
  
27
3.83k
  buffer->_data = (uint8_t *) malloc(capacity);
28
3.83k
  if (!buffer->_data) {
29
0
    free(buffer);
30
0
    return NULL;
31
0
  }
32
  
33
3.83k
  buffer->_position = 0;
34
3.83k
  buffer->_limit = buffer->_capacity = capacity;
35
3.83k
  buffer->_fixed = 0;
36
3.83k
  buffer->_status_err = 0;
37
  
38
3.83k
  sldns_buffer_invariant(buffer);
39
  
40
3.83k
  return buffer;
41
3.83k
}
42
43
void
44
sldns_buffer_new_frm_data(sldns_buffer *buffer, void *data, size_t size)
45
3.83k
{
46
3.83k
  assert(data != NULL);
47
48
3.83k
  buffer->_position = 0; 
49
3.83k
  buffer->_limit = buffer->_capacity = size;
50
3.83k
  buffer->_fixed = 0;
51
3.83k
  if (!buffer->_fixed && buffer->_data)
52
3.83k
    free(buffer->_data);
53
3.83k
  buffer->_data = malloc(size);
54
3.83k
  if(!buffer->_data) {
55
0
    buffer->_status_err = 1;
56
0
    return;
57
0
  }
58
3.83k
  memcpy(buffer->_data, data, size);
59
3.83k
  buffer->_status_err = 0;
60
  
61
3.83k
  sldns_buffer_invariant(buffer);
62
3.83k
}
63
64
void
65
sldns_buffer_init_frm_data(sldns_buffer *buffer, void *data, size_t size)
66
0
{
67
0
  memset(buffer, 0, sizeof(*buffer));
68
0
  buffer->_data = data;
69
0
  buffer->_capacity = buffer->_limit = size;
70
0
  buffer->_fixed = 1;
71
0
}
72
73
int
74
sldns_buffer_set_capacity(sldns_buffer *buffer, size_t capacity)
75
0
{
76
0
  void *data;
77
  
78
0
  sldns_buffer_invariant(buffer);
79
0
  assert(buffer->_position <= capacity && !buffer->_fixed);
80
81
0
  data = (uint8_t *) realloc(buffer->_data, capacity);
82
0
  if (!data) {
83
0
    buffer->_status_err = 1;
84
0
    return 0;
85
0
  } else {
86
0
    buffer->_data = data;
87
0
    buffer->_limit = buffer->_capacity = capacity;
88
0
    return 1;
89
0
  }
90
0
}
91
92
int
93
sldns_buffer_reserve(sldns_buffer *buffer, size_t amount)
94
0
{
95
0
  sldns_buffer_invariant(buffer);
96
0
  assert(!buffer->_fixed);
97
0
  if (buffer->_capacity < buffer->_position + amount) {
98
0
    size_t new_capacity = buffer->_capacity * 3 / 2;
99
100
0
    if (new_capacity < buffer->_position + amount) {
101
0
      new_capacity = buffer->_position + amount;
102
0
    }
103
0
    if (!sldns_buffer_set_capacity(buffer, new_capacity)) {
104
0
      buffer->_status_err = 1;
105
0
      return 0;
106
0
    }
107
0
  }
108
0
  buffer->_limit = buffer->_capacity;
109
0
  return 1;
110
0
}
111
112
int
113
sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...)
114
0
{
115
0
  va_list args;
116
0
  int written = 0;
117
0
  size_t remaining;
118
  
119
0
  if (sldns_buffer_status_ok(buffer)) {
120
0
    sldns_buffer_invariant(buffer);
121
0
    assert(buffer->_limit == buffer->_capacity);
122
123
0
    remaining = sldns_buffer_remaining(buffer);
124
0
    va_start(args, format);
125
0
    written = vsnprintf((char *) sldns_buffer_current(buffer), remaining,
126
0
            format, args);
127
0
    va_end(args);
128
0
    if (written == -1) {
129
0
      buffer->_status_err = 1;
130
0
      return -1;
131
0
    }
132
0
    buffer->_position += written;
133
0
  }
134
0
  return written;
135
0
}
136
137
void
138
sldns_buffer_free(sldns_buffer *buffer)
139
3.83k
{
140
3.83k
  if (!buffer) {
141
0
    return;
142
0
  }
143
144
3.83k
  if (!buffer->_fixed)
145
3.83k
    free(buffer->_data);
146
147
3.83k
  free(buffer);
148
3.83k
}
149
150
void 
151
sldns_buffer_copy(sldns_buffer* result, sldns_buffer* from)
152
0
{
153
0
  size_t tocopy = sldns_buffer_limit(from);
154
155
0
  if(tocopy > sldns_buffer_capacity(result))
156
0
    tocopy = sldns_buffer_capacity(result);
157
0
  sldns_buffer_clear(result);
158
0
  sldns_buffer_write(result, sldns_buffer_begin(from), tocopy);
159
0
  sldns_buffer_flip(result);
160
0
}