From 197a9d4b5eaabb1feb30dfc4db26570858634d4e Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Tue, 15 Feb 2022 10:39:38 -0500 Subject: [PATCH] use exact integer parsing for znc.in/playback --- irc/misc_test.go | 5 +++++ irc/znc.go | 13 ++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/irc/misc_test.go b/irc/misc_test.go index 904832f1..09dfca02 100644 --- a/irc/misc_test.go +++ b/irc/misc_test.go @@ -12,6 +12,11 @@ func TestZncTimestampParser(t *testing.T) { assertEqual(zncWireTimeToTime("1558338348.988"), time.Unix(1558338348, 988000000).UTC(), t) assertEqual(zncWireTimeToTime("1558338348.9"), time.Unix(1558338348, 900000000).UTC(), t) assertEqual(zncWireTimeToTime("1558338348"), time.Unix(1558338348, 0).UTC(), t) + assertEqual(zncWireTimeToTime("1558338348.99999999999999999999999999999"), time.Unix(1558338348, 999999999).UTC(), t) + assertEqual(zncWireTimeToTime("1558338348.999999999111111111"), time.Unix(1558338348, 999999999).UTC(), t) + assertEqual(zncWireTimeToTime("1558338348.999999991111111111"), time.Unix(1558338348, 999999991).UTC(), t) assertEqual(zncWireTimeToTime(".988"), time.Unix(0, 988000000).UTC(), t) + assertEqual(zncWireTimeToTime("0"), time.Unix(0, 0).UTC(), t) assertEqual(zncWireTimeToTime("garbage"), time.Unix(0, 0).UTC(), t) + assertEqual(zncWireTimeToTime(""), time.Unix(0, 0).UTC(), t) } diff --git a/irc/znc.go b/irc/znc.go index 11fe012c..dcc29155 100644 --- a/irc/znc.go +++ b/irc/znc.go @@ -51,11 +51,18 @@ func zncWireTimeToTime(str string) (result time.Time) { secondsPortion = str } else { secondsPortion = str[:dot] - fracPortion = str[dot:] + fracPortion = str[dot+1:] } seconds, _ := strconv.ParseInt(secondsPortion, 10, 64) - fraction, _ := strconv.ParseFloat(fracPortion, 64) - return time.Unix(seconds, int64(fraction*1000000000)).UTC() + // truncate to nanosecond resolution if necessary + if len(fracPortion) > 9 { + fracPortion = fracPortion[:9] + } + fracSeconds, _ := strconv.ParseInt(fracPortion, 10, 64) + for i := 0; i < (9 - len(fracPortion)); i++ { + fracSeconds *= 10 + } + return time.Unix(seconds, fracSeconds).UTC() } func timeToZncWireTime(t time.Time) (result string) {