msvcrt: add support for _chsize_s

morphiend morphiend at gmail.com
Tue Jun 11 12:56:46 CDT 2013


This patch adds the _chsize_s() to the mscvrt and corresponding mscvr*s.
This was tested on Ubuntu 12.10 using IDA 6.4 as a test application.
Without the implementation of _chsize_s(), certain binaries caused an
internal crash of IDA. This patch fixed that crash.

---
 dlls/msvcr100/msvcr100.spec |  3 ++-
 dlls/msvcr110/msvcr110.spec |  2 +-
 dlls/msvcr80/msvcr80.spec   |  2 +-
 dlls/msvcr90/msvcr90.spec   |  2 +-
 dlls/msvcrt/file.c          | 60
+++++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |  1 +
 6 files changed, 66 insertions(+), 4 deletions(-)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20130611/f8203f86/attachment.html>
-------------- next part --------------
From d7f6c4469debf45112137b1b3dbb0836e16428fe Mon Sep 17 00:00:00 2001
From: Mike Koss <morphiend at gmail.com>
Date: Tue, 11 Jun 2013 13:37:27 -0400
Subject: =?UTF-8?q?Implemented=20=5Fchsize=5Fs=20in=20msvcrt=20dll=0AAdded?=
 =?UTF-8?q?=20mappings=20from=20relevant=20crt=20dlls=20to=20msvcrt=20for?=
 =?UTF-8?q?=20=5Fchsize=5Fs?=

---
 dlls/msvcr100/msvcr100.spec |  3 ++-
 dlls/msvcr110/msvcr110.spec |  2 +-
 dlls/msvcr80/msvcr80.spec   |  2 +-
 dlls/msvcr90/msvcr90.spec   |  2 +-
 dlls/msvcrt/file.c          | 60 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |  1 +
 6 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 63a0caa..5033c95 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -721,7 +721,8 @@
 @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
 @ cdecl _chmod(str long) msvcrt._chmod
 @ cdecl _chsize(long long) msvcrt._chsize
-@ stub _chsize_s
+@ cdecl _chsize_s(long int64) msvcrt._chsize
+#@ stub _chsize_s
 @ cdecl _clearfp() msvcrt._clearfp
 @ cdecl _close(long) msvcrt._close
 @ cdecl _commit(long) msvcrt._commit
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index e82f100..f6b1304 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1073,7 +1073,7 @@
 @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
 @ cdecl _chmod(str long) msvcrt._chmod
 @ cdecl _chsize(long long) msvcrt._chsize
-@ stub _chsize_s
+@ cdecl _chsize_s(long int64) msvcrt._chsize_s
 @ cdecl _clearfp() msvcrt._clearfp
 @ cdecl _close(long) msvcrt._close
 @ cdecl _commit(long) msvcrt._commit
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 521a69d..0307396 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -384,7 +384,7 @@
 @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
 @ cdecl _chmod(str long) msvcrt._chmod
 @ cdecl _chsize(long long) msvcrt._chsize
-@ stub _chsize_s
+@ cdecl _chsize_s(long int64) msvcrt._chsize_s
 @ cdecl _clearfp() msvcrt._clearfp
 @ cdecl _close(long) msvcrt._close
 @ cdecl _commit(long) msvcrt._commit
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index fd71ef4..1976848 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -367,7 +367,7 @@
 @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
 @ cdecl _chmod(str long) msvcrt._chmod
 @ cdecl _chsize(long long) msvcrt._chsize
-@ stub _chsize_s
+@ cdecl _chsize_s(long int64) msvcrt._chsize_s
 @ cdecl _clearfp() msvcrt._clearfp
 @ cdecl _close(long) msvcrt._close
 @ cdecl _commit(long) msvcrt._commit
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 1f17a93..c78f7a1 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1275,6 +1275,66 @@ int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
 }
 
 /*********************************************************************
+ *		_chsize_s (MSVCRT.@)
+ */
+int CDECL MSVCRT__chsize_s(int fd, __int64 size)
+{
+    LARGE_INTEGER cur, pos;
+    LARGE_INTEGER temp = { 0 }; 
+    HANDLE handle;
+    int ret = 0;
+
+    TRACE("(fd=%d, size=%lld)\n", fd, size);
+
+    LOCK_FILES();
+
+    handle = msvcrt_fdtoh(fd);
+    if (handle == INVALID_HANDLE_VALUE)
+    {
+       msvcrt_set_errno(ERROR_INVALID_HANDLE);
+       ret = *MSVCRT__errno();
+    }
+    else
+    {
+        /* save the current file pointer */
+        if (!SetFilePointerEx(handle, temp, &cur, SEEK_CUR))
+        {
+            msvcrt_set_errno(GetLastError());
+            ret = *MSVCRT__errno();
+        }
+        else
+        {
+            /* SetFilePointerEx uses NtSetInformationFile which
+               uses ftruncate() to extend the file size. This will
+               init bytes to 0, and thereby meet the MSDN doc for
+               _chsize_s() */
+            pos.QuadPart = size;
+            if (!SetFilePointerEx(handle, pos, &temp, SEEK_CUR))
+            {
+                msvcrt_set_errno(GetLastError());
+                ret = *MSVCRT__errno();
+            }
+            else
+            {
+                SetEndOfFile(handle);
+                ret = SetEndOfFile(handle);
+                if (!ret)
+                {
+                    msvcrt_set_errno(GetLastError());
+                    ret = *MSVCRT__errno();
+                }
+
+               /* restore the file pointer */
+               MSVCRT__lseek(fd, cur.QuadPart, SEEK_SET);
+            }
+        }
+    }
+
+    UNLOCK_FILES();
+    return ret;
+}
+
+/*********************************************************************
  *		clearerr (MSVCRT.@)
  */
 void CDECL MSVCRT_clearerr(MSVCRT_FILE* file)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 55ebba9..d80ec2a 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -355,6 +355,7 @@
 @ cdecl -arch=i386 -norelay _chkesp()
 @ cdecl _chmod(str long) MSVCRT__chmod
 @ cdecl _chsize(long long) MSVCRT__chsize
+@ cdecl _chsize_s(long int64) MSVCRT__chsize
 # stub _chsize_s(long int64)
 # stub _chvalidator(long long)
 # stub _chvalidator_l(ptr long long)
-- 
1.8.1.2


More information about the wine-patches mailing list