From b7744be20806a9cc3697f0806eb452012e7180be Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Mon, 16 Dec 2019 23:28:47 +0100
Subject: [PATCH] song/Filter: try ParseISO8601() first

Prepare for allowing ISO8601 time stamps without delimiters, such as
20191216, and prevent them from being interpreted as numeric UNIX time
stamps.
---
 src/song/Filter.cxx | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/song/Filter.cxx b/src/song/Filter.cxx
index 9c0583845..e369c8c93 100644
--- a/src/song/Filter.cxx
+++ b/src/song/Filter.cxx
@@ -113,14 +113,19 @@ ParseTimeStamp(const char *s)
 {
 	assert(s != nullptr);
 
-	char *endptr;
-	unsigned long long value = strtoull(s, &endptr, 10);
-	if (*endptr == 0 && endptr > s)
-		/* it's an integral UNIX time stamp */
-		return std::chrono::system_clock::from_time_t((time_t)value);
+	try {
+		/* try ISO 8601 */
+		return ParseISO8601(s).first;
+	} catch (...) {
+		char *endptr;
+		unsigned long long value = strtoull(s, &endptr, 10);
+		if (*endptr == 0 && endptr > s)
+			/* it's an integral UNIX time stamp */
+			return std::chrono::system_clock::from_time_t((time_t)value);
 
-	/* try ISO 8601 */
-	return ParseISO8601(s).first;
+		/* rethrow the ParseISO8601() error */
+		throw;
+	}
 }
 
 static constexpr bool