Replumbing: better reference counter control in ossl_method_construct()

Fully assume that the method constructors use reference counting.
Otherwise, we may leak memory, or loose track and do a double free.

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8341)
This commit is contained in:
Richard Levitte 2019-03-14 21:51:50 +01:00
parent 7bb19a0f95
commit a383083194
2 changed files with 33 additions and 13 deletions

View file

@ -39,25 +39,33 @@ static int ossl_method_construct_this(OSSL_PROVIDER *provider, void *cbdata)
data->mcm_data)) == NULL)
continue;
/*
* Note regarding putting the method in stores:
*
* we don't need to care if it actually got in or not here.
* If it didn't get in, it will simply not be available when
* ossl_method_construct() tries to get it from the store.
*
* It is *expected* that the put function increments the refcnt
* of the passed method.
*/
if (data->force_store || !no_store) {
/*
* If we haven't been told not to store,
* add to the global store
*/
if (!data->mcm->put(data->libctx, NULL,
thismap->property_definition,
method, data->mcm_data)) {
data->mcm->destruct(method, data->mcm_data);
continue;
}
data->mcm->put(data->libctx, NULL,
thismap->property_definition,
method, data->mcm_data);
}
if (!data->mcm->put(data->libctx, data->store,
thismap->property_definition,
method, data->mcm_data)) {
data->mcm->destruct(method, data->mcm_data);
continue;
}
data->mcm->put(data->libctx, data->store,
thismap->property_definition,
method, data->mcm_data);
/* refcnt-- because we're dropping the reference */
data->mcm->destruct(method, data->mcm_data);
}
return 1;

View file

@ -49,6 +49,11 @@ functions given by the sub-system specific method creator through
C<mcm> and the data in C<mcm_data> (which is passed by
ossl_method_construct()).
This function assumes that the sub-system method creator implements
reference counting and acts accordingly (i.e. it will call the
sub-system destruct() method to decrement the reference count when
appropriate).
=head2 Structures
A central part of constructing a sub-system specific method is to give
@ -82,6 +87,8 @@ The method to be looked up should be identified with data from C<data>
(which is the C<mcm_data> that was passed to ossl_construct_method())
and the provided property query C<propquery>.
This function is expected to increment the method's reference count.
=item put()
Places the C<method> created by the construct() function (see below)
@ -96,6 +103,8 @@ The method should be associated with the given property definition
C<propdef> and any identification data given through C<data> (which is
the C<mcm_data> that was passed to ossl_construct_method()).
This function is expected to increment the C<method>'s reference count.
=item construct()
Constructs a sub-system method given a dispatch table C<fns>.
@ -106,9 +115,12 @@ is recommended.
If such a reference is kept, the I<provider object> reference counter
must be incremented, using ossl_provider_upref().
This function is expected to set the method's reference count to 1.
=item desctruct()
Destruct the given C<method>.
Decrement the C<method>'s reference count, and destruct it when
the reference count reaches zero.
=back