使用OpenSSL 1.1.x,在调用诸如sk_X509_EXTENSION_pop_free()之类的函数后,如何指示(X509_扩展名)项堆栈_的解除分配?

使用OpenSSL 1.1.x,在调用诸如sk_X509_EXTENSION_pop_free()之类的函数后,如何指示(X509_扩展名)项堆栈_的解除分配?,openssl,Openssl,在将应用程序从OpenSSL 1.0.2迁移到OpenSSL 1.1.x的过程中,我遇到了一个问题,即我找不到一个方法来为X509扩展指针的堆栈_置零,以指示关联项已被解除分配 例如,使用OpenSSL 1.0.2j的现有应用程序中的一个代码片段如下所示: X509 *cert; // ... init X509 cert here ... if (cert->cert_info != NULL) { sk_X509_EXTENSION_pop_free(cert->ce

在将应用程序从OpenSSL 1.0.2迁移到OpenSSL 1.1.x的过程中,我遇到了一个问题,即我找不到一个方法来为X509扩展指针的堆栈_置零,以指示关联项已被解除分配

例如,使用OpenSSL 1.0.2j的现有应用程序中的一个代码片段如下所示:

X509 *cert;

// ... init X509 cert here ...

if (cert->cert_info != NULL)
{
    sk_X509_EXTENSION_pop_free(cert->cert_info->extensions, X509_EXTENSION_free);
    cert->cert_info->extensions = NULL; // indicate extensions stack deallocated
}

// ... do other stuff ...
在迁移到OpenSSL 1.1.x之后,上面的代码片段类似于:

X509 *cert;
const STACK_OF(X509_EXTENSION) *certExts; 

// ... init X509 cert here ...

if ((certExts = X509_get0_extensions(cert)) != NULL)  
{   
    sk_X509_EXTENSION_pop_free(certExts, X509_EXTENSION_free);
    // now, what??
}

// ... do other stuff ...
由于没有用于指示释放的固有OpenSSL 1.1.x方法,如果应用程序随后取消引用同一项,例如另一个“sk_X509_EXTENSION_pop_free”调用,该调用检查NULL,则它将在指向释放内存的指针上操作


我是错过了什么,还是想得太多了?由于许可的影响,我不愿意修改OpenSSL源代码。欢迎所有评论/建议。

由于没有等效的OpenSSL 1.1机制来取消证书扩展堆栈,我最终得出的解决方案如下:

while (X509_get_ext_count(cert) > 0)
    X509_EXTENSION_free(X509_delete_ext(cert, 0));