summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Matuska <martin@matuska.org>2018-11-25 04:14:09 +0100
committerMartin Matuska <martin@matuska.org>2018-11-25 05:28:26 +0100
commita6b096b596ec7780a0aa3b1f3d29f6aa22fe106e (patch)
treedea4304edb924b2aa18c5091f69a61aaa122eb88
parent0e416f2fe757ad6841dbb3386a17d88b5c9f5533 (diff)
downloadlibarchive-a6b096b596ec7780a0aa3b1f3d29f6aa22fe106e.tar.gz
Allow in-entry comments in SCHILY.acl.*
Fixes #1096
-rw-r--r--libarchive/archive_acl.c51
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')