Ignore BOM in config files

Fixes #2823.

Also remove unnecessary feof check.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2016-03-21 23:34:13 -04:00
parent e31512b1c9
commit 9dd7ea9a7d
2 changed files with 10 additions and 4 deletions

View File

@ -28,6 +28,7 @@
#include "missing.h"
#define UTF8_REPLACEMENT_CHARACTER "\xef\xbf\xbd"
#define UTF8_BYTE_ORDER_MARK "\xef\xbb\xbf"
bool unichar_is_valid(char32_t c);

View File

@ -294,7 +294,7 @@ int config_parse(const char *unit,
_cleanup_free_ char *section = NULL, *continuation = NULL;
_cleanup_fclose_ FILE *ours = NULL;
unsigned line = 0, section_line = 0;
bool section_ignored = false;
bool section_ignored = false, allow_bom = true;
int r;
assert(filename);
@ -314,11 +314,11 @@ int config_parse(const char *unit,
fd_warn_permissions(filename, fileno(f));
while (!feof(f)) {
char l[LINE_MAX], *p, *c = NULL, *e;
for (;;) {
char buf[LINE_MAX], *l, *p, *c = NULL, *e;
bool escaped = false;
if (!fgets(l, sizeof(l), f)) {
if (!fgets(buf, sizeof buf, f)) {
if (feof(f))
break;
@ -326,6 +326,11 @@ int config_parse(const char *unit,
return -errno;
}
l = buf;
if (allow_bom && startswith(l, UTF8_BYTE_ORDER_MARK))
l += strlen(UTF8_BYTE_ORDER_MARK);
allow_bom = false;
truncate_nl(l);
if (continuation) {