summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls.c
diff options
context:
space:
mode:
authorjsing <>2016-04-28 16:48:44 +0000
committerjsing <>2016-04-28 16:48:44 +0000
commit2666540eb58ec0e76b541248bed9d159e6a2ccea (patch)
tree2228658d31ed91575cce8bbc0cc1f0394cb96787 /src/lib/libtls/tls.c
parent8da506fe86ae4114f94c896522d4bf388c1bfded (diff)
downloadopenbsd-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.c59
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)
58const char * 58const char *
59tls_error(struct tls *ctx) 59tls_error(struct tls *ctx)
60{ 60{
61 return ctx->errmsg; 61 return ctx->error.msg;
62} 62}
63 63
64static int 64static int
65tls_set_verror(struct tls *ctx, int errnum, const char *fmt, va_list ap) 65tls_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
95int 96int
96tls_set_error(struct tls *ctx, const char *fmt, ...) 97tls_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
111int
112tls_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
124int
125tls_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);