=?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Fix implementation of strstreambuf::underflow.

Alexandre Julliard julliard at winehq.org
Mon Jun 20 10:29:52 CDT 2016


Module: wine
Branch: master
Commit: 025c54344230ca8b32e80f08b9af13a16dfd2445
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=025c54344230ca8b32e80f08b9af13a16dfd2445

Author: Iván Matellanes <matellanesivan at gmail.com>
Date:   Mon Jun 20 13:32:09 2016 +0100

msvcirt: Fix implementation of strstreambuf::underflow.

Spotted while testing for ostream printing.

Signed-off-by: Iván Matellanes <matellanes.ivan at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcirt/msvcirt.c       |  5 ++++-
 dlls/msvcirt/tests/msvcirt.c | 28 ++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index fe5901a..e4fb3fb 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -1469,8 +1469,11 @@ int __thiscall strstreambuf_underflow(strstreambuf *this)
     if (this->base.gptr < this->base.egptr)
         return *this->base.gptr;
     /* extend the get area to include the characters written */
-    if (this->base.egptr < this->base.pptr)
+    if (this->base.egptr < this->base.pptr) {
+        this->base.gptr = this->base.base + (this->base.gptr - this->base.eback);
+        this->base.eback = this->base.base;
         this->base.egptr = this->base.pptr;
+    }
     return (this->base.gptr < this->base.egptr) ? *this->base.gptr : EOF;
 }
 
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index a6916c1..428ddf3 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -1745,8 +1745,36 @@ static void test_strstreambuf(void)
     ssb2.base.pbase = ssb2.base.pptr = ssb2.base.epptr = NULL;
     ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
     ok(ret == EOF, "expected EOF got %d\n", ret);
+    ssb2.base.pbase = ssb2.base.pptr = ssb2.base.base;
+    ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
+    ok(ret == EOF, "expected EOF got %d\n", ret);
+    ok(ssb2.base.eback == ssb2.base.base, "wrong get base, expected %p got %p\n", ssb2.base.base, ssb2.base.eback);
+    ok(ssb2.base.gptr == ssb2.base.base, "wrong get pointer, expected %p got %p\n", ssb2.base.base, ssb2.base.gptr);
+    ok(ssb2.base.egptr == ssb2.base.base, "wrong get end, expected %p got %p\n", ssb2.base.base, ssb2.base.egptr);
+    ssb2.base.pptr = ssb2.base.base + 3;
+    ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
+    ok(ret == 'C', "expected 'C' got %d\n", ret);
+    ok(ssb2.base.eback == ssb2.base.base, "wrong get base, expected %p got %p\n", ssb2.base.base, ssb2.base.eback);
+    ok(ssb2.base.gptr == ssb2.base.base, "wrong get pointer, expected %p got %p\n", ssb2.base.base, ssb2.base.gptr);
+    ok(ssb2.base.egptr == ssb2.base.base + 3, "wrong get end, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.egptr);
+    ssb2.base.gptr = ssb2.base.base + 2;
+    ssb2.base.egptr = NULL;
+    ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
+    ok(ret == 'e', "expected 'e' got %d\n", ret);
+    ok(ssb2.base.eback == ssb2.base.base, "wrong get base, expected %p got %p\n", ssb2.base.base, ssb2.base.eback);
+    ok(ssb2.base.gptr == ssb2.base.base + 2, "wrong get pointer, expected %p got %p\n", ssb2.base.base, ssb2.base.gptr);
+    ok(ssb2.base.egptr == ssb2.base.base + 3, "wrong get end, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.egptr);
+    ssb2.base.eback = ssb2.base.egptr = ssb2.base.base + 1;
+    ssb2.base.gptr = ssb2.base.base + 3;
+    ssb2.base.pptr = ssb2.base.base + 5;
+    ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
+    ok(ret == 'e', "expected 'e' got %d\n", ret);
+    ok(ssb2.base.eback == ssb2.base.base, "wrong get base, expected %p got %p\n", ssb2.base.base, ssb2.base.eback);
+    ok(ssb2.base.gptr == ssb2.base.base + 2, "wrong get pointer, expected %p got %p\n", ssb2.base.base, ssb2.base.gptr);
+    ok(ssb2.base.egptr == ssb2.base.base + 5, "wrong get end, expected %p got %p\n", ssb2.base.base + 5, ssb2.base.egptr);
     ssb2.base.eback = ssb2.base.base;
     ssb2.base.gptr = ssb2.base.egptr = ssb2.base.ebuf;
+    ssb2.base.pbase = ssb2.base.pptr = NULL;
     ret = (int) call_func1(p_strstreambuf_underflow, &ssb2);
     ok(ret == EOF, "expected EOF got %d\n", ret);
 




More information about the wine-cvs mailing list