首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用openssl::i2d_X509后释放输出缓冲区的正确方法是什么?

调用openssl::i2d_X509后释放输出缓冲区的正确方法是什么?
EN

Stack Overflow用户
提问于 2016-12-15 15:27:02
回答 1查看 2K关注 0票数 9

我想将X509结构编码为DER字节。下面是来自openssl (version > 0.9.7) 手册页的源代码示例,我需要这样做(如果我要i2d_X509自己分配内存的话):

代码语言:javascript
运行
复制
int len;
unsigned char *buf;

buf = NULL;

len = i2d_X509(x, &buf);

if (len < 0)
    /* error */

但是,从文档中还不完全清楚(但我假设需要调用OPENSSL_free),在完成buf之后,释放内存的正确方法是什么。

释放buf的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-16 10:17:24

简短答案:必须使用OPENSSL_free来释放buf

长答案IMPLEMENT_ASN1_FUNCTIONS宏被扩展到i2d_X509函数的定义。下面的示例演示了将以下源代码放入source.c

代码语言:javascript
运行
复制
#include <openssl/asn1t.h>
IMPLEMENT_ASN1_FUNCTIONS(X509)

在执行gcc -E source.c之后,宏被展开为:

代码语言:javascript
运行
复制
X509 *d2i_X509(X509 **a, const unsigned char **in, long len) { return (X509 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, (&(X509_it))); }
int i2d_X509(X509 *a, unsigned char **out) { return ASN1_item_i2d((ASN1_VALUE *)a, out, (&(X509_it))); }
X509 *X509_new(void) { return (X509 *)ASN1_item_new((&(X509_it))); } 
void X509_free(X509 *a) { ASN1_item_free((ASN1_VALUE *)a, (&(X509_it))); }

感兴趣的是i2d_X509的定义,然后这个函数调用ASN1_item_i2d。根据openssl的源代码,ASN1_item_i2d是在tasn_enc.c文件中定义的函数:

代码语言:javascript
运行
复制
static int asn1_item_flags_i2d(ASN1_VALUE *val, unsigned char **out,
                               const ASN1_ITEM *it, int flags)
{
    if (out && !*out) {
        unsigned char *p, *buf;
        int len;
        len = ASN1_item_ex_i2d(&val, NULL, it, -1, flags);
        if (len <= 0)
            return len;
        buf = OPENSSL_malloc(len);
        if (buf == NULL)
            return -1;
        p = buf;
        ASN1_item_ex_i2d(&val, &p, it, -1, flags);
        *out = buf;
        return len;
    }

    return ASN1_item_ex_i2d(&val, out, it, -1, flags);
}

分支if (out && !*out)用于原始问题中描述的情况(bufNULL)。因此,在内部,openssl使用bufOPENSSL_malloc分配内存,因此必须使用OPENSSL_free来释放内存。

注意:我查看了当前GH上可用的openssl源代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41167751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档