#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