--- crypt-gpgme.c | 2 +- lib.c | 11 +++++++++++ lib.h | 1 + pager.c | 2 +- pgp.c | 24 ++++++++++++------------ 5 files changed, 26 insertions(+), 14 deletions(-) --- crypt-gpgme.c +++ crypt-gpgme.c 2019-11-13 13:46:16.512388398 +0000 @@ -2669,7 +2669,7 @@ static void copy_clearsigned (gpgme_data if (armor_header) { - if (buf[0] == '\n') + if (buf[0] == '\n' || (buf[0] == '\r' && buf[1] == '\n')) armor_header = 0; continue; } --- lib.c +++ lib.c 2019-11-13 13:42:00.245189313 +0000 @@ -683,6 +683,17 @@ int mutt_strcmp(const char *a, const cha return strcmp(NONULL(a), NONULL(b)); } +int mutt_strxcmp(const char *a, const char *b) +{ + const size_t xa = strcspn(NONULL(a), "\r\n"); + const size_t xb = strcspn(NONULL(b), "\r\n"); + if (xb != xa) + return -1; + if (!xa) + return 0; + return strncmp(NONULL(a), NONULL(b), (size_t)xa); +} + int mutt_strcasecmp(const char *a, const char *b) { return strcasecmp(NONULL(a), NONULL(b)); --- lib.h +++ lib.h 2019-11-13 13:47:17.399247662 +0000 @@ -201,6 +201,7 @@ int mutt_copy_stream (FILE *, FILE *); int mutt_copy_bytes (FILE *, FILE *, size_t); int mutt_strcasecmp (const char *, const char *); int mutt_strcmp (const char *, const char *); +int mutt_strxcmp (const char *, const char *); int mutt_strncasecmp (const char *, const char *, size_t); int mutt_strncmp (const char *, const char *, size_t); int mutt_strcoll (const char *, const char *); --- pager.c +++ pager.c 2019-11-13 13:48:32.257845120 +0000 @@ -826,7 +826,7 @@ resolve_types (char *buf, char *raw, str lineInfo[n].type = MT_COLOR_NORMAL; else if (check_attachment_marker ((char *) raw) == 0) lineInfo[n].type = MT_COLOR_ATTACHMENT; - else if (mutt_strcmp ("-- \n", buf) == 0 || mutt_strcmp ("-- \r\n", buf) == 0) + else if (mutt_strxcmp ("-- \n", buf) == 0) { i = n + 1; --- pgp.c +++ pgp.c 2019-11-13 13:51:06.746954963 +0000 @@ -373,7 +373,7 @@ static void pgp_copy_clearsigned (FILE * continue; } - if (mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0) + if (mutt_strxcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0) break; if (armor_header) @@ -442,14 +442,14 @@ int pgp_application_pgp_handler (BODY *m could_not_decrypt = 0; decrypt_okay_rc = 0; - if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0) + if (mutt_strxcmp ("MESSAGE-----\n", buf + 15) == 0) needpass = 1; - else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) + else if (mutt_strxcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) { clearsign = 1; needpass = 0; } - else if (!mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15)) + else if (!mutt_strxcmp ("PUBLIC KEY BLOCK-----\n", buf + 15)) { needpass = 0; pgp_keyblock = 1; @@ -482,10 +482,10 @@ int pgp_application_pgp_handler (BODY *m fputs (buf, tmpfp); - if ((needpass && mutt_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0) || + if ((needpass && mutt_strxcmp ("-----END PGP MESSAGE-----\n", buf) == 0) || (!needpass - && (mutt_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0 - || mutt_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n",buf) == 0))) + && (mutt_strxcmp ("-----END PGP SIGNATURE-----\n", buf) == 0 + || mutt_strxcmp ("-----END PGP PUBLIC KEY BLOCK-----\n",buf) == 0))) break; /* remember optional Charset: armor header as defined by RfC4880 */ if (mutt_strncmp ("Charset: ", buf, 9) == 0) @@ -740,11 +740,11 @@ static int pgp_check_traditional_one_bod { if (mutt_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { - if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0) + if (mutt_strxcmp ("MESSAGE-----\n", buf + 15) == 0) enc = 1; - else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) + else if (mutt_strxcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) sgn = 1; - else if (mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) + else if (mutt_strxcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) key = 1; } } @@ -1261,9 +1261,9 @@ BODY *pgp_sign_message (BODY *a) */ while (fgets (buffer, sizeof (buffer) - 1, pgpout) != NULL) { - if (mutt_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0) + if (mutt_strxcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0) fputs ("-----BEGIN PGP SIGNATURE-----\n", fp); - else if (mutt_strcmp("-----END PGP MESSAGE-----\n", buffer) == 0) + else if (mutt_strxcmp("-----END PGP MESSAGE-----\n", buffer) == 0) fputs ("-----END PGP SIGNATURE-----\n", fp); else fputs (buffer, fp);