]> git.ipfire.org Git - thirdparty/openssl.git/blame - doc/man3/DEFINE_STACK_OF.pod
Remove an unnecessary call to BN_CTX_free.
[thirdparty/openssl.git] / doc / man3 / DEFINE_STACK_OF.pod
CommitLineData
739a1eb1
RS
1=pod
2
3=head1 NAME
4
5DEFINE_STACK_OF, DEFINE_STACK_OF_CONST, DEFINE_SPECIAL_STACK_OF,
91da5e77 6DEFINE_SPECIAL_STACK_OF_CONST,
1b3e2bbf
P
7sk_TYPE_num, sk_TYPE_value, sk_TYPE_new, sk_TYPE_new_null,
8sk_TYPE_reserve, sk_TYPE_free, sk_TYPE_zero, sk_TYPE_delete,
9sk_TYPE_delete_ptr, sk_TYPE_push, sk_TYPE_unshift, sk_TYPE_pop,
10sk_TYPE_shift, sk_TYPE_pop_free, sk_TYPE_insert, sk_TYPE_set,
11sk_TYPE_find, sk_TYPE_find_ex, sk_TYPE_sort, sk_TYPE_is_sorted,
3ceab379
PY
12sk_TYPE_dup, sk_TYPE_deep_copy, sk_TYPE_set_cmp_func, sk_TYPE_new_reserve
13- stack container
739a1eb1
RS
14
15=head1 SYNOPSIS
16
bb82531f 17=for openssl generic
b97fdb57 18
739a1eb1
RS
19 #include <openssl/safestack.h>
20
91da5e77
RS
21 STACK_OF(TYPE)
22 DEFINE_STACK_OF(TYPE)
23 DEFINE_STACK_OF_CONST(TYPE)
24 DEFINE_SPECIAL_STACK_OF(FUNCTYPE, TYPE)
25 DEFINE_SPECIAL_STACK_OF_CONST(FUNCTYPE, TYPE)
739a1eb1
RS
26
27 typedef int (*sk_TYPE_compfunc)(const TYPE *const *a, const TYPE *const *b);
28 typedef TYPE * (*sk_TYPE_copyfunc)(const TYPE *a);
29 typedef void (*sk_TYPE_freefunc)(TYPE *a);
30
31 int sk_TYPE_num(const STACK_OF(TYPE) *sk);
32 TYPE *sk_TYPE_value(const STACK_OF(TYPE) *sk, int idx);
33 STACK_OF(TYPE) *sk_TYPE_new(sk_TYPE_compfunc compare);
34 STACK_OF(TYPE) *sk_TYPE_new_null(void);
62f45e34 35 int sk_TYPE_reserve(STACK_OF(TYPE) *sk, int n);
739a1eb1
RS
36 void sk_TYPE_free(const STACK_OF(TYPE) *sk);
37 void sk_TYPE_zero(const STACK_OF(TYPE) *sk);
38 TYPE *sk_TYPE_delete(STACK_OF(TYPE) *sk, int i);
39 TYPE *sk_TYPE_delete_ptr(STACK_OF(TYPE) *sk, TYPE *ptr);
36639907
RS
40 int sk_TYPE_push(STACK_OF(TYPE) *sk, const TYPE *ptr);
41 int sk_TYPE_unshift(STACK_OF(TYPE) *sk, const TYPE *ptr);
739a1eb1
RS
42 TYPE *sk_TYPE_pop(STACK_OF(TYPE) *sk);
43 TYPE *sk_TYPE_shift(STACK_OF(TYPE) *sk);
44 void sk_TYPE_pop_free(STACK_OF(TYPE) *sk, sk_TYPE_freefunc freefunc);
45 int sk_TYPE_insert(STACK_OF(TYPE) *sk, TYPE *ptr, int idx);
36639907 46 TYPE *sk_TYPE_set(STACK_OF(TYPE) *sk, int idx, const TYPE *ptr);
739a1eb1
RS
47 int sk_TYPE_find(STACK_OF(TYPE) *sk, TYPE *ptr);
48 int sk_TYPE_find_ex(STACK_OF(TYPE) *sk, TYPE *ptr);
49 void sk_TYPE_sort(const STACK_OF(TYPE) *sk);
50 int sk_TYPE_is_sorted(const STACK_OF(TYPE) *sk);
c0c9c0c0
F
51 STACK_OF(TYPE) *sk_TYPE_dup(const STACK_OF(TYPE) *sk);
52 STACK_OF(TYPE) *sk_TYPE_deep_copy(const STACK_OF(TYPE) *sk,
739a1eb1
RS
53 sk_TYPE_copyfunc copyfunc,
54 sk_TYPE_freefunc freefunc);
e9b77246
BB
55 sk_TYPE_compfunc (*sk_TYPE_set_cmp_func(STACK_OF(TYPE) *sk,
56 sk_TYPE_compfunc compare));
3ceab379 57 STACK_OF(TYPE) *sk_TYPE_new_reserve(sk_TYPE_compfunc compare, int n);
739a1eb1
RS
58
59=head1 DESCRIPTION
60
61Applications can create and use their own stacks by placing any of the macros
c952780c
RS
62described below in a header file. These macros define typesafe inline
63functions that wrap around the utility B<OPENSSL_sk_> API.
bbecf04e
RL
64In the description here, B<I<TYPE>> is used
65as a placeholder for any of the OpenSSL datatypes, such as B<X509>.
739a1eb1 66
bbecf04e
RL
67STACK_OF() returns the name for a stack of the specified B<I<TYPE>>.
68DEFINE_STACK_OF() creates set of functions for a stack of B<I<TYPE>>. This
69will mean that type B<I<TYPE>> is stored in each stack, the type is referenced by
70B<STACK_OF>(B<I<TYPE>>) and each function name begins with B<sk_I<TYPE>_>.
71For example:
739a1eb1
RS
72
73 TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx);
74
91da5e77 75DEFINE_STACK_OF_CONST() is identical to DEFINE_STACK_OF() except
739a1eb1
RS
76each element is constant. For example:
77
78 const TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx);
79
bbecf04e 80DEFINE_SPECIAL_STACK_OF() defines a stack of B<I<TYPE>> but
739a1eb1
RS
81each function uses B<FUNCNAME> in the function name. For example:
82
83 TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx);
84
91da5e77
RS
85DEFINE_SPECIAL_STACK_OF_CONST() is similar except that each element is
86constant:
87
88 const TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx);
89
bbecf04e
RL
90B<sk_I<TYPE>_num>() returns the number of elements in I<sk> or -1 if I<sk> is
91NULL.
739a1eb1 92
bbecf04e
RL
93B<sk_I<TYPE>_value>() returns element I<idx> in I<sk>, where I<idx> starts at
94zero. If I<idx> is out of range then NULL is returned.
739a1eb1 95
bbecf04e
RL
96B<sk_I<TYPE>_new>() allocates a new empty stack using comparison function
97I<compare>. If I<compare> is NULL then no comparison function is used. This
98function is equivalent to B<sk_I<TYPE>_new_reserve>(I<compare>, 0).
739a1eb1 99
bbecf04e
RL
100B<sk_I<TYPE>_new_null>() allocates a new empty stack with no comparison
101function. This function is equivalent to B<sk_I<TYPE>_new_reserve>(NULL, 0).
739a1eb1 102
bbecf04e
RL
103B<sk_I<TYPE>_reserve>() allocates additional memory in the I<sk> structure
104such that the next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>()
105or B<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated
106or reallocated. If I<n> is zero, any excess space allocated in the
107I<sk> structure is freed. On error I<sk> is unchanged.
1b3e2bbf 108
bbecf04e
RL
109B<sk_I<TYPE>_new_reserve>() allocates a new stack. The new stack will have
110additional memory allocated to hold I<n> elements if I<n> is positive.
111The next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() or
112B<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated or
113reallocated. If I<n> is zero or less than zero, no memory is allocated.
114B<sk_I<TYPE>_new_reserve>() also sets the comparison function I<compare>
115to the newly created stack. If I<compare> is NULL then no comparison
116function is used.
3ceab379 117
bbecf04e
RL
118B<sk_I<TYPE>_set_cmp_func>() sets the comparison function of I<sk> to
119I<compare>. The previous comparison function is returned or NULL if there
120was no previous comparison function.
739a1eb1 121
bbecf04e
RL
122B<sk_I<TYPE>_free>() frees up the I<sk> structure. It does I<not> free up any
123elements of I<sk>. After this call I<sk> is no longer valid.
739a1eb1 124
bbecf04e
RL
125B<sk_I<TYPE>_zero>() sets the number of elements in I<sk> to zero. It does not
126free I<sk> so after this call I<sk> is still valid.
739a1eb1 127
bbecf04e 128B<sk_I<TYPE>_pop_free>() frees up all elements of I<sk> and I<sk> itself. The
739a1eb1
RS
129free function freefunc() is called on each element to free it.
130
bbecf04e
RL
131B<sk_I<TYPE>_delete>() deletes element I<i> from I<sk>. It returns the deleted
132element or NULL if I<i> is out of range.
739a1eb1 133
bbecf04e
RL
134B<sk_I<TYPE>_delete_ptr>() deletes element matching I<ptr> from I<sk>. It
135returns the deleted element or NULL if no element matching I<ptr> was found.
739a1eb1 136
bbecf04e
RL
137B<sk_I<TYPE>_insert>() inserts I<ptr> into I<sk> at position I<idx>. Any
138existing elements at or after I<idx> are moved downwards. If I<idx> is out
139of range the new element is appended to I<sk>. B<sk_I<TYPE>_insert>() either
140returns the number of elements in I<sk> after the new element is inserted or
141zero if an error (such as memory allocation failure) occurred.
739a1eb1 142
bbecf04e 143B<sk_I<TYPE>_push>() appends I<ptr> to I<sk> it is equivalent to:
739a1eb1
RS
144
145 sk_TYPE_insert(sk, ptr, -1);
146
bbecf04e
RL
147B<sk_I<TYPE>_unshift>() inserts I<ptr> at the start of I<sk> it is equivalent
148to:
739a1eb1
RS
149
150 sk_TYPE_insert(sk, ptr, 0);
151
bbecf04e 152B<sk_I<TYPE>_pop>() returns and removes the last element from I<sk>.
739a1eb1 153
bbecf04e 154B<sk_I<TYPE>_shift>() returns and removes the first element from I<sk>.
739a1eb1 155
bbecf04e
RL
156B<sk_I<TYPE>_set>() sets element I<idx> of I<sk> to I<ptr> replacing the current
157element. The new element value is returned or NULL if an error occurred:
158this will only happen if I<sk> is NULL or I<idx> is out of range.
739a1eb1 159
bbecf04e 160B<sk_I<TYPE>_find>() searches I<sk> for the element I<ptr>. In the case
89b06ca7 161where no comparison function has been specified, the function performs
bbecf04e 162a linear search for a pointer equal to I<ptr>. The index of the first
89b06ca7 163matching element is returned or B<-1> if there is no match. In the case
bbecf04e
RL
164where a comparison function has been specified, I<sk> is sorted then
165B<sk_I<TYPE>_find>() returns the index of a matching element or B<-1> if there
89b06ca7
P
166is no match. Note that, in this case, the matching element returned is
167not guaranteed to be the first; the comparison function will usually
168compare the values pointed to rather than the pointers themselves and
bbecf04e 169the order of elements in I<sk> could change.
89b06ca7 170
bbecf04e
RL
171B<sk_I<TYPE>_find_ex>() operates like B<sk_I<TYPE>_find>() except when a
172comparison function has been specified and no matching element is found.
173Instead of returning B<-1>, B<sk_I<TYPE>_find_ex>() returns the index of the
174element either before or after the location where I<ptr> would be if it were
175present in I<sk>.
739a1eb1 176
bbecf04e 177B<sk_I<TYPE>_sort>() sorts I<sk> using the supplied comparison function.
739a1eb1 178
bbecf04e 179B<sk_I<TYPE>_is_sorted>() returns B<1> if I<sk> is sorted and B<0> otherwise.
739a1eb1 180
bbecf04e 181B<sk_I<TYPE>_dup>() returns a copy of I<sk>. Note the pointers in the copy
739a1eb1
RS
182are identical to the original.
183
bbecf04e
RL
184B<sk_I<TYPE>_deep_copy>() returns a new stack where each element has been
185copied. Copying is performed by the supplied copyfunc() and freeing by
186freefunc(). The function freefunc() is only called if an error occurs.
739a1eb1
RS
187
188=head1 NOTES
189
190Care should be taken when accessing stacks in multi-threaded environments.
bbecf04e
RL
191Any operation which increases the size of a stack such as B<sk_I<TYPE>_insert>()
192or B<sk_I<TYPE>_push>() can "grow" the size of an internal array and cause race
193conditions if the same stack is accessed in a different thread. Operations such
194as B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_sort>() can also reorder the stack.
739a1eb1
RS
195
196Any comparison function supplied should use a metric suitable
197for use in a binary search operation. That is it should return zero, a
bbecf04e
RL
198positive or negative value if I<a> is equal to, greater than
199or less than I<b> respectively.
739a1eb1
RS
200
201Care should be taken when checking the return values of the functions
bbecf04e 202B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>(). They return an index to the
739a1eb1
RS
203matching element. In particular B<0> indicates a matching first element.
204A failed search is indicated by a B<-1> return value.
205
91da5e77
RS
206STACK_OF(), DEFINE_STACK_OF(), DEFINE_STACK_OF_CONST(), and
207DEFINE_SPECIAL_STACK_OF() are implemented as macros.
208
1f5e0f92
P
209The underlying utility B<OPENSSL_sk_> API should not be used directly.
210It defines these functions: OPENSSL_sk_deep_copy(),
211OPENSSL_sk_delete(), OPENSSL_sk_delete_ptr(), OPENSSL_sk_dup(),
212OPENSSL_sk_find(), OPENSSL_sk_find_ex(), OPENSSL_sk_free(),
213OPENSSL_sk_insert(), OPENSSL_sk_is_sorted(), OPENSSL_sk_new(),
214OPENSSL_sk_new_null(), OPENSSL_sk_num(), OPENSSL_sk_pop(),
215OPENSSL_sk_pop_free(), OPENSSL_sk_push(), OPENSSL_sk_reserve(),
216OPENSSL_sk_set(), OPENSSL_sk_set_cmp_func(), OPENSSL_sk_shift(),
217OPENSSL_sk_sort(), OPENSSL_sk_unshift(), OPENSSL_sk_value(),
218OPENSSL_sk_zero().
219
739a1eb1
RS
220=head1 RETURN VALUES
221
bbecf04e
RL
222B<sk_I<TYPE>_num>() returns the number of elements in the stack or B<-1> if the
223passed stack is NULL.
739a1eb1 224
bbecf04e 225B<sk_I<TYPE>_value>() returns a pointer to a stack element or NULL if the
739a1eb1
RS
226index is out of range.
227
bbecf04e
RL
228B<sk_I<TYPE>_new>(), B<sk_I<TYPE>_new_null>() and B<sk_I<TYPE>_new_reserve>()
229return an empty stack or NULL if an error occurs.
739a1eb1 230
bbecf04e
RL
231B<sk_I<TYPE>_reserve>() returns B<1> on successful allocation of the required
232memory or B<0> on error.
1b3e2bbf 233
bbecf04e 234B<sk_I<TYPE>_set_cmp_func>() returns the old comparison function or NULL if
739a1eb1
RS
235there was no old comparison function.
236
bbecf04e
RL
237B<sk_I<TYPE>_free>(), B<sk_I<TYPE>_zero>(), B<sk_I<TYPE>_pop_free>() and
238B<sk_I<TYPE>_sort>() do not return values.
739a1eb1 239
bbecf04e
RL
240B<sk_I<TYPE>_pop>(), B<sk_I<TYPE>_shift>(), B<sk_I<TYPE>_delete>() and
241B<sk_I<TYPE>_delete_ptr>() return a pointer to the deleted element or NULL
242on error.
739a1eb1 243
bbecf04e
RL
244B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() and B<sk_I<TYPE>_unshift>() return
245the total number of elements in the stack and 0 if an error occurred.
739a1eb1 246
bbecf04e 247B<sk_I<TYPE>_set>() returns a pointer to the replacement element or NULL on
739a1eb1
RS
248error.
249
bbecf04e
RL
250B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>() return an index to the found
251element or B<-1> on error.
739a1eb1 252
bbecf04e 253B<sk_I<TYPE>_is_sorted>() returns B<1> if the stack is sorted and B<0> if it is
739a1eb1
RS
254not.
255
bbecf04e
RL
256B<sk_I<TYPE>_dup>() and B<sk_I<TYPE>_deep_copy>() return a pointer to the copy
257of the stack.
739a1eb1
RS
258
259=head1 HISTORY
260
261Before OpenSSL 1.1.0, this was implemented via macros and not inline functions
262and was not a public API.
263
bbecf04e
RL
264B<sk_I<TYPE>_reserve>() and B<sk_I<TYPE>_new_reserve>() were added in OpenSSL
2651.1.1.
3ceab379 266
739a1eb1
RS
267=head1 COPYRIGHT
268
1b3e2bbf 269Copyright 2000-2017 The OpenSSL Project Authors. All Rights Reserved.
739a1eb1 270
4746f25a 271Licensed under the Apache License 2.0 (the "License"). You may not use
739a1eb1
RS
272this file except in compliance with the License. You can obtain a copy
273in the file LICENSE in the source distribution or at
274L<https://www.openssl.org/source/license.html>.
275
276=cut