Another problem with my code: the buffer I allocated wasn't freed...
Thanks to Peter Sylvester for pointing this out. I also moved the
allocation of the buffer to where it's actually used.
Yuval
diff -ur openssl-engine-0.9.6d/apps/apps.c
openssl-engine-0.9.6d-patch/apps/apps.c
--- openssl-engine-0.9.6d/apps/apps.c Sun Sep 17 23:37:16 2000
+++ openssl-engine-0.9.6d-patch/apps/apps.c Mon Jul 15 14:40:57 2002
@@ -757,22 +757,36 @@
void print_name(BIO *out, char *title, X509_NAME *nm, unsigned long lflags)
{
- char buf[256];
- char mline = 0;
- int indent = 0;
- if(title) BIO_puts(out, title);
- if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
- mline = 1;
- indent = 4;
- }
- if(lflags == XN_FLAG_COMPAT) {
- X509_NAME_oneline(nm,buf,256);
- BIO_puts(out,buf);
- BIO_puts(out, "\n");
- } else {
- if(mline) BIO_puts(out, "\n");
- X509_NAME_print_ex(out, nm, indent, lflags);
- BIO_puts(out, "\n");
- }
+ int half_buf_size = 256;
+ char* buf;
+ int len1, len2;
+ char mline = 0;
+ int indent = 0;
+
+ if(title) BIO_puts(out, title);
+ if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
+ mline = 1;
+ indent = 4;
+ }
+ if(lflags == XN_FLAG_COMPAT) {
+ buf = (char*) OPENSSL_malloc(half_buf_size * 2);
+ while(1) {
+ X509_NAME_oneline(nm, buf, half_buf_size);
+ len1 = strlen(buf);
+ X509_NAME_oneline(nm, buf, half_buf_size*2);
+ len2 = strlen(buf);
+ if(len1 == len2)
+ break;
+ half_buf_size *= 2;
+ buf = OPENSSL_realloc(buf, half_buf_size * 2);
+ }
+ BIO_puts(out,buf);
+ OPENSSL_free(buf);
+ BIO_puts(out, "\n");
+ } else {
+ if(mline) BIO_puts(out, "\n");
+ X509_NAME_print_ex(out, nm, indent, lflags);
+ BIO_puts(out, "\n");
+ }
}
Yuval Pemper wrote:
> After further thought, this is a simpler solution:
>
> diff -ur openssl-engine-0.9.6d/apps/apps.c
> openssl-engine-0.9.6d-patch/apps/apps.c
> --- openssl-engine-0.9.6d/apps/apps.c Sun Sep 17 23:37:16 2000
> +++ openssl-engine-0.9.6d-patch/apps/apps.c Mon Jul 15 12:18:48 2002
> @@ -757,22 +757,34 @@
>
> void print_name(BIO *out, char *title, X509_NAME *nm, unsigned long
> lflags)
> {
> - char buf[256];
> - char mline = 0;
> - int indent = 0;
> - if(title) BIO_puts(out, title);
> - if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
> - mline = 1;
> - indent = 4;
> - }
> - if(lflags == XN_FLAG_COMPAT) {
> - X509_NAME_oneline(nm,buf,256);
> - BIO_puts(out,buf);
> - BIO_puts(out, "\n");
> - } else {
> - if(mline) BIO_puts(out, "\n");
> - X509_NAME_print_ex(out, nm, indent, lflags);
> - BIO_puts(out, "\n");
> - }
> + int half_buf_size = 256;
> + char* buf = (char*) OPENSSL_malloc(half_buf_size * 2);
> + int len1, len2;
> + char mline = 0;
> + int indent = 0;
> +
> + if(title) BIO_puts(out, title);
> + if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
> + mline = 1;
> + indent = 4;
> + }
> + if(lflags == XN_FLAG_COMPAT) { + while(1) {
> + X509_NAME_oneline(nm, buf, half_buf_size);
> + len1 = strlen(buf);
> + X509_NAME_oneline(nm, buf, half_buf_size*2);
> + len2 = strlen(buf);
> + if(len1 == len2)
> + break;
> + half_buf_size *= 2;
> + buf = OPENSSL_realloc(buf, half_buf_size * 2);
> + }
> + BIO_puts(out,buf);
> + BIO_puts(out, "\n");
> + } else {
> + if(mline) BIO_puts(out, "\n");
> + X509_NAME_print_ex(out, nm, indent, lflags);
> + BIO_puts(out, "\n");
> + }
> }
>
>
> The fix isn't foolproof, though. I noticed that X509_NAME_oneline
> never returns truncated attribute values. So, if the X509_NAME
> contains an attribute value longer than 256 characters, the wrong name
> may be printed out. There may be a completely different solution to
> this issue, but since I'm not that familiar with the OpenSSL code, I'm
> unaware of it.
>
> Yuval Pemper
> Development Team Leader
> Application Servers Group
> Radware Ltd.
>
> http://www.radware.com
>
>
>
> Yuval Pemper via RT wrote:
>
>> Hi,
>>
>> I tries posting this message before, but it seems to not have gotten
>> through. If it already has, my apologies.
>>
>> I came across a shortcoming in the "openssl x509" command, which caused
>> the subjects of certificates with subjects longer than 255 characters to
>> be truncated when printed out.. The reason is that the print_name
>> function in apps/apps.c uses a buffer of size 256, instead of allocating
>> a dynamic buffer.
>>
>> The patch to this problem is given below. Please note that because I
>> didn't want to change the interface to the X509_NAME_oneline
>> function, I had to resort to a non optimal method of determining the
>> appropriate buffer size.
>>
>> Yuval Pemper
>> Development Team Leader
>> Application Servers Group
>> Radware Ltd.
>>
>> http://www.radware.com
>>
>>
>>
>> diff -ur openssl-engine-0.9.6d/apps/apps.c
>> openssl-engine-0.9.6d-patch/apps/apps.c
>> --- openssl-engine-0.9.6d/apps/apps.c Sun Sep 17 23:37:16 2000
>> +++ openssl-engine-0.9.6d-patch/apps/apps.c Thu Jul 11 19:58:09 2002
>> @@ -757,22 +757,37 @@
>>
>> void print_name(BIO *out, char *title, X509_NAME *nm, unsigned long
>> lflags)
>> {
>> - char buf[256];
>> - char mline = 0;
>> - int indent = 0;
>> - if(title) BIO_puts(out, title);
>> - if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
>> - mline = 1;
>> - indent = 4;
>> - }
>> - if(lflags == XN_FLAG_COMPAT) {
>> - X509_NAME_oneline(nm,buf,256);
>> - BIO_puts(out,buf);
>> - BIO_puts(out, "\n");
>> - } else {
>> - if(mline) BIO_puts(out, "\n");
>> - X509_NAME_print_ex(out, nm, indent, lflags);
>> - BIO_puts(out, "\n");
>> - }
>> + int buf_size = 256;
>> + char* buf = (char*) OPENSSL_malloc(buf_size);
>> + char* buf2 = (char*) OPENSSL_malloc(buf_size*2);
>> + char mline = 0;
>> + int indent = 0;
>> +
>> + *buf = '\0';
>> + *buf2 = '\0';
>> + if(title) BIO_puts(out, title);
>> + if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
>> + mline = 1;
>> + indent = 4;
>> + }
>> + if(lflags == XN_FLAG_COMPAT) {
>> + while(1) {
>> + X509_NAME_oneline(nm,buf,buf_size);
>> + X509_NAME_oneline(nm,buf2,buf_size*2);
>> + if(strlen(buf) == strlen(buf2))
>> + break;
>> + buf_size *= 2;
>> + buf = OPENSSL_realloc(buf, buf_size);
>> + buf2 = OPENSSL_realloc(buf2, buf_size*2);
>> + *buf = '\0';
>> + *buf2 = '\0';
>> + }
>> + BIO_puts(out,buf);
>> + BIO_puts(out, "\n");
>> + } else {
>> + if(mline) BIO_puts(out, "\n");
>> + X509_NAME_print_ex(out, nm, indent, lflags);
>> + BIO_puts(out, "\n");
>> + }
>> }
>> ______________________________________________________________________
>> OpenSSL Project http://www.openssl.org
>> Development Mailing List [EMAIL PROTECTED]
>> Automated List Manager [EMAIL PROTECTED]
>> ______________________________________________________________________
>> OpenSSL Project http://www.openssl.org
>> Development Mailing List [EMAIL PROTECTED]
>> Automated List Manager [EMAIL PROTECTED]
>>
>
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]