xref: /openbsd-src/lib/libcrypto/crypto_lock.c (revision 2117f69d1c49fb6e5ba0ae0e2a75050b4c234807)
1 /* $OpenBSD: crypto_lock.c,v 1.6 2023/07/08 08:28:23 beck 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
CRYPTO_lock(int mode,int type,const char * file,int line)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 LCRYPTO_ALIAS(CRYPTO_lock);
82 
83 int
CRYPTO_add_lock(int * pointer,int amount,int type,const char * file,int line)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 LCRYPTO_ALIAS(CRYPTO_add_lock);
97