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