संक्षिप्त उत्तर: OPENSSL_free
buf
मुक्त करने के लिए उपयोग किया जाना चाहिए।
लांग जवाब: IMPLEMENT_ASN1_FUNCTIONS
मैक्रो i2d_X509
समारोह की परिभाषा का विस्तार किया गया है। उदाहरण के नीचे यह दर्शाता है कि, में निम्नलिखित स्रोत कोड डाल एक source.c
:
#include <openssl/asn1t.h>
IMPLEMENT_ASN1_FUNCTIONS(X509)
gcc -E source.c
के निष्पादन के बाद मैक्रो के लिए विस्तार किया गया है:
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
।
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)
एक मामले मूल प्रश्न में वर्णित में प्रयोग किया जाता है (buf
NULL
है): openssl के स्रोत कोड के अनुसार, ASN1_item_i2d
एक समारोह tasn_enc.c
फाइल में परिभाषित है। तो, आंतरिक रूप से, openssl buf
के लिए OPENSSL_malloc
का उपयोग करके स्मृति आवंटित करता है, और परिणामस्वरूप OPENSSL_free
स्मृति को हटाने के लिए उपयोग किया जाना चाहिए।
नोट: मैंने वर्तमान समय में जीएच पर openssl के स्रोत कोड को देखा।
आपका दावा मेरे लिए सही दिखता है। –
@ माइकल वाल्ज़, आशा है कि। लेकिन व्यवहार परिभाषित नहीं किया गया है, उदा। ऐसा हो सकता है कि त्रुटि होने पर भी बफ को मुक्त करने की आवश्यकता होगी। – tysonite