#3899: mutt_ssl's interactive_check_cert() has several issues
-----------------------+----------------------
Reporter: kevin8t8 | Owner: mutt-dev
Type: defect | Status: closed
Priority: major | Milestone:
Component: crypto | Version:
Resolution: fixed | Keywords:
-----------------------+----------------------
Comment (by derekmartin):
Replying to [comment:17 vinc17]:
> That would be OK, but the code needs to check that the initializer has
enough elements, as the C standard allows you to give fewer elements than
the real size (the other ones are initialized to 0).
The macro version has the opposite problem: You can make the array too
small and it will "work" but it will be incomplete. Ultimately, a bug is
a bug, and you just have to write the code correctly. The compiler and
coding conventions can only do so much for you.
Besides, like I said, the better solution is to forgo both the array and
the struct replacement, and just write a helper function that does the
sprintf. It is more explicit and can't be wrong.
Add this helper function:
{{{
static void sprintf_cert_menu(MUTTMENU *menu, X509_NAME *n, int *row)
{
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_commonName);
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_pkcs9_emailAddress);
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_organizationName);
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_organizationalUnitName);
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_localityName);
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_stateOrProvince);
snprintf(menu->dialog[*row++], SHORT_STRING, " %s", x509_get_part(n,
NID_countryName);
}
}}}
Then remove the int array part[], and replace both occurances of the loop
structure to snprintf() the parts with a call to the helper:
{{{
sprintf_cert_menu(menu, x509_subject, &row);
[...]
sprintf_cert_menu(menu, x509_issuer, &row);
}}}
Done and done. Less code, more explicit, no need for any macro
contortions, can't be wrong (and still compile). I'm only unsure of
whether or not the x509 functions can fail, as I'm unable to find man
pages for x509_get_*_name() functions...
--
Ticket URL: <https://dev.mutt.org/trac/ticket/3899#comment:18>
Mutt <http://www.mutt.org/>
The Mutt mail user agent