From aae31783820221e7a50ae064b9ce54870980b5b4 Mon Sep 17 00:00:00 2001 From: nick evans Date: Fri, 8 May 2026 17:26:47 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=B7=20Allow=2064-bit=20Integer=20argum?= =?UTF-8?q?ents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, integer arguments had to be 32-bit unsigned, and a special case exception was made for the number in a `["CHANGEDSINCE", number]` array. But several other command arguments can be larger: `UNCHANGEDSINCE`, quota `resource-limit`, and `tagged-ext-simple`. So, generic Integer arguments should allow 64 bit numbers. We can add specific argument validation where it makes sense to do so. --- lib/net/imap/command_data.rb | 15 ++++++++------- test/net/imap/test_imap.rb | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/net/imap/command_data.rb b/lib/net/imap/command_data.rb index 76dc1d30..2022b21e 100644 --- a/lib/net/imap/command_data.rb +++ b/lib/net/imap/command_data.rb @@ -16,14 +16,15 @@ def validate_data(data) when nil when String when Integer - NumValidator.ensure_number(data) + # Covers modseq-valzer, which is the largest valid IMAP integer + if data.negative? + raise DataFormatError, "Integer argument must be unsigned: #{data}" + elsif 0xffff_ffff_ffff_ffff < data + raise DataFormatError, "Integer argument must fit in 64 bits: #{data}" + end when Array - if data[0] == 'CHANGEDSINCE' - NumValidator.ensure_mod_sequence_value(data[1]) - else - data.each do |i| - validate_data(i) - end + data.each do |i| + validate_data(i) end when Time, Date, DateTime when Symbol diff --git a/test/net/imap/test_imap.rb b/test/net/imap/test_imap.rb index 11e9fc32..f43bdcc7 100644 --- a/test/net/imap/test_imap.rb +++ b/test/net/imap/test_imap.rb @@ -634,7 +634,7 @@ def test_default_port assert_equal(993, Net::IMAP.default_imaps_port) end - def test_send_invalid_number + def test_send_integer with_fake_server do |server, imap| server.on "TEST", &:done_ok @@ -650,10 +650,22 @@ def test_send_invalid_number imap.__send__(:send_command, "TEST", 2**32 - 1) assert_equal (2**32 - 1).to_s, server.commands.pop.args + imap.__send__(:send_command, "TEST", 2**32) + assert_equal (2**32).to_s, server.commands.pop.args + + imap.__send__(:send_command, "TEST", 2**64 - 1) + assert_equal (2**64 - 1).to_s, server.commands.pop.args + assert_raise(Net::IMAP::DataFormatError) do - imap.__send__(:send_command, "TEST", 2**32) + imap.__send__(:send_command, "TEST", 2**64) end assert_empty server.commands + end + end + + def test_send_sequence_set + with_fake_server do |server, imap| + server.on "TEST", &:done_ok # SequenceSet numbers may be non-zero uint3, and -1 is translated to * imap.__send__(:send_command, "TEST", Net::IMAP::SequenceSet.new(-1))