From 7cdd2620e77300226b5fd478db58a2201f72b668 Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Sun, 27 Dec 2015 05:47:47 +0000
Subject: [PATCH] IO#readpartial rejects bad args

Sometimes a sleepy developer will want to swap read_nonblock
for readpartial forget to remove "exception: false"

* io.c (io_getpartial): remove unused kwarg from template
* test/ruby/test_io.rb (test_readpartial_bad_args): new
---
 ChangeLog            |  5 +++++
 io.c                 |  2 +-
 test/ruby/test_io.rb | 11 +++++++++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 17d2aed..80bb12e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Dec 27 14:49:52 2015  Eric Wong  <e@80x24.org>
+
+	* io.c (io_getpartial): remove unused kwarg from template
+	* test/ruby/test_io.rb (test_readpartial_bad_args): new
+
 Sun Dec 27 11:47:46 2015  Kuniaki IGARASHI  <igaiga@gmail.com>
 
 	* test/ruby/test_string.rb (test_insert): The test cases are
diff --git a/io.c b/io.c
index 2bf7cd7..5c8a66d 100644
--- a/io.c
+++ b/io.c
@@ -2506,7 +2506,7 @@ io_getpartial(int argc, VALUE *argv, VALUE io, VALUE opts, int nonblock)
     long n, len;
     struct read_internal_arg arg;
 
-    rb_scan_args(argc, argv, "11:", &length, &str, NULL);
+    rb_scan_args(argc, argv, "11", &length, &str);
 
     if ((len = NUM2LONG(length)) < 0) {
 	rb_raise(rb_eArgError, "negative length %ld given", len);
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 766804e..2b79ace 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -3186,6 +3186,17 @@ def test_readpartial_unlocktmp_ensure
     }
   end
 
+  def test_readpartial_bad_args
+    IO.pipe do |r, w|
+      w.write '.'
+      buf = String.new
+      assert_raise(ArgumentError) { r.readpartial(1, buf, exception: false) }
+      assert_raise(TypeError) { r.readpartial(1, exception: false) }
+      assert_equal [[r],[],[]], IO.select([r], nil, nil, 1)
+      assert_equal '.', r.readpartial(1)
+    end
+  end
+
   def test_sysread_unlocktmp_ensure
     bug8669 = '[ruby-core:56121] [Bug #8669]'
 
-- 
EW

