From eb322a9716a74dbbd6e1b45652395bda24533da5 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 28 Jan 2023 21:59:54 +0900 Subject: [PATCH] [Bug #19389] Fix chomping with longer separator --- ext/stringio/stringio.c | 5 +++-- test/stringio/test_stringio.rb | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index bc2d7a8..52a7072 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -1340,8 +1340,9 @@ strio_getline(struct getline_arg *arg, struct StringIO *ptr) str = strio_substr(ptr, ptr->pos, e - s - w, enc); } else { - if (n < e - s) { - if (e - s < 1024) { + if (n < e - s + arg->chomp) { + /* unless chomping, RS at the end does not matter */ + if (e - s < 1024 || n == e - s) { for (p = s; p + n <= e; ++p) { if (MEMCMP(p, RSTRING_PTR(str), char, n) == 0) { e = p + n; diff --git a/test/stringio/test_stringio.rb b/test/stringio/test_stringio.rb index 34c4748..fd9974c 100644 --- a/test/stringio/test_stringio.rb +++ b/test/stringio/test_stringio.rb @@ -99,6 +99,8 @@ def test_gets_chomp assert_equal("def\n", stringio.gets("", chomp: true)) assert_string("", Encoding::UTF_8, StringIO.new("\n").gets(chomp: true)) + + assert_equal("", StringIO.new("ab").gets("ab", chomp: true)) end def test_gets_chomp_eol