[PATCH 1/3] Be even more permissive in our date parsing logic

Linus Torvalds torvalds at linux-foundation.org
Mon Jan 28 21:21:09 PST 2013


From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Mon, 28 Jan 2013 21:07:52 -0800
Subject: [PATCH 1/3] Be even more permissive in our date parsing logic

Not that we aren't already insanely permissive in parsing just about any
random noise that could _possibly_ be construed as xml and turn it into
a dive, this makes us even laxer.

If somebody wants to have a <date> tag with both date and time, why the
heck not? It's fine.  And if it has just the date, that's fine too.  And
the date can be in any of several formats.  We really don't care, the
more permissive, the better.

We strive to always write beautiful xml, but let's face it, not
everybody else does.  If we can turn random line noise into a dive, we
should do so.

Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
---
 parse-xml.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/parse-xml.c b/parse-xml.c
index 5061227e35e0..e2f84f073a81 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -168,25 +168,26 @@ static enum import_source {
 static void divedate(char *buffer, void *_when)
 {
 	int d,m,y;
+	int hh,mm,ss;
 	timestamp_t *when = _when;
-	int success;
 
-	success = cur_tm.tm_sec | cur_tm.tm_min | cur_tm.tm_hour;
-	if (sscanf(buffer, "%d.%d.%d", &d, &m, &y) == 3) {
-		cur_tm.tm_year = y;
-		cur_tm.tm_mon = m-1;
-		cur_tm.tm_mday = d;
-	} else if (sscanf(buffer, "%d-%d-%d", &y, &m, &d) == 3) {
-		cur_tm.tm_year = y;
-		cur_tm.tm_mon = m-1;
-		cur_tm.tm_mday = d;
+	hh = 0; mm = 0; ss = 0;
+	if (sscanf(buffer, "%d.%d.%d %d:%d:%d", &d, &m, &y, &hh, &mm, &ss) >= 3) {
+		/* This is ok, and we got at least the date */
+	} else if (sscanf(buffer, "%d-%d-%d %d:%d:%d", &y, &m, &d, &hh, &mm, &ss) >= 3) {
+		/* This is also ok */
 	} else {
 		fprintf(stderr, "Unable to parse date '%s'\n", buffer);
-		success = 0;
+		return;
 	}
+	cur_tm.tm_year = y;
+	cur_tm.tm_mon = m-1;
+	cur_tm.tm_mday = d;
+	cur_tm.tm_hour = hh;
+	cur_tm.tm_min = mm;
+	cur_tm.tm_sec = ss;
 
-	if (success)
-		*when = utc_mktime(&cur_tm);
+	*when = utc_mktime(&cur_tm);
 }
 
 static void divetime(char *buffer, void *_when)
@@ -198,8 +199,7 @@ static void divetime(char *buffer, void *_when)
 		cur_tm.tm_hour = h;
 		cur_tm.tm_min = m;
 		cur_tm.tm_sec = s;
-		if (cur_tm.tm_year)
-			*when = utc_mktime(&cur_tm);
+		*when = utc_mktime(&cur_tm);
 	}
 }
 
-- 
1.8.1.2.422.g08c0e7f



More information about the subsurface mailing list