Lines Matching +full:re +full:- +full:configurable

1 /*-
4 * SPDX-License-Identifier: BSD-2-Clause
60 datasz = payload->payload_size; in payload_move()
61 if (payload->payload_heap) { in payload_move()
62 data = payload->payload_data; in payload_move()
68 memcpy(data, payload->payload_data, datasz); in payload_move()
71 payload->payload_heap = false; in payload_move()
72 payload->payload_data = NULL; in payload_move()
73 payload->payload_size = 0; in payload_move()
83 if (!payload->payload_heap) in payload_free()
86 if (payload->payload_data != NULL) { in payload_free()
87 libder_bzero(payload->payload_data, payload->payload_size); in payload_free()
88 free(payload->payload_data); in payload_free()
91 payload->payload_heap = false; in payload_free()
92 payload->payload_data = NULL; in payload_free()
93 payload->payload_size = 0; in payload_free()
101 stream->stream_ctx = ctx; in libder_stream_init()
102 stream->stream_error = 0; in libder_stream_init()
103 stream->stream_eof = false; in libder_stream_init()
104 stream->stream_offset = 0; in libder_stream_init()
105 stream->stream_consumed = 0; in libder_stream_init()
106 stream->stream_last_commit = 0; in libder_stream_init()
107 if (stream->stream_type == LDST_NONE) { in libder_stream_init()
108 assert(stream->stream_src_buf != NULL); in libder_stream_init()
109 assert(stream->stream_bufsz != 0); in libder_stream_init()
110 assert(stream->stream_resid != 0); in libder_stream_init()
118 stream->stream_buf = malloc(buffer_size); in libder_stream_init()
119 if (stream->stream_buf == NULL) { in libder_stream_init()
122 stream->stream_bufsz = buffer_size; in libder_stream_init()
123 stream->stream_resid = 0; /* Nothing read yet */ in libder_stream_init()
126 return (stream->stream_buf != NULL); in libder_stream_init()
132 if (stream->stream_buf != NULL) { in libder_stream_free()
133 libder_bzero(stream->stream_buf, stream->stream_bufsz); in libder_stream_free()
134 free(stream->stream_buf); in libder_stream_free()
142 if (stream->stream_offset <= stream->stream_last_commit) in libder_stream_commit()
145 stream->stream_consumed += stream->stream_offset - stream->stream_last_commit; in libder_stream_commit()
146 stream->stream_last_commit = stream->stream_offset; in libder_stream_commit()
153 return (stream->stream_type != LDST_NONE); in libder_stream_dynamic()
161 * We're not EOF until we're both EOF and have processed all of the data in libder_stream_eof()
164 return (stream->stream_eof && stream->stream_resid == 0); in libder_stream_eof()
174 if (stream->stream_offset == 0) in libder_stream_repack()
178 * If there's data in-flight, we'll repack it back to the beginning so in libder_stream_repack()
180 * data in-flight, we naturally just reset the offset. in libder_stream_repack()
182 if (stream->stream_resid != 0) { in libder_stream_repack()
183 uint8_t *dst = &stream->stream_buf[0]; in libder_stream_repack()
184 uint8_t *src = &stream->stream_buf[stream->stream_offset]; in libder_stream_repack()
186 memmove(dst, src, stream->stream_resid); in libder_stream_repack()
189 stream->stream_last_commit -= stream->stream_offset; in libder_stream_repack()
190 stream->stream_offset = 0; in libder_stream_repack()
196 size_t offset = stream->stream_offset; in libder_stream_refill()
206 * For non-streaming, we just fulfill requests straight out of in libder_stream_refill()
209 if (stream->stream_type == LDST_NONE) in libder_stream_refill()
210 src = stream->stream_src_buf; in libder_stream_refill()
212 src = stream->stream_buf; in libder_stream_refill()
214 if (stream->stream_resid >= req) { in libder_stream_refill()
215 stream->stream_offset += req; in libder_stream_refill()
216 stream->stream_resid -= req; in libder_stream_refill()
220 /* Cannot refill the non-streaming type. */ in libder_stream_refill()
221 if (stream->stream_type == LDST_NONE) { in libder_stream_refill()
222 stream->stream_eof = true; in libder_stream_refill()
226 bufleft = stream->stream_bufsz - (stream->stream_offset + stream->stream_resid); in libder_stream_refill()
232 if (req > bufleft && stream->stream_offset != 0) { in libder_stream_refill()
235 bufleft = stream->stream_bufsz - stream->stream_resid; in libder_stream_refill()
236 offset = stream->stream_offset; in libder_stream_refill()
239 refill_buf = &stream->stream_buf[offset + stream->stream_resid]; in libder_stream_refill()
240 needed = req - stream->stream_resid; in libder_stream_refill()
245 bufend = &stream->stream_buf[stream->stream_bufsz]; in libder_stream_refill()
249 switch (stream->stream_type) { in libder_stream_refill()
251 assert(stream->stream_src_file != NULL); in libder_stream_refill()
256 freadsz = fread(refill_buf, 1, needed, stream->stream_src_file); in libder_stream_refill()
261 stream->stream_eof = true; in libder_stream_refill()
262 if (ferror(stream->stream_src_file)) in libder_stream_refill()
263 stream->stream_error = 1; in libder_stream_refill()
267 stream->stream_resid += freadsz; in libder_stream_refill()
269 needed -= freadsz; in libder_stream_refill()
274 assert(stream->stream_src_fd >= 0); in libder_stream_refill()
279 readsz = read(stream->stream_src_fd, refill_buf, needed); in libder_stream_refill()
283 * configurable in some sense, but for now this in libder_stream_refill()
291 !libder_check_abort(stream->stream_ctx)) in libder_stream_refill()
293 stream->stream_eof = true; in libder_stream_refill()
295 stream->stream_ctx->abort = false; in libder_stream_refill()
296 stream->stream_error = errno; in libder_stream_refill()
297 if (stream->stream_ctx->verbose > 0) in libder_stream_refill()
303 stream->stream_resid += readsz; in libder_stream_refill()
305 needed -= readsz; in libder_stream_refill()
319 stream->stream_consumed += totalsz; in libder_stream_refill()
320 stream->stream_last_commit += totalsz; in libder_stream_refill()
323 if (stream->stream_error != 0) in libder_stream_refill()
324 libder_set_error(stream->stream_ctx, LDE_STREAMERR); in libder_stream_refill()
327 stream->stream_offset += req; in libder_stream_refill()
328 stream->stream_resid -= req; in libder_stream_refill()
331 return (&stream->stream_buf[offset]); in libder_stream_refill()
336 * the previous region if it can't just resize in-place, so we'll always just
390 type->tag_class = BER_TYPE_CLASS(val); in der_read_structure_tag()
391 type->tag_constructed = BER_TYPE_CONSTRUCTED(val); in der_read_structure_tag()
395 type->tag_short = BER_TYPE(val); in der_read_structure_tag()
396 type->tag_size = sizeof(uint8_t); in der_read_structure_tag()
397 type->tag_encoded = false; in der_read_structure_tag()
405 type->tag_encoded = true; in der_read_structure_tag()
410 if (offset == 0 && (val & 0x7f) == 0 && ctx->strict) { in der_read_structure_tag()
415 /* XXX Impose a max size? Perhaps configurable. */ in der_read_structure_tag()
438 type->tag_long = longbuf; in der_read_structure_tag()
439 type->tag_size = offset; in der_read_structure_tag()
456 return (-1); in der_read_structure()
489 if (ctx->strict && !type->tag_constructed) { in der_read_structure()
505 * If we're not running a dynamic stream, we can just use a in der_read_structure()
507 * anyways, but there's no sense in doing it up-front in case we in der_read_structure()
513 * the data -- it'll either strictly read it, or it will in der_read_structure()
514 * copy it out to a known-mutable region. in der_read_structure()
516 payload->payload_data = in der_read_structure()
518 payload->payload_heap = false; in der_read_structure()
519 if (payload->payload_data == NULL) { in der_read_structure()
528 * buffer up-front, but we have no idea how much data we in der_read_structure()
530 * attacker-controlled aspect, so we're cautiously optimistic in der_read_structure()
541 req = MIN(stream->stream_bufsz, resid); in der_read_structure()
565 resid -= req; in der_read_structure()
568 payload->payload_heap = true; in der_read_structure()
569 payload->payload_data = payload_data; in der_read_structure()
572 payload->payload_size = rsz; in der_read_structure()
580 return (-1); in der_read_structure()
607 if (ctx->error == LDE_NONE) in libder_read_object()
626 * Copy the payload out now if it's not heap-allocated. in libder_read_object()
666 next = &obj->children; in libder_read_object()
674 if (ctx->error != LDE_NONE) { in libder_read_object()
682 if (libder_type_is(child->type, BT_RESERVED) && in libder_read_object()
683 child->length == 0) { in libder_read_object()
692 if (ctx->strict) { in libder_read_object()
707 obj->nchildren++; in libder_read_object()
708 child->parent = obj; in libder_read_object()
710 next = &child->next; in libder_read_object()
730 ctx->error = LDE_NONE; in libder_read_stream()
733 if (root != NULL && libder_type_is(root->type, BT_RESERVED) && in libder_read_stream()
734 root->length == 0) { in libder_read_stream()
736 if (ctx->strict) in libder_read_stream()
742 assert(stream->stream_consumed != 0); in libder_read_stream()
747 * Read the DER-encoded `data` into `ctx`.
750 * indicate the number of bytes consumed either way -- it will only be updated
773 ctx->error = LDE_NONE; in libder_read()
780 if (stream->stream_consumed != 0) in libder_read()
781 *datasz = stream->stream_consumed; in libder_read()
792 * tries to not over-read if an invalid structure is detected.
813 ctx->error = LDE_NONE; in libder_read_fd()
820 if (consumed != NULL && stream->stream_consumed != 0) in libder_read_fd()
821 *consumed = stream->stream_consumed; in libder_read_fd()
850 ctx->error = LDE_NONE; in libder_read_file()
857 if (consumed != NULL && stream->stream_consumed != 0) in libder_read_file()
858 *consumed = stream->stream_consumed; in libder_read_file()