wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Committer:
wolfSSL
Date:
Tue Aug 22 10:48:22 2017 +0000
Revision:
13:f67a6c6013ca
wolfSSL3.12.0 with TLS1.3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 13:f67a6c6013ca 1 /* logging.c
wolfSSL 13:f67a6c6013ca 2 *
wolfSSL 13:f67a6c6013ca 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 13:f67a6c6013ca 4 *
wolfSSL 13:f67a6c6013ca 5 * This file is part of wolfSSL.
wolfSSL 13:f67a6c6013ca 6 *
wolfSSL 13:f67a6c6013ca 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 13:f67a6c6013ca 8 * it under the terms of the GNU General Public License as published by
wolfSSL 13:f67a6c6013ca 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 13:f67a6c6013ca 10 * (at your option) any later version.
wolfSSL 13:f67a6c6013ca 11 *
wolfSSL 13:f67a6c6013ca 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 13:f67a6c6013ca 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 13:f67a6c6013ca 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 13:f67a6c6013ca 15 * GNU General Public License for more details.
wolfSSL 13:f67a6c6013ca 16 *
wolfSSL 13:f67a6c6013ca 17 * You should have received a copy of the GNU General Public License
wolfSSL 13:f67a6c6013ca 18 * along with this program; if not, write to the Free Software
wolfSSL 13:f67a6c6013ca 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 13:f67a6c6013ca 20 */
wolfSSL 13:f67a6c6013ca 21
wolfSSL 13:f67a6c6013ca 22
wolfSSL 13:f67a6c6013ca 23 #ifdef HAVE_CONFIG_H
wolfSSL 13:f67a6c6013ca 24 #include <config.h>
wolfSSL 13:f67a6c6013ca 25 #endif
wolfSSL 13:f67a6c6013ca 26
wolfSSL 13:f67a6c6013ca 27 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 13:f67a6c6013ca 28
wolfSSL 13:f67a6c6013ca 29 /* submitted by eof */
wolfSSL 13:f67a6c6013ca 30
wolfSSL 13:f67a6c6013ca 31 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 13:f67a6c6013ca 32 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 13:f67a6c6013ca 33
wolfSSL 13:f67a6c6013ca 34
wolfSSL 13:f67a6c6013ca 35 #ifdef __cplusplus
wolfSSL 13:f67a6c6013ca 36 extern "C" {
wolfSSL 13:f67a6c6013ca 37 #endif
wolfSSL 13:f67a6c6013ca 38 WOLFSSL_API int wolfSSL_Debugging_ON(void);
wolfSSL 13:f67a6c6013ca 39 WOLFSSL_API void wolfSSL_Debugging_OFF(void);
wolfSSL 13:f67a6c6013ca 40 #ifdef __cplusplus
wolfSSL 13:f67a6c6013ca 41 }
wolfSSL 13:f67a6c6013ca 42 #endif
wolfSSL 13:f67a6c6013ca 43
wolfSSL 13:f67a6c6013ca 44 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 13:f67a6c6013ca 45 static wolfSSL_Mutex debug_mutex; /* mutex for access to debug structure */
wolfSSL 13:f67a6c6013ca 46
wolfSSL 13:f67a6c6013ca 47 /* accessing any node from the queue should be wrapped in a lock of
wolfSSL 13:f67a6c6013ca 48 * debug_mutex */
wolfSSL 13:f67a6c6013ca 49 static void* wc_error_heap;
wolfSSL 13:f67a6c6013ca 50 struct wc_error_queue {
wolfSSL 13:f67a6c6013ca 51 void* heap; /* the heap hint used with nodes creation */
wolfSSL 13:f67a6c6013ca 52 struct wc_error_queue* next;
wolfSSL 13:f67a6c6013ca 53 struct wc_error_queue* prev;
wolfSSL 13:f67a6c6013ca 54 char error[WOLFSSL_MAX_ERROR_SZ];
wolfSSL 13:f67a6c6013ca 55 char file[WOLFSSL_MAX_ERROR_SZ];
wolfSSL 13:f67a6c6013ca 56 int value;
wolfSSL 13:f67a6c6013ca 57 int line;
wolfSSL 13:f67a6c6013ca 58 };
wolfSSL 13:f67a6c6013ca 59 volatile struct wc_error_queue* wc_errors;
wolfSSL 13:f67a6c6013ca 60 static struct wc_error_queue* wc_last_node;
wolfSSL 13:f67a6c6013ca 61 /* pointer to last node in queue to make insertion O(1) */
wolfSSL 13:f67a6c6013ca 62 #endif
wolfSSL 13:f67a6c6013ca 63
wolfSSL 13:f67a6c6013ca 64
wolfSSL 13:f67a6c6013ca 65
wolfSSL 13:f67a6c6013ca 66 #if defined(DEBUG_WOLFSSL)
wolfSSL 13:f67a6c6013ca 67
wolfSSL 13:f67a6c6013ca 68 /* Set these to default values initially. */
wolfSSL 13:f67a6c6013ca 69 static wolfSSL_Logging_cb log_function = NULL;
wolfSSL 13:f67a6c6013ca 70 static int loggingEnabled = 0;
wolfSSL 13:f67a6c6013ca 71
wolfSSL 13:f67a6c6013ca 72 #endif /* DEBUG_WOLFSSL */
wolfSSL 13:f67a6c6013ca 73
wolfSSL 13:f67a6c6013ca 74
wolfSSL 13:f67a6c6013ca 75 int wolfSSL_SetLoggingCb(wolfSSL_Logging_cb f)
wolfSSL 13:f67a6c6013ca 76 {
wolfSSL 13:f67a6c6013ca 77 #ifdef DEBUG_WOLFSSL
wolfSSL 13:f67a6c6013ca 78 int res = 0;
wolfSSL 13:f67a6c6013ca 79
wolfSSL 13:f67a6c6013ca 80 if (f)
wolfSSL 13:f67a6c6013ca 81 log_function = f;
wolfSSL 13:f67a6c6013ca 82 else
wolfSSL 13:f67a6c6013ca 83 res = BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 84
wolfSSL 13:f67a6c6013ca 85 return res;
wolfSSL 13:f67a6c6013ca 86 #else
wolfSSL 13:f67a6c6013ca 87 (void)f;
wolfSSL 13:f67a6c6013ca 88 return NOT_COMPILED_IN;
wolfSSL 13:f67a6c6013ca 89 #endif
wolfSSL 13:f67a6c6013ca 90 }
wolfSSL 13:f67a6c6013ca 91
wolfSSL 13:f67a6c6013ca 92
wolfSSL 13:f67a6c6013ca 93 int wolfSSL_Debugging_ON(void)
wolfSSL 13:f67a6c6013ca 94 {
wolfSSL 13:f67a6c6013ca 95 #ifdef DEBUG_WOLFSSL
wolfSSL 13:f67a6c6013ca 96 loggingEnabled = 1;
wolfSSL 13:f67a6c6013ca 97 return 0;
wolfSSL 13:f67a6c6013ca 98 #else
wolfSSL 13:f67a6c6013ca 99 return NOT_COMPILED_IN;
wolfSSL 13:f67a6c6013ca 100 #endif
wolfSSL 13:f67a6c6013ca 101 }
wolfSSL 13:f67a6c6013ca 102
wolfSSL 13:f67a6c6013ca 103
wolfSSL 13:f67a6c6013ca 104 void wolfSSL_Debugging_OFF(void)
wolfSSL 13:f67a6c6013ca 105 {
wolfSSL 13:f67a6c6013ca 106 #ifdef DEBUG_WOLFSSL
wolfSSL 13:f67a6c6013ca 107 loggingEnabled = 0;
wolfSSL 13:f67a6c6013ca 108 #endif
wolfSSL 13:f67a6c6013ca 109 }
wolfSSL 13:f67a6c6013ca 110
wolfSSL 13:f67a6c6013ca 111
wolfSSL 13:f67a6c6013ca 112 #ifdef DEBUG_WOLFSSL
wolfSSL 13:f67a6c6013ca 113
wolfSSL 13:f67a6c6013ca 114 #if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
wolfSSL 13:f67a6c6013ca 115 #if MQX_USE_IO_OLD
wolfSSL 13:f67a6c6013ca 116 #include <fio.h>
wolfSSL 13:f67a6c6013ca 117 #else
wolfSSL 13:f67a6c6013ca 118 #include <nio.h>
wolfSSL 13:f67a6c6013ca 119 #endif
wolfSSL 13:f67a6c6013ca 120 #elif defined(WOLFSSL_SGX)
wolfSSL 13:f67a6c6013ca 121 /* Declare sprintf for ocall */
wolfSSL 13:f67a6c6013ca 122 int sprintf(char* buf, const char *fmt, ...);
wolfSSL 13:f67a6c6013ca 123 #else
wolfSSL 13:f67a6c6013ca 124 #include <stdio.h> /* for default printf stuff */
wolfSSL 13:f67a6c6013ca 125 #endif
wolfSSL 13:f67a6c6013ca 126
wolfSSL 13:f67a6c6013ca 127 #if defined(THREADX) && !defined(THREADX_NO_DC_PRINTF)
wolfSSL 13:f67a6c6013ca 128 int dc_log_printf(char*, ...);
wolfSSL 13:f67a6c6013ca 129 #endif
wolfSSL 13:f67a6c6013ca 130
wolfSSL 13:f67a6c6013ca 131 static void wolfssl_log(const int logLevel, const char *const logMessage)
wolfSSL 13:f67a6c6013ca 132 {
wolfSSL 13:f67a6c6013ca 133 if (log_function)
wolfSSL 13:f67a6c6013ca 134 log_function(logLevel, logMessage);
wolfSSL 13:f67a6c6013ca 135 else {
wolfSSL 13:f67a6c6013ca 136 if (loggingEnabled) {
wolfSSL 13:f67a6c6013ca 137 #if defined(THREADX) && !defined(THREADX_NO_DC_PRINTF)
wolfSSL 13:f67a6c6013ca 138 dc_log_printf("%s\n", logMessage);
wolfSSL 13:f67a6c6013ca 139 #elif defined(MICRIUM)
wolfSSL 13:f67a6c6013ca 140 #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
wolfSSL 13:f67a6c6013ca 141 NetSecure_TraceOut((CPU_CHAR *)logMessage);
wolfSSL 13:f67a6c6013ca 142 #endif
wolfSSL 13:f67a6c6013ca 143 #elif defined(WOLFSSL_MDK_ARM)
wolfSSL 13:f67a6c6013ca 144 fflush(stdout) ;
wolfSSL 13:f67a6c6013ca 145 printf("%s\n", logMessage);
wolfSSL 13:f67a6c6013ca 146 fflush(stdout) ;
wolfSSL 13:f67a6c6013ca 147 #elif defined(WOLFSSL_LOG_PRINTF)
wolfSSL 13:f67a6c6013ca 148 printf("%s\n", logMessage);
wolfSSL 13:f67a6c6013ca 149 #elif defined(WOLFSSL_UTASKER)
wolfSSL 13:f67a6c6013ca 150 fnDebugMsg((char*)logMessage);
wolfSSL 13:f67a6c6013ca 151 fnDebugMsg("\r\n");
wolfSSL 13:f67a6c6013ca 152 #elif defined(MQX_USE_IO_OLD)
wolfSSL 13:f67a6c6013ca 153 fprintf(_mqxio_stderr, "%s\n", logMessage);
wolfSSL 13:f67a6c6013ca 154 #else
wolfSSL 13:f67a6c6013ca 155 fprintf(stderr, "%s\n", logMessage);
wolfSSL 13:f67a6c6013ca 156 #endif
wolfSSL 13:f67a6c6013ca 157 }
wolfSSL 13:f67a6c6013ca 158 }
wolfSSL 13:f67a6c6013ca 159 }
wolfSSL 13:f67a6c6013ca 160
wolfSSL 13:f67a6c6013ca 161
wolfSSL 13:f67a6c6013ca 162 void WOLFSSL_MSG(const char* msg)
wolfSSL 13:f67a6c6013ca 163 {
wolfSSL 13:f67a6c6013ca 164 if (loggingEnabled)
wolfSSL 13:f67a6c6013ca 165 wolfssl_log(INFO_LOG , msg);
wolfSSL 13:f67a6c6013ca 166 }
wolfSSL 13:f67a6c6013ca 167
wolfSSL 13:f67a6c6013ca 168
wolfSSL 13:f67a6c6013ca 169 void WOLFSSL_BUFFER(const byte* buffer, word32 length)
wolfSSL 13:f67a6c6013ca 170 {
wolfSSL 13:f67a6c6013ca 171 #define LINE_LEN 16
wolfSSL 13:f67a6c6013ca 172
wolfSSL 13:f67a6c6013ca 173 if (loggingEnabled) {
wolfSSL 13:f67a6c6013ca 174 word32 i;
wolfSSL 13:f67a6c6013ca 175 char line[80];
wolfSSL 13:f67a6c6013ca 176
wolfSSL 13:f67a6c6013ca 177 if (!buffer) {
wolfSSL 13:f67a6c6013ca 178 wolfssl_log(INFO_LOG, "\tNULL");
wolfSSL 13:f67a6c6013ca 179
wolfSSL 13:f67a6c6013ca 180 return;
wolfSSL 13:f67a6c6013ca 181 }
wolfSSL 13:f67a6c6013ca 182
wolfSSL 13:f67a6c6013ca 183 sprintf(line, "\t");
wolfSSL 13:f67a6c6013ca 184
wolfSSL 13:f67a6c6013ca 185 for (i = 0; i < LINE_LEN; i++) {
wolfSSL 13:f67a6c6013ca 186 if (i < length)
wolfSSL 13:f67a6c6013ca 187 sprintf(line + 1 + i * 3,"%02x ", buffer[i]);
wolfSSL 13:f67a6c6013ca 188 else
wolfSSL 13:f67a6c6013ca 189 sprintf(line + 1 + i * 3, " ");
wolfSSL 13:f67a6c6013ca 190 }
wolfSSL 13:f67a6c6013ca 191
wolfSSL 13:f67a6c6013ca 192 sprintf(line + 1 + LINE_LEN * 3, "| ");
wolfSSL 13:f67a6c6013ca 193
wolfSSL 13:f67a6c6013ca 194 for (i = 0; i < LINE_LEN; i++)
wolfSSL 13:f67a6c6013ca 195 if (i < length)
wolfSSL 13:f67a6c6013ca 196 sprintf(line + 3 + LINE_LEN * 3 + i,
wolfSSL 13:f67a6c6013ca 197 "%c", 31 < buffer[i] && buffer[i] < 127 ? buffer[i] : '.');
wolfSSL 13:f67a6c6013ca 198
wolfSSL 13:f67a6c6013ca 199 wolfssl_log(INFO_LOG, line);
wolfSSL 13:f67a6c6013ca 200
wolfSSL 13:f67a6c6013ca 201 if (length > LINE_LEN)
wolfSSL 13:f67a6c6013ca 202 WOLFSSL_BUFFER(buffer + LINE_LEN, length - LINE_LEN);
wolfSSL 13:f67a6c6013ca 203 }
wolfSSL 13:f67a6c6013ca 204 }
wolfSSL 13:f67a6c6013ca 205
wolfSSL 13:f67a6c6013ca 206
wolfSSL 13:f67a6c6013ca 207 void WOLFSSL_ENTER(const char* msg)
wolfSSL 13:f67a6c6013ca 208 {
wolfSSL 13:f67a6c6013ca 209 if (loggingEnabled) {
wolfSSL 13:f67a6c6013ca 210 char buffer[80];
wolfSSL 13:f67a6c6013ca 211 sprintf(buffer, "wolfSSL Entering %s", msg);
wolfSSL 13:f67a6c6013ca 212 wolfssl_log(ENTER_LOG , buffer);
wolfSSL 13:f67a6c6013ca 213 }
wolfSSL 13:f67a6c6013ca 214 }
wolfSSL 13:f67a6c6013ca 215
wolfSSL 13:f67a6c6013ca 216
wolfSSL 13:f67a6c6013ca 217 void WOLFSSL_LEAVE(const char* msg, int ret)
wolfSSL 13:f67a6c6013ca 218 {
wolfSSL 13:f67a6c6013ca 219 if (loggingEnabled) {
wolfSSL 13:f67a6c6013ca 220 char buffer[80];
wolfSSL 13:f67a6c6013ca 221 sprintf(buffer, "wolfSSL Leaving %s, return %d", msg, ret);
wolfSSL 13:f67a6c6013ca 222 wolfssl_log(LEAVE_LOG , buffer);
wolfSSL 13:f67a6c6013ca 223 }
wolfSSL 13:f67a6c6013ca 224 }
wolfSSL 13:f67a6c6013ca 225 #endif /* DEBUG_WOLFSSL */
wolfSSL 13:f67a6c6013ca 226
wolfSSL 13:f67a6c6013ca 227 /*
wolfSSL 13:f67a6c6013ca 228 * When using OPENSSL_EXTRA or DEBUG_WOLFSSL_VERBOSE macro then WOLFSSL_ERROR is
wolfSSL 13:f67a6c6013ca 229 * mapped to new funtion WOLFSSL_ERROR_LINE which gets the line # and function
wolfSSL 13:f67a6c6013ca 230 * name where WOLFSSL_ERROR is called at.
wolfSSL 13:f67a6c6013ca 231 */
wolfSSL 13:f67a6c6013ca 232 #if (defined(DEBUG_WOLFSSL) || defined(WOLFSSL_NGINX)) || defined(WOLFSSL_HAPROXY)
wolfSSL 13:f67a6c6013ca 233 #if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
wolfSSL 13:f67a6c6013ca 234 void WOLFSSL_ERROR_LINE(int error, const char* func, unsigned int line,
wolfSSL 13:f67a6c6013ca 235 const char* file, void* usrCtx)
wolfSSL 13:f67a6c6013ca 236 #else
wolfSSL 13:f67a6c6013ca 237 void WOLFSSL_ERROR(int error)
wolfSSL 13:f67a6c6013ca 238 #endif
wolfSSL 13:f67a6c6013ca 239 {
wolfSSL 13:f67a6c6013ca 240 #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_NGINX)
wolfSSL 13:f67a6c6013ca 241 if (loggingEnabled && error != WC_PENDING_E)
wolfSSL 13:f67a6c6013ca 242 #endif
wolfSSL 13:f67a6c6013ca 243 {
wolfSSL 13:f67a6c6013ca 244 char buffer[80];
wolfSSL 13:f67a6c6013ca 245 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 13:f67a6c6013ca 246 (void)usrCtx; /* a user ctx for future flexibility */
wolfSSL 13:f67a6c6013ca 247 (void)func;
wolfSSL 13:f67a6c6013ca 248
wolfSSL 13:f67a6c6013ca 249 if (wc_LockMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 250 WOLFSSL_MSG("Lock debug mutex failed");
wolfSSL 13:f67a6c6013ca 251 sprintf(buffer, "wolfSSL error occurred, error = %d", error);
wolfSSL 13:f67a6c6013ca 252 }
wolfSSL 13:f67a6c6013ca 253 else {
wolfSSL 13:f67a6c6013ca 254 if (error < 0) error = error - (2*error); /*get absolute value*/
wolfSSL 13:f67a6c6013ca 255 sprintf(buffer, "wolfSSL error occurred, error = %d line:%d file:%s",
wolfSSL 13:f67a6c6013ca 256 error, line, file);
wolfSSL 13:f67a6c6013ca 257 if (wc_AddErrorNode(error, line, buffer, (char*)file) != 0) {
wolfSSL 13:f67a6c6013ca 258 WOLFSSL_MSG("Error creating logging node");
wolfSSL 13:f67a6c6013ca 259 /* with void function there is no return here, continue on
wolfSSL 13:f67a6c6013ca 260 * to unlock mutex and log what buffer was created. */
wolfSSL 13:f67a6c6013ca 261 }
wolfSSL 13:f67a6c6013ca 262
wolfSSL 13:f67a6c6013ca 263 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 264 }
wolfSSL 13:f67a6c6013ca 265 #else
wolfSSL 13:f67a6c6013ca 266 sprintf(buffer, "wolfSSL error occurred, error = %d", error);
wolfSSL 13:f67a6c6013ca 267 #endif
wolfSSL 13:f67a6c6013ca 268 #ifdef DEBUG_WOLFSSL
wolfSSL 13:f67a6c6013ca 269 wolfssl_log(ERROR_LOG , buffer);
wolfSSL 13:f67a6c6013ca 270 #endif
wolfSSL 13:f67a6c6013ca 271 }
wolfSSL 13:f67a6c6013ca 272 }
wolfSSL 13:f67a6c6013ca 273
wolfSSL 13:f67a6c6013ca 274 #endif /* DEBUG_WOLFSSL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
wolfSSL 13:f67a6c6013ca 275
wolfSSL 13:f67a6c6013ca 276 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 13:f67a6c6013ca 277 /* Internal function that is called by wolfCrypt_Init() */
wolfSSL 13:f67a6c6013ca 278 int wc_LoggingInit(void)
wolfSSL 13:f67a6c6013ca 279 {
wolfSSL 13:f67a6c6013ca 280 if (wc_InitMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 281 WOLFSSL_MSG("Bad Init Mutex");
wolfSSL 13:f67a6c6013ca 282 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 283 }
wolfSSL 13:f67a6c6013ca 284 wc_errors = NULL;
wolfSSL 13:f67a6c6013ca 285 wc_last_node = NULL;
wolfSSL 13:f67a6c6013ca 286
wolfSSL 13:f67a6c6013ca 287 return 0;
wolfSSL 13:f67a6c6013ca 288 }
wolfSSL 13:f67a6c6013ca 289
wolfSSL 13:f67a6c6013ca 290
wolfSSL 13:f67a6c6013ca 291 /* internal function that is called by wolfCrypt_Cleanup */
wolfSSL 13:f67a6c6013ca 292 int wc_LoggingCleanup(void)
wolfSSL 13:f67a6c6013ca 293 {
wolfSSL 13:f67a6c6013ca 294 /* clear logging entries */
wolfSSL 13:f67a6c6013ca 295 wc_ClearErrorNodes();
wolfSSL 13:f67a6c6013ca 296
wolfSSL 13:f67a6c6013ca 297 /* free mutex */
wolfSSL 13:f67a6c6013ca 298 if (wc_FreeMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 299 WOLFSSL_MSG("Bad Mutex free");
wolfSSL 13:f67a6c6013ca 300 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 301 }
wolfSSL 13:f67a6c6013ca 302 return 0;
wolfSSL 13:f67a6c6013ca 303 }
wolfSSL 13:f67a6c6013ca 304
wolfSSL 13:f67a6c6013ca 305
wolfSSL 13:f67a6c6013ca 306 #if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
wolfSSL 13:f67a6c6013ca 307 /* peek at an error node
wolfSSL 13:f67a6c6013ca 308 *
wolfSSL 13:f67a6c6013ca 309 * idx : if -1 then the most recent node is looked at, otherwise search
wolfSSL 13:f67a6c6013ca 310 * through queue for node at the given index
wolfSSL 13:f67a6c6013ca 311 * file : pointer to internal file string
wolfSSL 13:f67a6c6013ca 312 * reason : pointer to internal error reason
wolfSSL 13:f67a6c6013ca 313 * line : line number that error happened at
wolfSSL 13:f67a6c6013ca 314 *
wolfSSL 13:f67a6c6013ca 315 * Returns a negative value in error case, on success returns the nodes error
wolfSSL 13:f67a6c6013ca 316 * value which is positve (absolute value)
wolfSSL 13:f67a6c6013ca 317 */
wolfSSL 13:f67a6c6013ca 318 int wc_PeekErrorNode(int idx, const char **file, const char **reason,
wolfSSL 13:f67a6c6013ca 319 int *line)
wolfSSL 13:f67a6c6013ca 320 {
wolfSSL 13:f67a6c6013ca 321 struct wc_error_queue* err;
wolfSSL 13:f67a6c6013ca 322
wolfSSL 13:f67a6c6013ca 323 if (wc_LockMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 324 WOLFSSL_MSG("Lock debug mutex failed");
wolfSSL 13:f67a6c6013ca 325 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 326 }
wolfSSL 13:f67a6c6013ca 327
wolfSSL 13:f67a6c6013ca 328 if (idx < 0) {
wolfSSL 13:f67a6c6013ca 329 err = wc_last_node;
wolfSSL 13:f67a6c6013ca 330 if (err == NULL) {
wolfSSL 13:f67a6c6013ca 331 WOLFSSL_MSG("No Errors in queue");
wolfSSL 13:f67a6c6013ca 332 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 333 return BAD_STATE_E;
wolfSSL 13:f67a6c6013ca 334 }
wolfSSL 13:f67a6c6013ca 335 }
wolfSSL 13:f67a6c6013ca 336 else {
wolfSSL 13:f67a6c6013ca 337 int i;
wolfSSL 13:f67a6c6013ca 338
wolfSSL 13:f67a6c6013ca 339 err = (struct wc_error_queue*)wc_errors;
wolfSSL 13:f67a6c6013ca 340 for (i = 0; i < idx; i++) {
wolfSSL 13:f67a6c6013ca 341 if (err == NULL) {
wolfSSL 13:f67a6c6013ca 342 WOLFSSL_MSG("Error node not found. Bad index?");
wolfSSL 13:f67a6c6013ca 343 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 344 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 345 }
wolfSSL 13:f67a6c6013ca 346 err = err->next;
wolfSSL 13:f67a6c6013ca 347 }
wolfSSL 13:f67a6c6013ca 348 }
wolfSSL 13:f67a6c6013ca 349
wolfSSL 13:f67a6c6013ca 350 if (file != NULL) {
wolfSSL 13:f67a6c6013ca 351 *file = err->file;
wolfSSL 13:f67a6c6013ca 352 }
wolfSSL 13:f67a6c6013ca 353
wolfSSL 13:f67a6c6013ca 354 if (reason != NULL) {
wolfSSL 13:f67a6c6013ca 355 *reason = err->error;
wolfSSL 13:f67a6c6013ca 356 }
wolfSSL 13:f67a6c6013ca 357
wolfSSL 13:f67a6c6013ca 358 if (line != NULL) {
wolfSSL 13:f67a6c6013ca 359 *line = err->line;
wolfSSL 13:f67a6c6013ca 360 }
wolfSSL 13:f67a6c6013ca 361
wolfSSL 13:f67a6c6013ca 362 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 363
wolfSSL 13:f67a6c6013ca 364 return err->value;
wolfSSL 13:f67a6c6013ca 365 }
wolfSSL 13:f67a6c6013ca 366
wolfSSL 13:f67a6c6013ca 367
wolfSSL 13:f67a6c6013ca 368 /* create new error node and add it to the queue
wolfSSL 13:f67a6c6013ca 369 * buffers are assumed to be of size WOLFSSL_MAX_ERROR_SZ for this internal
wolfSSL 13:f67a6c6013ca 370 * function. debug_mutex should be locked before a call to this function. */
wolfSSL 13:f67a6c6013ca 371 int wc_AddErrorNode(int error, int line, char* buf, char* file)
wolfSSL 13:f67a6c6013ca 372 {
wolfSSL 13:f67a6c6013ca 373
wolfSSL 13:f67a6c6013ca 374 struct wc_error_queue* err;
wolfSSL 13:f67a6c6013ca 375
wolfSSL 13:f67a6c6013ca 376 err = (struct wc_error_queue*)XMALLOC(
wolfSSL 13:f67a6c6013ca 377 sizeof(struct wc_error_queue), wc_error_heap, DYNAMIC_TYPE_LOG);
wolfSSL 13:f67a6c6013ca 378 if (err == NULL) {
wolfSSL 13:f67a6c6013ca 379 WOLFSSL_MSG("Unable to create error node for log");
wolfSSL 13:f67a6c6013ca 380 return MEMORY_E;
wolfSSL 13:f67a6c6013ca 381 }
wolfSSL 13:f67a6c6013ca 382 else {
wolfSSL 13:f67a6c6013ca 383 int sz;
wolfSSL 13:f67a6c6013ca 384
wolfSSL 13:f67a6c6013ca 385 XMEMSET(err, 0, sizeof(struct wc_error_queue));
wolfSSL 13:f67a6c6013ca 386 err->heap = wc_error_heap;
wolfSSL 13:f67a6c6013ca 387 sz = (int)XSTRLEN(buf);
wolfSSL 13:f67a6c6013ca 388 if (sz > WOLFSSL_MAX_ERROR_SZ - 1) {
wolfSSL 13:f67a6c6013ca 389 sz = WOLFSSL_MAX_ERROR_SZ - 1;
wolfSSL 13:f67a6c6013ca 390 }
wolfSSL 13:f67a6c6013ca 391 if (sz > 0) {
wolfSSL 13:f67a6c6013ca 392 XMEMCPY(err->error, buf, sz);
wolfSSL 13:f67a6c6013ca 393 }
wolfSSL 13:f67a6c6013ca 394
wolfSSL 13:f67a6c6013ca 395 sz = (int)XSTRLEN(file);
wolfSSL 13:f67a6c6013ca 396 if (sz > WOLFSSL_MAX_ERROR_SZ - 1) {
wolfSSL 13:f67a6c6013ca 397 sz = WOLFSSL_MAX_ERROR_SZ - 1;
wolfSSL 13:f67a6c6013ca 398 }
wolfSSL 13:f67a6c6013ca 399 if (sz > 0) {
wolfSSL 13:f67a6c6013ca 400 XMEMCPY(err->file, file, sz);
wolfSSL 13:f67a6c6013ca 401 }
wolfSSL 13:f67a6c6013ca 402
wolfSSL 13:f67a6c6013ca 403 err->value = error;
wolfSSL 13:f67a6c6013ca 404 err->line = line;
wolfSSL 13:f67a6c6013ca 405
wolfSSL 13:f67a6c6013ca 406 /* make sure is terminated */
wolfSSL 13:f67a6c6013ca 407 err->error[WOLFSSL_MAX_ERROR_SZ - 1] = '\0';
wolfSSL 13:f67a6c6013ca 408 err->file[WOLFSSL_MAX_ERROR_SZ - 1] = '\0';
wolfSSL 13:f67a6c6013ca 409
wolfSSL 13:f67a6c6013ca 410
wolfSSL 13:f67a6c6013ca 411 /* since is queue place new node at last of the list */
wolfSSL 13:f67a6c6013ca 412 if (wc_last_node == NULL) {
wolfSSL 13:f67a6c6013ca 413 /* case of first node added to queue */
wolfSSL 13:f67a6c6013ca 414 if (wc_errors != NULL) {
wolfSSL 13:f67a6c6013ca 415 /* check for unexpected case before over writing wc_errors */
wolfSSL 13:f67a6c6013ca 416 WOLFSSL_MSG("ERROR in adding new node to logging queue!!\n");
wolfSSL 13:f67a6c6013ca 417 }
wolfSSL 13:f67a6c6013ca 418 else {
wolfSSL 13:f67a6c6013ca 419 wc_errors = err;
wolfSSL 13:f67a6c6013ca 420 wc_last_node = err;
wolfSSL 13:f67a6c6013ca 421 }
wolfSSL 13:f67a6c6013ca 422 }
wolfSSL 13:f67a6c6013ca 423 else {
wolfSSL 13:f67a6c6013ca 424 wc_last_node->next = err;
wolfSSL 13:f67a6c6013ca 425 err->prev = wc_last_node;
wolfSSL 13:f67a6c6013ca 426 wc_last_node = err;
wolfSSL 13:f67a6c6013ca 427 }
wolfSSL 13:f67a6c6013ca 428 }
wolfSSL 13:f67a6c6013ca 429
wolfSSL 13:f67a6c6013ca 430 return 0;
wolfSSL 13:f67a6c6013ca 431 }
wolfSSL 13:f67a6c6013ca 432
wolfSSL 13:f67a6c6013ca 433 /* Removes the error node at the specified index.
wolfSSL 13:f67a6c6013ca 434 * idx : if -1 then the most recent node is looked at, otherwise search
wolfSSL 13:f67a6c6013ca 435 * through queue for node at the given index
wolfSSL 13:f67a6c6013ca 436 */
wolfSSL 13:f67a6c6013ca 437 void wc_RemoveErrorNode(int idx)
wolfSSL 13:f67a6c6013ca 438 {
wolfSSL 13:f67a6c6013ca 439 struct wc_error_queue* current;
wolfSSL 13:f67a6c6013ca 440
wolfSSL 13:f67a6c6013ca 441 if (wc_LockMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 442 WOLFSSL_MSG("Lock debug mutex failed");
wolfSSL 13:f67a6c6013ca 443 return;
wolfSSL 13:f67a6c6013ca 444 }
wolfSSL 13:f67a6c6013ca 445
wolfSSL 13:f67a6c6013ca 446 if (idx == -1)
wolfSSL 13:f67a6c6013ca 447 current = wc_last_node;
wolfSSL 13:f67a6c6013ca 448 else {
wolfSSL 13:f67a6c6013ca 449 current = (struct wc_error_queue*)wc_errors;
wolfSSL 13:f67a6c6013ca 450 for (; current != NULL && idx > 0; idx--)
wolfSSL 13:f67a6c6013ca 451 current = current->next;
wolfSSL 13:f67a6c6013ca 452 }
wolfSSL 13:f67a6c6013ca 453 if (current != NULL) {
wolfSSL 13:f67a6c6013ca 454 if (current->prev != NULL)
wolfSSL 13:f67a6c6013ca 455 current->prev->next = current->next;
wolfSSL 13:f67a6c6013ca 456 if (wc_last_node == current)
wolfSSL 13:f67a6c6013ca 457 wc_last_node = current->prev;
wolfSSL 13:f67a6c6013ca 458 if (wc_errors == current)
wolfSSL 13:f67a6c6013ca 459 wc_errors = current->next;
wolfSSL 13:f67a6c6013ca 460 XFREE(current, current->heap, DYNAMIC_TYPE_LOG);
wolfSSL 13:f67a6c6013ca 461 }
wolfSSL 13:f67a6c6013ca 462
wolfSSL 13:f67a6c6013ca 463 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 464 }
wolfSSL 13:f67a6c6013ca 465
wolfSSL 13:f67a6c6013ca 466 #endif /* DEBUG_WOLFSSL || WOLFSSL_NGINX */
wolfSSL 13:f67a6c6013ca 467
wolfSSL 13:f67a6c6013ca 468 /* Clears out the list of error nodes.
wolfSSL 13:f67a6c6013ca 469 */
wolfSSL 13:f67a6c6013ca 470 void wc_ClearErrorNodes(void)
wolfSSL 13:f67a6c6013ca 471 {
wolfSSL 13:f67a6c6013ca 472 if (wc_LockMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 473 WOLFSSL_MSG("Lock debug mutex failed");
wolfSSL 13:f67a6c6013ca 474 return;
wolfSSL 13:f67a6c6013ca 475 }
wolfSSL 13:f67a6c6013ca 476
wolfSSL 13:f67a6c6013ca 477 /* free all nodes from error queue */
wolfSSL 13:f67a6c6013ca 478 {
wolfSSL 13:f67a6c6013ca 479 struct wc_error_queue* current;
wolfSSL 13:f67a6c6013ca 480 struct wc_error_queue* next;
wolfSSL 13:f67a6c6013ca 481
wolfSSL 13:f67a6c6013ca 482 current = (struct wc_error_queue*)wc_errors;
wolfSSL 13:f67a6c6013ca 483 while (current != NULL) {
wolfSSL 13:f67a6c6013ca 484 next = current->next;
wolfSSL 13:f67a6c6013ca 485 XFREE(current, current->heap, DYNAMIC_TYPE_LOG);
wolfSSL 13:f67a6c6013ca 486 current = next;
wolfSSL 13:f67a6c6013ca 487 }
wolfSSL 13:f67a6c6013ca 488 }
wolfSSL 13:f67a6c6013ca 489
wolfSSL 13:f67a6c6013ca 490 wc_errors = NULL;
wolfSSL 13:f67a6c6013ca 491 wc_last_node = NULL;
wolfSSL 13:f67a6c6013ca 492 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 493 }
wolfSSL 13:f67a6c6013ca 494
wolfSSL 13:f67a6c6013ca 495 int wc_SetLoggingHeap(void* h)
wolfSSL 13:f67a6c6013ca 496 {
wolfSSL 13:f67a6c6013ca 497 if (wc_LockMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 498 WOLFSSL_MSG("Lock debug mutex failed");
wolfSSL 13:f67a6c6013ca 499 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 500 }
wolfSSL 13:f67a6c6013ca 501 wc_error_heap = h;
wolfSSL 13:f67a6c6013ca 502 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 503 return 0;
wolfSSL 13:f67a6c6013ca 504 }
wolfSSL 13:f67a6c6013ca 505
wolfSSL 13:f67a6c6013ca 506 #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
wolfSSL 13:f67a6c6013ca 507 /* empties out the error queue into the file */
wolfSSL 13:f67a6c6013ca 508 void wc_ERR_print_errors_fp(FILE* fp)
wolfSSL 13:f67a6c6013ca 509 {
wolfSSL 13:f67a6c6013ca 510 WOLFSSL_ENTER("wc_ERR_print_errors_fp");
wolfSSL 13:f67a6c6013ca 511
wolfSSL 13:f67a6c6013ca 512 if (wc_LockMutex(&debug_mutex) != 0) {
wolfSSL 13:f67a6c6013ca 513 WOLFSSL_MSG("Lock debug mutex failed");
wolfSSL 13:f67a6c6013ca 514 }
wolfSSL 13:f67a6c6013ca 515 else {
wolfSSL 13:f67a6c6013ca 516 /* free all nodes from error queue and print them to file */
wolfSSL 13:f67a6c6013ca 517 {
wolfSSL 13:f67a6c6013ca 518 struct wc_error_queue* current;
wolfSSL 13:f67a6c6013ca 519 struct wc_error_queue* next;
wolfSSL 13:f67a6c6013ca 520
wolfSSL 13:f67a6c6013ca 521 current = (struct wc_error_queue*)wc_errors;
wolfSSL 13:f67a6c6013ca 522 while (current != NULL) {
wolfSSL 13:f67a6c6013ca 523 next = current->next;
wolfSSL 13:f67a6c6013ca 524 fprintf(fp, "%s\n", current->error);
wolfSSL 13:f67a6c6013ca 525 XFREE(current, current->heap, DYNAMIC_TYPE_LOG);
wolfSSL 13:f67a6c6013ca 526 current = next;
wolfSSL 13:f67a6c6013ca 527 }
wolfSSL 13:f67a6c6013ca 528
wolfSSL 13:f67a6c6013ca 529 /* set global pointers to match having been freed */
wolfSSL 13:f67a6c6013ca 530 wc_errors = NULL;
wolfSSL 13:f67a6c6013ca 531 wc_last_node = NULL;
wolfSSL 13:f67a6c6013ca 532 }
wolfSSL 13:f67a6c6013ca 533
wolfSSL 13:f67a6c6013ca 534 wc_UnLockMutex(&debug_mutex);
wolfSSL 13:f67a6c6013ca 535 }
wolfSSL 13:f67a6c6013ca 536 }
wolfSSL 13:f67a6c6013ca 537 #endif /* !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) */
wolfSSL 13:f67a6c6013ca 538
wolfSSL 13:f67a6c6013ca 539 #endif /* defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) */
wolfSSL 13:f67a6c6013ca 540
wolfSSL 13:f67a6c6013ca 541