xref: /freebsd/contrib/libder/libder/libder_error.c (revision 35c0a8c449fd2b7f75029ebed5e10852240f0865)
1*35c0a8c4SKyle Evans /*-
2*35c0a8c4SKyle Evans  * Copyright (c) 2024 Kyle Evans <kevans@FreeBSD.org>
3*35c0a8c4SKyle Evans  *
4*35c0a8c4SKyle Evans  * SPDX-License-Identifier: BSD-2-Clause
5*35c0a8c4SKyle Evans  */
6*35c0a8c4SKyle Evans 
7*35c0a8c4SKyle Evans #include <stdio.h>
8*35c0a8c4SKyle Evans 
9*35c0a8c4SKyle Evans #include "libder_private.h"
10*35c0a8c4SKyle Evans 
11*35c0a8c4SKyle Evans #undef libder_set_error
12*35c0a8c4SKyle Evans 
13*35c0a8c4SKyle Evans static const char libder_error_nodesc[] = "[Description not available]";
14*35c0a8c4SKyle Evans 
15*35c0a8c4SKyle Evans #define	DESCRIBE(err, msg)	{ LDE_ ## err, msg }
16*35c0a8c4SKyle Evans static const struct libder_error_desc {
17*35c0a8c4SKyle Evans 	enum libder_error	 desc_error;
18*35c0a8c4SKyle Evans 	const char		*desc_str;
19*35c0a8c4SKyle Evans } libder_error_descr[] = {
20*35c0a8c4SKyle Evans 	DESCRIBE(NONE,		"No error"),
21*35c0a8c4SKyle Evans 	DESCRIBE(NOMEM,		"Out of memory"),
22*35c0a8c4SKyle Evans 	DESCRIBE(INVAL,		"Invalid parameter"),
23*35c0a8c4SKyle Evans 	DESCRIBE(SHORTHDR,	"Header too short"),
24*35c0a8c4SKyle Evans 	DESCRIBE(BADVARLEN,	"Bad variable length encoding"),
25*35c0a8c4SKyle Evans 	DESCRIBE(LONGLEN,	"Encoded length too large (8 byte max)"),
26*35c0a8c4SKyle Evans 	DESCRIBE(SHORTDATA,	"Payload not available (too short)"),
27*35c0a8c4SKyle Evans 	DESCRIBE(GARBAGE,	"Garbage after encoded data"),
28*35c0a8c4SKyle Evans 	DESCRIBE(STREAMERR,	"Stream error"),
29*35c0a8c4SKyle Evans 	DESCRIBE(TRUNCVARLEN,	"Variable length object truncated"),
30*35c0a8c4SKyle Evans 	DESCRIBE(COALESCE_BADCHILD,	"Bad child encountered when coalescing"),
31*35c0a8c4SKyle Evans 	DESCRIBE(BADOBJECT,	"Payload not valid for object type"),
32*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_EOC,		"Strict: end-of-content violation"),
33*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_TAG,		"Strict: tag violation"),
34*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_PVARLEN,	"Strict: primitive using indefinite length"),
35*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_BOOLEAN,	"Strict: boolean encoded incorrectly"),
36*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_NULL,		"Strict: null encoded incorrectly"),
37*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_PRIMITIVE,	"Strict: type must be primitive"),
38*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_CONSTRUCTED,	"Strict: type must be constructed"),
39*35c0a8c4SKyle Evans 	DESCRIBE(STRICT_BITSTRING,	"Strict: malformed constructed bitstring"),
40*35c0a8c4SKyle Evans };
41*35c0a8c4SKyle Evans 
42*35c0a8c4SKyle Evans const char *
libder_get_error(struct libder_ctx * ctx)43*35c0a8c4SKyle Evans libder_get_error(struct libder_ctx *ctx)
44*35c0a8c4SKyle Evans {
45*35c0a8c4SKyle Evans 	const struct libder_error_desc *desc;
46*35c0a8c4SKyle Evans 
47*35c0a8c4SKyle Evans 	for (size_t i = 0; i < nitems(libder_error_descr); i++) {
48*35c0a8c4SKyle Evans 		desc = &libder_error_descr[i];
49*35c0a8c4SKyle Evans 
50*35c0a8c4SKyle Evans 		if (desc->desc_error == ctx->error)
51*35c0a8c4SKyle Evans 			return (desc->desc_str);
52*35c0a8c4SKyle Evans 	}
53*35c0a8c4SKyle Evans 
54*35c0a8c4SKyle Evans 	return (libder_error_nodesc);
55*35c0a8c4SKyle Evans }
56*35c0a8c4SKyle Evans 
57*35c0a8c4SKyle Evans bool
libder_has_error(struct libder_ctx * ctx)58*35c0a8c4SKyle Evans libder_has_error(struct libder_ctx *ctx)
59*35c0a8c4SKyle Evans {
60*35c0a8c4SKyle Evans 
61*35c0a8c4SKyle Evans 	return (ctx->error != 0);
62*35c0a8c4SKyle Evans }
63*35c0a8c4SKyle Evans 
64*35c0a8c4SKyle Evans LIBDER_PRIVATE void
libder_set_error(struct libder_ctx * ctx,int error,const char * file,int line)65*35c0a8c4SKyle Evans libder_set_error(struct libder_ctx *ctx, int error, const char *file, int line)
66*35c0a8c4SKyle Evans {
67*35c0a8c4SKyle Evans 	ctx->error = error;
68*35c0a8c4SKyle Evans 
69*35c0a8c4SKyle Evans 	if (ctx->verbose >= 2) {
70*35c0a8c4SKyle Evans 		fprintf(stderr, "%s: [%s:%d]: %s (error %d)\n",
71*35c0a8c4SKyle Evans 		    __func__, file, line, libder_get_error(ctx), error);
72*35c0a8c4SKyle Evans 	} else if (ctx->verbose >= 1) {
73*35c0a8c4SKyle Evans 		fprintf(stderr, "%s: %s (error %d)\n", __func__,
74*35c0a8c4SKyle Evans 		    libder_get_error(ctx), error);
75*35c0a8c4SKyle Evans 	}
76*35c0a8c4SKyle Evans }
77