Skip BOM when reading the config file
authorDmitry Belyavskiy <beldmit@gmail.com>
Wed, 13 Jan 2021 07:51:39 +0000 (08:51 +0100)
committerDmitry Belyavskiy <beldmit@gmail.com>
Thu, 14 Jan 2021 10:20:10 +0000 (11:20 +0100)
Fixes #13840

Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/13857)

crypto/conf/conf_def.c

index a7f5677a263acdb0874f0fa597047a49f681d068..99063eaf68c3eb1c0b84b2f10f796bd2f98408c0 100644 (file)
@@ -194,6 +194,7 @@ static int def_load_bio(CONF *conf, BIO *in, long *line)
     BUF_MEM *buff = NULL;
     char *s, *p, *end;
     int again;
+    int first_call = 1;
     long eline = 0;
     char btmp[DECIMAL_SIZE(eline) + 1];
     CONF_VALUE *v = NULL, *tv;
@@ -243,6 +244,19 @@ static int def_load_bio(CONF *conf, BIO *in, long *line)
             goto err;
         p[CONFBUFSIZE - 1] = '\0';
         ii = i = strlen(p);
+        if (first_call) {
+            /* Other BOMs imply unsupported multibyte encoding,
+             * so don't strip them and let the error raise */
+            const unsigned char utf8_bom[3] = {0xEF, 0xBB, 0xBF};
+
+            if (i >= 3 && memcmp(p, utf8_bom, 3) == 0) {
+                memmove(p, p + 3, i - 3);
+                p[i - 3] = 0;
+                i -= 3;
+                ii -= 3;
+            }
+            first_call = 0;
+        }
         if (i == 0 && !again) {
             /* the currently processed BIO is NULL or at EOF */
             BIO *parent;