diff options
author | Martin Matuska <martin@matuska.org> | 2018-11-25 04:14:09 +0100 |
---|---|---|
committer | Martin Matuska <martin@matuska.org> | 2018-11-25 05:28:26 +0100 |
commit | a6b096b596ec7780a0aa3b1f3d29f6aa22fe106e (patch) | |
tree | dea4304edb924b2aa18c5091f69a61aaa122eb88 | |
parent | 0e416f2fe757ad6841dbb3386a17d88b5c9f5533 (diff) | |
download | libarchive-a6b096b596ec7780a0aa3b1f3d29f6aa22fe106e.tar.gz |
Allow in-entry comments in SCHILY.acl.*
Fixes #1096
-rw-r--r-- | libarchive/archive_acl.c | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/libarchive/archive_acl.c b/libarchive/archive_acl.c index 6ce7ab66..512beee1 100644 --- a/libarchive/archive_acl.c +++ b/libarchive/archive_acl.c @@ -1585,17 +1585,29 @@ next_field_w(const wchar_t **wp, const wchar_t **start, /* Scan for the separator. */ while (**wp != L'\0' && **wp != L',' && **wp != L':' && - **wp != L'\n') { + **wp != L'\n' && **wp != L'#') { (*wp)++; } *sep = **wp; - /* Trim trailing whitespace to locate end of field. */ - *end = *wp - 1; - while (**end == L' ' || **end == L'\t' || **end == L'\n') { - (*end)--; + /* Locate end of field, trim trailing whitespace if necessary */ + if (*wp == *start) { + *end = *wp; + } else { + *end = *wp - 1; + while (**end == L' ' || **end == L'\t' || **end == L'\n') { + (*end)--; + } + (*end)++; + } + + /* Handle in-field comments */ + if (*sep == L'#') { + while (**wp != L'\0' && **wp != L',' && **wp != L'\n') { + (*wp)++; + } + *sep = **wp; } - (*end)++; /* Adjust scanner location. */ if (**wp != L'\0') @@ -1646,7 +1658,7 @@ archive_acl_from_text_l(struct archive_acl *acl, const char *text, ret = ARCHIVE_OK; types = 0; - while (text != NULL && *text != '\0') { + while (text != NULL && *text != '\0') { /* * Parse the fields out of the next entry, * advance 'text' to start of next entry. @@ -2057,23 +2069,30 @@ next_field(const char **p, const char **start, *start = *p; /* Scan for the separator. */ - while (**p != '\0' && **p != ',' && **p != ':' && **p != '\n') { + while (**p != '\0' && **p != ',' && **p != ':' && **p != '\n' && + **p != '#') { (*p)++; } *sep = **p; - /* If the field is only whitespace, bail out now. */ - if (**p == '\0') { + /* Locate end of field, trim trailing whitespace if necessary */ + if (*p == *start) { *end = *p; - return; + } else { + *end = *p - 1; + while (**end == ' ' || **end == '\t' || **end == '\n') { + (*end)--; + } + (*end)++; } - /* Trim trailing whitespace to locate end of field. */ - *end = *p - 1; - while (**end == ' ' || **end == '\t' || **end == '\n') { - (*end)--; + /* Handle in-field comments */ + if (*sep == '#') { + while (**p != '\0' && **p != ',' && **p != '\n') { + (*p)++; + } + *sep = **p; } - (*end)++; /* Adjust scanner location. */ if (**p != '\0') |