Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Mention new SSH_* vars.
[rsync/rsync.git]
/
lib
/
wildmatch.c
diff --git
a/lib/wildmatch.c
b/lib/wildmatch.c
index
8f7a523
..
8de33c3
100644
(file)
--- a/
lib/wildmatch.c
+++ b/
lib/wildmatch.c
@@
-22,7
+22,7
@@
#define CC_EQ(class, len, litmatch) ((len) == sizeof (litmatch)-1 \
&& *(class) == *(litmatch) \
#define CC_EQ(class, len, litmatch) ((len) == sizeof (litmatch)-1 \
&& *(class) == *(litmatch) \
- && strncmp(class, litmatch, len) == 0)
+ && strncmp(
(char*)
class, litmatch, len) == 0)
#if defined STDC_HEADERS || !defined isascii
# define ISASCII(c) 1
#if defined STDC_HEADERS || !defined isascii
# define ISASCII(c) 1
@@
-94,7
+94,7
@@
static int domatch(const unsigned char *p, const unsigned char *text)
if (*p == '\0') {
/* Trailing "**" matches everything. Trailing "*" matches
* only if there are no more slash characters. */
if (*p == '\0') {
/* Trailing "**" matches everything. Trailing "*" matches
* only if there are no more slash characters. */
- return special? TRUE : strchr(text, '/') == NULL;
+ return special? TRUE : strchr(
(char*)
text, '/') == NULL;
}
for ( ; *text; text++) {
if ((matched = domatch(p, text)) != FALSE) {
}
for ( ; *text; text++) {
if ((matched = domatch(p, text)) != FALSE) {
@@
-141,12
+141,20
@@
static int domatch(const unsigned char *p, const unsigned char *text)
ch = 0; /* This makes "prev" get set to 0. */
}
else if (ch == '[' && p[1] == ':') {
ch = 0; /* This makes "prev" get set to 0. */
}
else if (ch == '[' && p[1] == ':') {
-
unsigned const
char *s = p += 2;
+
const unsigned
char *s = p += 2;
int i;
int i;
- while ((ch = *p) &&
(ch != ':' || p[1] != ']')
) p++;
+ while ((ch = *p) &&
ch != ']'
) p++;
if (!ch)
return ABORT_ALL;
if (!ch)
return ABORT_ALL;
- i = p - s;
+ i = p - s - 1;
+ if (i < 0 || p[-1] != ':') {
+ /* Didn't find ":]", so treat like a normal set. */
+ p = s - 2;
+ ch = '[';
+ if (*text == ch)
+ matched = TRUE;
+ continue;
+ }
if (CC_EQ(s,i, "alnum")) {
if (ISALNUM(*text))
matched = TRUE;
if (CC_EQ(s,i, "alnum")) {
if (ISALNUM(*text))
matched = TRUE;
@@
-197,13
+205,12
@@
static int domatch(const unsigned char *p, const unsigned char *text)
}
else /* malformed [:class:] string */
return ABORT_ALL;
}
else /* malformed [:class:] string */
return ABORT_ALL;
- p++;
ch = 0; /* This makes "prev" get set to 0. */
}
else if (*text == ch)
matched = TRUE;
} while (prev = ch, (ch = *++p) != ']');
ch = 0; /* This makes "prev" get set to 0. */
}
else if (*text == ch)
matched = TRUE;
} while (prev = ch, (ch = *++p) != ']');
- if (matched == special)
+ if (matched == special
|| *text == '/'
)
return FALSE;
continue;
}
return FALSE;
continue;
}