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