From: Iván Matellanes Subject: [1/6] msvcirt: Don't return negative values in in_avail and out_waiting. Message-Id: <1476878456-8303-1-git-send-email-matellanesivan@gmail.com> Date: Wed, 19 Oct 2016 14:00:51 +0200 Signed-off-by: Iván Matellanes --- dlls/msvcirt/msvcirt.c | 4 ++-- dlls/msvcirt/tests/msvcirt.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index 8dfe988..e9103a9 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -556,7 +556,7 @@ DEFINE_THISCALL_WRAPPER(streambuf_in_avail, 4) int __thiscall streambuf_in_avail(const streambuf *this) { TRACE("(%p)\n", this); - return this->egptr - this->gptr; + return (this->egptr - this->gptr > 0) ? this->egptr - this->gptr : 0; } /* ?out_waiting@streambuf@@QBEHXZ */ @@ -565,7 +565,7 @@ DEFINE_THISCALL_WRAPPER(streambuf_out_waiting, 4) int __thiscall streambuf_out_waiting(const streambuf *this) { TRACE("(%p)\n", this); - return this->pptr - this->pbase; + return (this->pptr - this->pbase > 0) ? this->pptr - this->pbase : 0; } /* Unexported */ diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c index 113bf0e..7f25cd7 100644 --- a/dlls/msvcirt/tests/msvcirt.c +++ b/dlls/msvcirt/tests/msvcirt.c @@ -200,7 +200,9 @@ static int (*__thiscall p_streambuf_allocate)(streambuf*); static void (*__thiscall p_streambuf_clrclock)(streambuf*); static int (*__thiscall p_streambuf_doallocate)(streambuf*); static void (*__thiscall p_streambuf_gbump)(streambuf*, int); +static int (*__thiscall p_streambuf_in_avail)(const streambuf*); static void (*__thiscall p_streambuf_lock)(streambuf*); +static int (*__thiscall p_streambuf_out_waiting)(const streambuf*); static int (*__thiscall p_streambuf_pbackfail)(streambuf*, int); static void (*__thiscall p_streambuf_pbump)(streambuf*, int); static int (*__thiscall p_streambuf_sbumpc)(streambuf*); @@ -480,7 +482,9 @@ static BOOL init(void) SET(p_streambuf_clrclock, "?clrlock@streambuf@@QEAAXXZ"); SET(p_streambuf_doallocate, "?doallocate@streambuf@@MEAAHXZ"); SET(p_streambuf_gbump, "?gbump@streambuf@@IEAAXH@Z"); + SET(p_streambuf_in_avail, "?in_avail@streambuf@@QEBAHXZ"); SET(p_streambuf_lock, "?lock@streambuf@@QEAAXXZ"); + SET(p_streambuf_out_waiting, "?out_waiting@streambuf@@QEBAHXZ"); SET(p_streambuf_pbackfail, "?pbackfail@streambuf@@UEAAHH@Z"); SET(p_streambuf_pbump, "?pbump@streambuf@@IEAAXH@Z"); SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QEAAHXZ"); @@ -657,7 +661,9 @@ static BOOL init(void) SET(p_streambuf_clrclock, "?clrlock@streambuf@@QAEXXZ"); SET(p_streambuf_doallocate, "?doallocate@streambuf@@MAEHXZ"); SET(p_streambuf_gbump, "?gbump@streambuf@@IAEXH@Z"); + SET(p_streambuf_in_avail, "?in_avail@streambuf@@QBEHXZ"); SET(p_streambuf_lock, "?lock@streambuf@@QAEXXZ"); + SET(p_streambuf_out_waiting, "?out_waiting@streambuf@@QBEHXZ"); SET(p_streambuf_pbackfail, "?pbackfail@streambuf@@UAEHH@Z"); SET(p_streambuf_pbump, "?pbump@streambuf@@IAEXH@Z"); SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QAEHXZ"); @@ -1388,6 +1394,36 @@ static void test_streambuf(void) ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr); ok(*sb2.gptr == 'X', "expected 'X' in the get area, got %c\n", *sb2.gptr); + /* out_waiting */ + ret = (int) call_func1(p_streambuf_out_waiting, &sb); + ok(ret == 9, "expected 9 got %d\n", ret); + sb.pptr = sb.pbase; + ret = (int) call_func1(p_streambuf_out_waiting, &sb); + ok(ret == 0, "expected 0 got %d\n", ret); + sb.pptr = sb.pbase - 1; + ret = (int) call_func1(p_streambuf_out_waiting, &sb); + ok(ret == 0, "expected 0 got %d\n", ret); + sb.pptr = NULL; + ret = (int) call_func1(p_streambuf_out_waiting, &sb); + ok(ret == 0, "expected 0 got %d\n", ret); + sb.pptr = sb.epptr; + sb.pbase = NULL; + ret = (int) call_func1(p_streambuf_out_waiting, &sb); + ok(ret == (int)(sb.pptr - sb.pbase), "expected %d got %d\n", (int)(sb.pptr - sb.pbase), ret); + + /* in_avail */ + ret = (int) call_func1(p_streambuf_in_avail, &sb); + ok(ret == 256, "expected 256 got %d\n", ret); + sb.gptr = sb.egptr; + ret = (int) call_func1(p_streambuf_in_avail, &sb); + ok(ret == 0, "expected 0 got %d\n", ret); + sb.gptr = sb.egptr + 1; + ret = (int) call_func1(p_streambuf_in_avail, &sb); + ok(ret == 0, "expected 0 got %d\n", ret); + sb.egptr = NULL; + ret = (int) call_func1(p_streambuf_in_avail, &sb); + ok(ret == 0, "expected 0 got %d\n", ret); + SetEvent(lock_arg.test[3]); WaitForSingleObject(thread, INFINITE); -- 2.7.4