aboutsummaryrefslogtreecommitdiffstats
path: root/g10/armor.c
diff options
context:
space:
mode:
authorNeal H. Walfield <[email protected]>2016-02-14 15:00:10 +0000
committerNeal H. Walfield <[email protected]>2016-02-16 12:09:32 +0000
commit2f02ed75a9671a7aae36968d5a1618f71b491325 (patch)
treede86b9250a9001db377d086a2460068e5e13e8b4 /g10/armor.c
parentdoc: Add a gnupg-module-overview picture. (diff)
downloadgnupg-2f02ed75a9671a7aae36968d5a1618f71b491325.tar.gz
gnupg-2f02ed75a9671a7aae36968d5a1618f71b491325.zip
gpg: Make ASCII armor decoding more robust to encoding errors.
* g10/armor.c (radix64_read): If the = is followed by the string "3D", check if the following four characters are valid radix 64 and are followed by a new line. If so, warn and ignore the '3D'. -- Signed-off-by: Neal H. Walfield <[email protected]> GnuPG-bug-id: 2250
Diffstat (limited to 'g10/armor.c')
-rw-r--r--g10/armor.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/g10/armor.c b/g10/armor.c
index 55ee5d328..e34518e0b 100644
--- a/g10/armor.c
+++ b/g10/armor.c
@@ -796,6 +796,24 @@ radix64_read( armor_filter_context_t *afx, IOBUF a, size_t *retn,
}
}
+ /* Occasionally a bug MTA will leave the = escaped as
+ =3D. If the 4 characters following that are valid
+ Radix64 characters and they are following by a new
+ line, assume that this is the case and skip the
+ 3D. */
+ if (afx->buffer_pos + 6 < afx->buffer_len
+ && afx->buffer[afx->buffer_pos + 0] == '3'
+ && afx->buffer[afx->buffer_pos + 1] == 'D'
+ && asctobin[afx->buffer[afx->buffer_pos + 2]] != 255
+ && asctobin[afx->buffer[afx->buffer_pos + 3]] != 255
+ && asctobin[afx->buffer[afx->buffer_pos + 4]] != 255
+ && asctobin[afx->buffer[afx->buffer_pos + 5]] != 255
+ && afx->buffer[afx->buffer_pos + 6] == '\n')
+ {
+ afx->buffer_pos += 2;
+ afx->qp_detected = 1;
+ }
+
if (!n)
onlypad = 1;