xref: /openbsd-src/lib/libssl/tls13_error.c (revision c9989395360567c0e7c9b540b886291d6c8d222f)
1*c9989395Sjsing /* $OpenBSD: tls13_error.c,v 1.1 2020/01/20 13:10:37 jsing Exp $ */
2*c9989395Sjsing /*
3*c9989395Sjsing  * Copyright (c) 2014,2019 Joel Sing <jsing@openbsd.org>
4*c9989395Sjsing  *
5*c9989395Sjsing  * Permission to use, copy, modify, and distribute this software for any
6*c9989395Sjsing  * purpose with or without fee is hereby granted, provided that the above
7*c9989395Sjsing  * copyright notice and this permission notice appear in all copies.
8*c9989395Sjsing  *
9*c9989395Sjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*c9989395Sjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*c9989395Sjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*c9989395Sjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*c9989395Sjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*c9989395Sjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*c9989395Sjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*c9989395Sjsing  */
17*c9989395Sjsing 
18*c9989395Sjsing #include <errno.h>
19*c9989395Sjsing 
20*c9989395Sjsing #include "tls13_internal.h"
21*c9989395Sjsing 
22*c9989395Sjsing void
tls13_error_clear(struct tls13_error * error)23*c9989395Sjsing tls13_error_clear(struct tls13_error *error)
24*c9989395Sjsing {
25*c9989395Sjsing 	error->code = 0;
26*c9989395Sjsing 	error->subcode = 0;
27*c9989395Sjsing 	error->errnum = 0;
28*c9989395Sjsing 	error->file = NULL;
29*c9989395Sjsing 	error->line = 0;
30*c9989395Sjsing 	free(error->msg);
31*c9989395Sjsing 	error->msg = NULL;
32*c9989395Sjsing }
33*c9989395Sjsing 
34*c9989395Sjsing static int
tls13_error_vset(struct tls13_error * error,int code,int subcode,int errnum,const char * file,int line,const char * fmt,va_list ap)35*c9989395Sjsing tls13_error_vset(struct tls13_error *error, int code, int subcode, int errnum,
36*c9989395Sjsing     const char *file, int line, const char *fmt, va_list ap)
37*c9989395Sjsing {
38*c9989395Sjsing 	char *errmsg = NULL;
39*c9989395Sjsing 	int rv = -1;
40*c9989395Sjsing 
41*c9989395Sjsing 	tls13_error_clear(error);
42*c9989395Sjsing 
43*c9989395Sjsing 	error->code = code;
44*c9989395Sjsing 	error->subcode = subcode;
45*c9989395Sjsing 	error->errnum = errnum;
46*c9989395Sjsing 	error->file = file;
47*c9989395Sjsing 	error->line = line;
48*c9989395Sjsing 
49*c9989395Sjsing 	if (vasprintf(&errmsg, fmt, ap) == -1) {
50*c9989395Sjsing 		errmsg = NULL;
51*c9989395Sjsing 		goto err;
52*c9989395Sjsing 	}
53*c9989395Sjsing 
54*c9989395Sjsing 	if (errnum == -1) {
55*c9989395Sjsing 		error->msg = errmsg;
56*c9989395Sjsing 		return 0;
57*c9989395Sjsing 	}
58*c9989395Sjsing 
59*c9989395Sjsing 	if (asprintf(&error->msg, "%s: %s", errmsg, strerror(errnum)) == -1) {
60*c9989395Sjsing 		error->msg = NULL;
61*c9989395Sjsing 		goto err;
62*c9989395Sjsing 	}
63*c9989395Sjsing 	rv = 0;
64*c9989395Sjsing 
65*c9989395Sjsing  err:
66*c9989395Sjsing 	free(errmsg);
67*c9989395Sjsing 
68*c9989395Sjsing 	return rv;
69*c9989395Sjsing }
70*c9989395Sjsing 
71*c9989395Sjsing int
tls13_error_set(struct tls13_error * error,int code,int subcode,const char * file,int line,const char * fmt,...)72*c9989395Sjsing tls13_error_set(struct tls13_error *error, int code, int subcode,
73*c9989395Sjsing     const char *file, int line, const char *fmt, ...)
74*c9989395Sjsing {
75*c9989395Sjsing 	va_list ap;
76*c9989395Sjsing 	int errnum, rv;
77*c9989395Sjsing 
78*c9989395Sjsing 	errnum = errno;
79*c9989395Sjsing 
80*c9989395Sjsing 	va_start(ap, fmt);
81*c9989395Sjsing 	rv = tls13_error_vset(error, code, subcode, errnum, file, line, fmt, ap);
82*c9989395Sjsing 	va_end(ap);
83*c9989395Sjsing 
84*c9989395Sjsing 	return (rv);
85*c9989395Sjsing }
86*c9989395Sjsing 
87*c9989395Sjsing int
tls13_error_setx(struct tls13_error * error,int code,int subcode,const char * file,int line,const char * fmt,...)88*c9989395Sjsing tls13_error_setx(struct tls13_error *error, int code, int subcode,
89*c9989395Sjsing     const char *file, int line, const char *fmt, ...)
90*c9989395Sjsing {
91*c9989395Sjsing 	va_list ap;
92*c9989395Sjsing 	int rv;
93*c9989395Sjsing 
94*c9989395Sjsing 	va_start(ap, fmt);
95*c9989395Sjsing 	rv = tls13_error_vset(error, code, subcode, -1, file, line, fmt, ap);
96*c9989395Sjsing 	va_end(ap);
97*c9989395Sjsing 
98*c9989395Sjsing 	return (rv);
99*c9989395Sjsing }
100