aboutsummaryrefslogtreecommitdiffstats
path: root/common/argparse.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-12-08 19:25:48 +0000
committerWerner Koch <[email protected]>2016-12-08 19:25:48 +0000
commit5c7d58222834793629a30248e72b6ea96e832dc4 (patch)
treeb8a2ff5ee8ad7b2221b02a20f660220c1454117e /common/argparse.c
parentFix 2 compiler warnings. (diff)
downloadgnupg-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.c20
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 )