[gvfs] Fixed parsing of CMU/VMS-IP FTP style listing (upstream)
- From: Benjamin Otte <otte src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gvfs] Fixed parsing of CMU/VMS-IP FTP style listing (upstream)
- Date: Fri, 13 Nov 2009 21:54:35 +0000 (UTC)
commit 24aa2ea08693969d66b263ba2aa9289056b23483
Author: Benjamin Otte <otte gnome org>
Date: Fri Nov 13 22:44:50 2009 +0100
Fixed parsing of CMU/VMS-IP FTP style listing (upstream)
upstream references:
http://bugzilla.mozilla.org/show_bug.cgi?id=515583
http://hg.mozilla.org/mozilla-central/rev/98330c8132a9
http://hg.mozilla.org/mozilla-central/rev/cade5b705114
daemon/ParseFTPList.c | 25 +++++++++++++++++++------
1 files changed, 19 insertions(+), 6 deletions(-)
---
diff --git a/daemon/ParseFTPList.c b/daemon/ParseFTPList.c
index 9d4c182..2d2ce0f 100644
--- a/daemon/ParseFTPList.c
+++ b/daemon/ParseFTPList.c
@@ -44,6 +44,13 @@
/* ==================================================================== */
+static inline int ParsingFailed(struct list_state *state)
+{
+ if (state->parsed_one || state->lstyle) /* junk if we fail to parse */
+ return '?'; /* this time but had previously parsed successfully */
+ return '"'; /* its part of a comment or error message */
+}
+
int ParseFTPList(const char *line, struct list_state *state,
struct list_result *result )
{
@@ -122,6 +129,9 @@ int ParseFTPList(const char *line, struct list_state *state,
}
}
+ if (!numtoks)
+ return ParsingFailed(state);
+
linelen_sans_wsp = &(tokens[numtoks-1][toklen[numtoks-1]]) - tokens[0];
if (numtoks == (sizeof(tokens)/sizeof(tokens[0])) )
{
@@ -355,11 +365,16 @@ int ParseFTPList(const char *line, struct list_state *state,
pos++;
p++;
}
- if (lstyle && pos < (toklen[0]-1) && *p == ']')
+ if (lstyle && pos < (toklen[0]-1))
{
+ /* ']' was found and there is at least one character after it */
+ g_assert (*p == ']');
pos++;
p++;
tokmarker = pos; /* length of leading "[DIR1.DIR2.etc]" */
+ } else {
+ /* not a CMU style listing */
+ lstyle = 0;
}
}
while (lstyle && pos < toklen[0] && *p != ';')
@@ -386,7 +401,7 @@ int ParseFTPList(const char *line, struct list_state *state,
pos -= tokmarker; /* => fnlength sans "[DIR1.DIR2.etc]" */
p = &(tokens[0][tokmarker]); /* offset of basename */
- if (!lstyle || pos > 80) /* VMS filenames can't be longer than that */
+ if (!lstyle || pos == 0 || pos > 80) /* VMS filenames can't be longer than that */
{
lstyle = 0;
}
@@ -1682,9 +1697,7 @@ int ParseFTPList(const char *line, struct list_state *state,
} /* if (linelen > 0) */
- if (state->parsed_one || state->lstyle) /* junk if we fail to parse */
- return '?'; /* this time but had previously parsed successfully */
- return '"'; /* its part of a comment or error message */
+ return ParsingFailed(state);
}
/* ==================================================================== */
@@ -1703,7 +1716,7 @@ static int do_it(FILE *outfile,
char *p;
int rc;
- rc = ParseFTPLIST( line, state, &result );
+ rc = ParseFTPList( line, state, &result );
if (!outfile)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]