summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/net/ftp.rb5
-rw-r--r--test/net/ftp/test_ftp.rb17
-rw-r--r--version.h4
3 files changed, 22 insertions, 4 deletions
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 88e8655c1c..5e3e181c16 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -1045,10 +1045,11 @@ module Net
TIME_PARSER = ->(value, local = false) {
unless /\A(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})
(?<hour>\d{2})(?<min>\d{2})(?<sec>\d{2})
- (?:\.(?<fractions>\d+))?/x =~ value
+ (?:\.(?<fractions>\d{1,17}))?/x =~ value
+ value = value[0, 97] + "..." if value.size > 100
raise FTPProtoError, "invalid time-val: #{value}"
end
- usec = fractions.to_i * 10 ** (6 - fractions.to_s.size)
+ usec = ".#{fractions}".to_r * 1_000_000 if fractions
Time.public_send(local ? :local : :utc, year, month, day, hour, min, sec, usec)
}
FACT_PARSERS = Hash.new(CASE_DEPENDENT_PARSER)
diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb
index 023e79435a..318e4c8856 100644
--- a/test/net/ftp/test_ftp.rb
+++ b/test/net/ftp/test_ftp.rb
@@ -2474,6 +2474,23 @@ EOF
end
end
+ def test_time_parser
+ s = "20371231000000"
+ assert_equal(Time.utc(2037, 12, 31, 0, 0, 0),
+ Net::FTP::TIME_PARSER[s])
+ s = "20371231000000.123456"
+ assert_equal(Time.utc(2037, 12, 31, 0, 0, 0, 123456),
+ Net::FTP::TIME_PARSER[s])
+ s = "20371231000000." + "9" * 999999
+ assert_equal(Time.utc(2037, 12, 31, 0, 0, 0,
+ 99999999999999999r / 100000000000),
+ Net::FTP::TIME_PARSER[s])
+ e = assert_raise(Net::FTPProtoError) {
+ Net::FTP::TIME_PARSER["x" * 999999]
+ }
+ assert_equal("invalid time-val: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...", e.message)
+ end
+
private
def create_ftp_server(sleep_time = nil)
diff --git a/version.h b/version.h
index f4cfe79521..49bbef749c 100644
--- a/version.h
+++ b/version.h
@@ -12,11 +12,11 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 2
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 72
+#define RUBY_PATCHLEVEL 73
#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 4
-#define RUBY_RELEASE_DAY 24
+#define RUBY_RELEASE_DAY 29
#include "ruby/version.h"