Fwd: msvcr: Implemented _chsize_s

Andrey Zhezherun zhezherun at yandex.ru
Tue Nov 5 03:04:19 CST 2013


On 4 November 2013 10:47, Alexandre Julliard <julliard at winehq.org> wrote:
>> +@ cdecl _chsize_s(long int64) msvcrt._chsize_s
> It's not exported in old dlls, you shouldn't be adding it.
Fixed in the new patch. I've also fixed the return value of _chsize_s
(it should return errno on failure instead of -1 according to MSDN)
and added validation for the parameter.

Regards,
Andrey
-------------- next part --------------
--- wine-1.7.5.orig/dlls/msvcr100/msvcr100.spec	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/dlls/msvcr100/msvcr100.spec	2013-10-30 11:09:56.000000000 +0000
@@ -725,7 +725,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
--- wine-1.7.5.orig/dlls/msvcr110/msvcr110.spec	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/dlls/msvcr110/msvcr110.spec	2013-10-30 11:09:56.000000000 +0000
@@ -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
--- wine-1.7.5.orig/dlls/msvcr80/msvcr80.spec	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/dlls/msvcr80/msvcr80.spec	2013-10-30 11:09:56.000000000 +0000
@@ -389,7 +389,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
--- wine-1.7.5.orig/dlls/msvcr90/msvcr90.spec	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/dlls/msvcr90/msvcr90.spec	2013-10-30 11:09:56.000000000 +0000
@@ -372,7 +372,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
--- wine-1.7.5.orig/dlls/msvcrt/file.c	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/dlls/msvcrt/file.c	2013-11-04 18:44:32.000000000 +0000
@@ -1259,15 +1259,17 @@
 }
 
 /*********************************************************************
- *		_chsize (MSVCRT.@)
+ *		_chsize_s (MSVCRT.@)
  */
-int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
+int CDECL MSVCRT__chsize_s(int fd, __int64 size)
 {
-    LONG cur, pos;
+    __int64 cur, pos;
     HANDLE handle;
     BOOL ret = FALSE;
 
-    TRACE("(fd=%d, size=%d)\n", fd, size);
+    TRACE("(fd=%d, size=%s)\n", fd, wine_dbgstr_longlong(size));
+
+    if (!MSVCRT_CHECK_PMT(size >= 0)) return *MSVCRT__errno();
 
     LOCK_FILES();
 
@@ -1275,10 +1277,10 @@
     if (handle != INVALID_HANDLE_VALUE)
     {
         /* save the current file pointer */
-        cur = MSVCRT__lseek(fd, 0, SEEK_CUR);
+        cur = MSVCRT__lseeki64(fd, 0, SEEK_CUR);
         if (cur >= 0)
         {
-            pos = MSVCRT__lseek(fd, size, SEEK_SET);
+            pos = MSVCRT__lseeki64(fd, size, SEEK_SET);
             if (pos >= 0)
             {
                 ret = SetEndOfFile(handle);
@@ -1286,12 +1288,21 @@
             }
 
             /* restore the file pointer */
-            MSVCRT__lseek(fd, cur, SEEK_SET);
+            MSVCRT__lseeki64(fd, cur, SEEK_SET);
         }
     }
 
     UNLOCK_FILES();
-    return ret ? 0 : -1;
+    return ret ? 0 : *MSVCRT__errno();
+}
+
+/*********************************************************************
+ *		_chsize (MSVCRT.@)
+ */
+int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
+{
+    /* _chsize_s returns errno on failure but _chsize should return -1 */
+    return MSVCRT__chsize_s( fd, size ) == 0 ? 0 : -1;
 }
 
 /*********************************************************************
--- wine-1.7.5.orig/dlls/msvcrt/msvcrt.spec	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/dlls/msvcrt/msvcrt.spec	2013-10-30 11:09:56.000000000 +0000
@@ -356,7 +356,7 @@
 @ cdecl -arch=i386 -norelay _chkesp()
 @ cdecl _chmod(str long) MSVCRT__chmod
 @ cdecl _chsize(long long) MSVCRT__chsize
-# stub _chsize_s(long int64)
+@ cdecl _chsize_s(long int64) MSVCRT__chsize_s
 # stub _chvalidator(long long)
 # stub _chvalidator_l(ptr long long)
 @ cdecl _clearfp()
--- wine-1.7.5.orig/include/msvcrt/io.h	2013-10-25 18:45:30.000000000 +0100
+++ wine-1.7.5/include/msvcrt/io.h	2013-11-01 11:47:34.000000000 +0000
@@ -87,6 +87,7 @@
 int         __cdecl _access(const char*,int);
 int         __cdecl _chmod(const char*,int);
 int         __cdecl _chsize(int,__msvcrt_ulong);
+int         __cdecl _chsize_s(int,__int64);
 int         __cdecl _close(int);
 int         __cdecl _commit(int);
 int         __cdecl _creat(const char*,int);
@@ -148,6 +149,7 @@
 static inline int access(const char* path, int mode) { return _access(path, mode); }
 static inline int chmod(const char* path, int mode) { return _chmod(path, mode); }
 static inline int chsize(int fd, __msvcrt_long size) { return _chsize(fd, size); }
+static inline int chsize_s(int fd, __int64 size) { return _chsize_s(fd, size); }
 static inline int close(int fd) { return _close(fd); }
 static inline int creat(const char* path, int mode) { return _creat(path, mode); }
 static inline int dup(int od) { return _dup(od); }


More information about the wine-patches mailing list