]> git.ipfire.org Git - thirdparty/openssl.git/blob - doc/man7/openssl-threads.pod
doc: Fix incorrect pairing of functions
[thirdparty/openssl.git] / doc / man7 / openssl-threads.pod
1 =pod
2
3 =head1 NAME
4
5 openssl-threads - Overview of thread safety in OpenSSL
6
7 =head1 DESCRIPTION
8
9 In this man page, we use the term B<thread-safe> to indicate that an
10 object or function can be used by multiple threads at the same time.
11
12 OpenSSL can be built with or without threads support. The most important
13 use of this support is so that OpenSSL itself can use a single consistent
14 API, as shown in L<CRYPTO_THREAD_run_once(3)/EXAMPLES>.
15 Multi-platform applications can also use this API.
16
17 In particular, being configured for threads support does not imply that
18 all OpenSSL objects are thread-safe.
19 To emphasize: I<most objects are not safe for simultaneous use>.
20 Exceptions to this should be documented on the specific manual pages, and
21 some general high-level guidance is given here.
22
23 One major use of the OpenSSL thread API is to implement reference counting.
24 Many objects within OpenSSL are reference-counted, so resources are not
25 released, until the last reference is removed.
26 References are often increased automatically (such as when an B<X509>
27 certificate object is added into an B<X509_STORE> trust store).
28 There is often an B<I<object>_up_ref>() function that can be used to increase
29 the reference count.
30 Failure to match B<I<object>_up_ref>() calls with the right number of
31 B<I<object>_free>() calls is a common source of memory leaks when a program
32 exits.
33
34 Many objects have set and get API's to set attributes in the object.
35 A C<set0> passes ownership from the caller to the object and a
36 C<get0> returns a pointer but the attribute ownership
37 remains with the object and a reference to it is returned.
38 A C<set1> or C<get1> function does not change the ownership, but instead
39 updates the attribute's reference count so that the object is shared
40 between the caller and the object; the caller must free the returned
41 attribute when finished.
42 Functions that involve attributes that have reference counts themselves,
43 but are named with just C<set> or C<get> are historical; and the documentation
44 must state how the references are handled.
45 Get methods are often thread-safe as long as the ownership requirements are
46 met and shared objects are not modified.
47 Set methods, or modifying shared objects, are generally not thread-safe
48 as discussed below.
49
50 Objects are thread-safe
51 as long as the API's being invoked don't modify the object; in this
52 case the parameter is usually marked in the API as C<const>.
53 Not all parameters are marked this way.
54 Note that a C<const> declaration does not mean immutable; for example
55 L<X509_cmp(3)> takes pointers to C<const> objects, but the implementation
56 uses a C cast to remove that so it can lock objects, generate and cache
57 a DER encoding, and so on.
58
59 Another instance of thread-safety is when updates to an object's
60 internal state, such as cached values, are done with locks.
61 One example of this is the reference counting API's described above.
62
63 In all cases, however, it is generally not safe for one thread to
64 mutate an object, such as setting elements of a private or public key,
65 while another thread is using that object, such as verifying a signature.
66
67 The same API's can usually be used simultaneously on different objects
68 without interference.
69 For example, two threads can calculate a signature using two different
70 B<EVP_PKEY_CTX> objects.
71
72 For implicit global state or singletons, thread-safety depends on the facility.
73 The L<CRYPTO_secure_malloc(3)> and related API's have their own lock,
74 while L<CRYPTO_malloc(3)> assumes the underlying platform allocation
75 will do any necessary locking.
76 Some API's, such as L<NCONF_load(3)> and related do no locking at all;
77 this can be considered a bug.
78
79 A separate, although related, issue is modifying "factory" objects
80 when other objects have been created from that.
81 For example, an B<SSL_CTX> object created by L<SSL_CTX_new(3)> is used
82 to create per-connection B<SSL> objects by calling L<SSL_new(3)>.
83 In this specific case, and probably for factory methods in general, it is
84 not safe to modify the factory object after it has been used to create
85 other objects.
86
87 =head1 SEE ALSO
88
89 CRYPTO_THREAD_run_once(3),
90 local system threads documentation.
91
92 =head1 BUGS
93
94 This page is admittedly very incomplete.
95
96 =head1 COPYRIGHT
97
98 Copyright 2021 The OpenSSL Project Authors. All Rights Reserved.
99
100 Licensed under the Apache License 2.0 (the "License"). You may not use
101 this file except in compliance with the License. You can obtain a copy
102 in the file LICENSE in the source distribution or at
103 L<https://www.openssl.org/source/license.html>.
104
105 =cut