1 /* $OpenBSD: crypto_lock.c,v 1.5 2023/06/04 17:28:35 tb 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 #include "crypto_internal.h" 23 24 static pthread_mutex_t locks[] = { 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 PTHREAD_MUTEX_INITIALIZER, 65 PTHREAD_MUTEX_INITIALIZER, 66 }; 67 68 CTASSERT((sizeof(locks) / sizeof(*locks)) == CRYPTO_NUM_LOCKS); 69 70 void 71 CRYPTO_lock(int mode, int type, const char *file, int line) 72 { 73 if (type < 0 || type >= CRYPTO_NUM_LOCKS) 74 return; 75 76 if (mode & CRYPTO_LOCK) 77 (void) pthread_mutex_lock(&locks[type]); 78 else if (mode & CRYPTO_UNLOCK) 79 (void) pthread_mutex_unlock(&locks[type]); 80 } 81 82 int 83 CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, 84 int line) 85 { 86 int ret; 87 88 CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE, type, file, line); 89 ret = *pointer + amount; 90 *pointer = ret; 91 CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE, type, file, line); 92 93 return (ret); 94 } 95