diff options
author | jsing <> | 2016-04-28 16:48:44 +0000 |
---|---|---|
committer | jsing <> | 2016-04-28 16:48:44 +0000 |
commit | 2666540eb58ec0e76b541248bed9d159e6a2ccea (patch) | |
tree | 2228658d31ed91575cce8bbc0cc1f0394cb96787 /src/lib/libtls/tls.c | |
parent | 8da506fe86ae4114f94c896522d4bf388c1bfded (diff) | |
download | openbsd-2666540eb58ec0e76b541248bed9d159e6a2ccea.tar.gz openbsd-2666540eb58ec0e76b541248bed9d159e6a2ccea.tar.bz2 openbsd-2666540eb58ec0e76b541248bed9d159e6a2ccea.zip |
Rework the error handling in libtls so that we can associate errors with
both configuration and contexts. This allows us to propagate errors that
occur during configuration, rather than either just failing with no reason
or delaying the failure until it can be propagated via the tls context.
Also provide a tls_config_error() function for retrieving the last error
from a tls_config *.
ok bcook@
Diffstat (limited to 'src/lib/libtls/tls.c')
-rw-r--r-- | src/lib/libtls/tls.c | 59 |
1 files changed, 44 insertions, 15 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index 5ca555027f..661aa6ad0a 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls.c,v 1.35 2016/01/18 16:15:14 bcook Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.36 2016/04/28 16:48:44 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -58,17 +58,18 @@ tls_init(void) | |||
58 | const char * | 58 | const char * |
59 | tls_error(struct tls *ctx) | 59 | tls_error(struct tls *ctx) |
60 | { | 60 | { |
61 | return ctx->errmsg; | 61 | return ctx->error.msg; |
62 | } | 62 | } |
63 | 63 | ||
64 | static int | 64 | static int |
65 | tls_set_verror(struct tls *ctx, int errnum, const char *fmt, va_list ap) | 65 | tls_set_verror(struct tls_error *error, int errnum, const char *fmt, va_list ap) |
66 | { | 66 | { |
67 | char *errmsg = NULL; | 67 | char *errmsg = NULL; |
68 | int rv = -1; | 68 | int rv = -1; |
69 | 69 | ||
70 | free(ctx->errmsg); | 70 | free(error->msg); |
71 | ctx->errmsg = NULL; | 71 | error->msg = NULL; |
72 | error->num = errnum; | ||
72 | 73 | ||
73 | if (vasprintf(&errmsg, fmt, ap) == -1) { | 74 | if (vasprintf(&errmsg, fmt, ap) == -1) { |
74 | errmsg = NULL; | 75 | errmsg = NULL; |
@@ -76,12 +77,12 @@ tls_set_verror(struct tls *ctx, int errnum, const char *fmt, va_list ap) | |||
76 | } | 77 | } |
77 | 78 | ||
78 | if (errnum == -1) { | 79 | if (errnum == -1) { |
79 | ctx->errmsg = errmsg; | 80 | error->msg = errmsg; |
80 | return (0); | 81 | return (0); |
81 | } | 82 | } |
82 | 83 | ||
83 | if (asprintf(&ctx->errmsg, "%s: %s", errmsg, strerror(errnum)) == -1) { | 84 | if (asprintf(&error->msg, "%s: %s", errmsg, strerror(errnum)) == -1) { |
84 | ctx->errmsg = NULL; | 85 | error->msg = NULL; |
85 | goto err; | 86 | goto err; |
86 | } | 87 | } |
87 | rv = 0; | 88 | rv = 0; |
@@ -93,15 +94,43 @@ tls_set_verror(struct tls *ctx, int errnum, const char *fmt, va_list ap) | |||
93 | } | 94 | } |
94 | 95 | ||
95 | int | 96 | int |
96 | tls_set_error(struct tls *ctx, const char *fmt, ...) | 97 | tls_set_config_error(struct tls_config *config, const char *fmt, ...) |
98 | { | ||
99 | va_list ap; | ||
100 | int errnum, rv; | ||
101 | |||
102 | errnum = errno; | ||
103 | |||
104 | va_start(ap, fmt); | ||
105 | rv = tls_set_verror(&config->error, errnum, fmt, ap); | ||
106 | va_end(ap); | ||
107 | |||
108 | return (rv); | ||
109 | } | ||
110 | |||
111 | int | ||
112 | tls_set_config_errorx(struct tls_config *config, const char *fmt, ...) | ||
97 | { | 113 | { |
98 | va_list ap; | 114 | va_list ap; |
99 | int rv; | 115 | int rv; |
100 | 116 | ||
101 | ctx->errnum = errno; | 117 | va_start(ap, fmt); |
118 | rv = tls_set_verror(&config->error, -1, fmt, ap); | ||
119 | va_end(ap); | ||
120 | |||
121 | return (rv); | ||
122 | } | ||
123 | |||
124 | int | ||
125 | tls_set_error(struct tls *ctx, const char *fmt, ...) | ||
126 | { | ||
127 | va_list ap; | ||
128 | int errnum, rv; | ||
129 | |||
130 | errnum = errno; | ||
102 | 131 | ||
103 | va_start(ap, fmt); | 132 | va_start(ap, fmt); |
104 | rv = tls_set_verror(ctx, ctx->errnum, fmt, ap); | 133 | rv = tls_set_verror(&ctx->error, errnum, fmt, ap); |
105 | va_end(ap); | 134 | va_end(ap); |
106 | 135 | ||
107 | return (rv); | 136 | return (rv); |
@@ -114,7 +143,7 @@ tls_set_errorx(struct tls *ctx, const char *fmt, ...) | |||
114 | int rv; | 143 | int rv; |
115 | 144 | ||
116 | va_start(ap, fmt); | 145 | va_start(ap, fmt); |
117 | rv = tls_set_verror(ctx, -1, fmt, ap); | 146 | rv = tls_set_verror(&ctx->error, -1, fmt, ap); |
118 | va_end(ap); | 147 | va_end(ap); |
119 | 148 | ||
120 | return (rv); | 149 | return (rv); |
@@ -328,9 +357,9 @@ tls_reset(struct tls *ctx) | |||
328 | free(ctx->servername); | 357 | free(ctx->servername); |
329 | ctx->servername = NULL; | 358 | ctx->servername = NULL; |
330 | 359 | ||
331 | free(ctx->errmsg); | 360 | free(ctx->error.msg); |
332 | ctx->errmsg = NULL; | 361 | ctx->error.msg = NULL; |
333 | ctx->errnum = 0; | 362 | ctx->error.num = -1; |
334 | 363 | ||
335 | tls_free_conninfo(ctx->conninfo); | 364 | tls_free_conninfo(ctx->conninfo); |
336 | free(ctx->conninfo); | 365 | free(ctx->conninfo); |