diff options
author | Werner Koch <[email protected]> | 2016-12-08 19:25:48 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2016-12-08 19:25:48 +0000 |
commit | 5c7d58222834793629a30248e72b6ea96e832dc4 (patch) | |
tree | b8a2ff5ee8ad7b2221b02a20f660220c1454117e /common/argparse.c | |
parent | Fix 2 compiler warnings. (diff) | |
download | gnupg-5c7d58222834793629a30248e72b6ea96e832dc4.tar.gz gnupg-5c7d58222834793629a30248e72b6ea96e832dc4.zip |
common: Skip the Byte Order Mark in conf files.
* common/argparse.c (optfile_parse): Detect and skip the UTF-8 BOM.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | common/argparse.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/common/argparse.c b/common/argparse.c index 240fdce30..dce725af9 100644 --- a/common/argparse.c +++ b/common/argparse.c @@ -568,17 +568,35 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, char *buffer = NULL; size_t buflen = 0; int in_alias=0; + int unread_buf[3]; /* We use an int so that we can store EOF. */ + int unread_buf_count = 0; if (!fp) /* Divert to to arg_parse() in this case. */ return arg_parse (arg, opts); initialize (arg, filename, lineno); + /* If the LINENO is zero we assume that we are at the start of a + * file and we skip over a possible Byte Order Mark. */ + if (!*lineno) + { + unread_buf[0] = getc (fp); + unread_buf[1] = getc (fp); + unread_buf[2] = getc (fp); + if (unread_buf[0] != 0xef + || unread_buf[1] != 0xbb + || unread_buf[2] != 0xbf) + unread_buf_count = 3; + } + /* Find the next keyword. */ state = i = 0; for (;;) { - c = getc (fp); + if (unread_buf_count) + c = unread_buf[3 - unread_buf_count--]; + else + c = getc (fp); if (c == '\n' || c== EOF ) { if ( c != EOF ) |