1 /* $OpenBSD: crypto_lock.c,v 1.2 2018/11/28 15:51:32 jsing Exp $ */ 2 /* 3 * Copyright (c) 2018 Brent Cook <bcook@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 <pthread.h> 19 20 #include <openssl/crypto.h> 21 22 static pthread_mutex_t locks[] = { 23 PTHREAD_MUTEX_INITIALIZER, 24 PTHREAD_MUTEX_INITIALIZER, 25 PTHREAD_MUTEX_INITIALIZER, 26 PTHREAD_MUTEX_INITIALIZER, 27 PTHREAD_MUTEX_INITIALIZER, 28 PTHREAD_MUTEX_INITIALIZER, 29 PTHREAD_MUTEX_INITIALIZER, 30 PTHREAD_MUTEX_INITIALIZER, 31 PTHREAD_MUTEX_INITIALIZER, 32 PTHREAD_MUTEX_INITIALIZER, 33 PTHREAD_MUTEX_INITIALIZER, 34 PTHREAD_MUTEX_INITIALIZER, 35 PTHREAD_MUTEX_INITIALIZER, 36 PTHREAD_MUTEX_INITIALIZER, 37 PTHREAD_MUTEX_INITIALIZER, 38 PTHREAD_MUTEX_INITIALIZER, 39 PTHREAD_MUTEX_INITIALIZER, 40 PTHREAD_MUTEX_INITIALIZER, 41 PTHREAD_MUTEX_INITIALIZER, 42 PTHREAD_MUTEX_INITIALIZER, 43 PTHREAD_MUTEX_INITIALIZER, 44 PTHREAD_MUTEX_INITIALIZER, 45 PTHREAD_MUTEX_INITIALIZER, 46 PTHREAD_MUTEX_INITIALIZER, 47 PTHREAD_MUTEX_INITIALIZER, 48 PTHREAD_MUTEX_INITIALIZER, 49 PTHREAD_MUTEX_INITIALIZER, 50 PTHREAD_MUTEX_INITIALIZER, 51 PTHREAD_MUTEX_INITIALIZER, 52 PTHREAD_MUTEX_INITIALIZER, 53 PTHREAD_MUTEX_INITIALIZER, 54 PTHREAD_MUTEX_INITIALIZER, 55 PTHREAD_MUTEX_INITIALIZER, 56 PTHREAD_MUTEX_INITIALIZER, 57 PTHREAD_MUTEX_INITIALIZER, 58 PTHREAD_MUTEX_INITIALIZER, 59 PTHREAD_MUTEX_INITIALIZER, 60 PTHREAD_MUTEX_INITIALIZER, 61 PTHREAD_MUTEX_INITIALIZER, 62 PTHREAD_MUTEX_INITIALIZER, 63 PTHREAD_MUTEX_INITIALIZER, 64 }; 65 66 #define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \ 67 __attribute__((__unused__)) 68 69 CTASSERT((sizeof(locks) / sizeof(*locks)) == CRYPTO_NUM_LOCKS); 70 71 void 72 CRYPTO_lock(int mode, int type, const char *file, int line) 73 { 74 if (type < 0 || type >= CRYPTO_NUM_LOCKS) 75 return; 76 77 if (mode & CRYPTO_LOCK) 78 (void) pthread_mutex_lock(&locks[type]); 79 else if (mode & CRYPTO_UNLOCK) 80 (void) pthread_mutex_unlock(&locks[type]); 81 } 82 83 int 84 CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, 85 int line) 86 { 87 int ret; 88 89 CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE, type, file, line); 90 ret = *pointer + amount; 91 *pointer = ret; 92 CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE, type, file, line); 93 94 return (ret); 95 } 96