[patch 4 of 7]: 0004-findfirst-findnext-functions-don-t-set-doserrno-on-inv.txt

Kai Tietz ktietz70 at googlemail.com
Thu Dec 29 10:03:17 CST 2011


Hi,

this patch adds to findfirst/findnext function family the additional
check for invalid arguments.  In this case 'errno' is set to EINVAL,
but doserrno and internal state of GetLastError aren't clobbered/set.

Regards,
Kai
-------------- next part --------------
From 96d01054513d9d397cc94c5014965851c6add759 Mon Sep 17 00:00:00 2001
From: Kai Tietz <ktietz70 at googlemail.com>
Date: Thu, 29 Dec 2011 15:15:18 +0100
Subject: findfirst/findnext functions don't set doserrno on invalid
 arguments.

---
 dlls/msvcrt/dir.c |  105 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c
index e8e433b..3bd342f 100644
--- a/dlls/msvcrt/dir.c
+++ b/dlls/msvcrt/dir.c
@@ -412,6 +412,11 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirst(const char * fspec, struct MSVCRT__findd
   WIN32_FIND_DATAA find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
   hfind  = FindFirstFileA(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -431,6 +436,11 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirst32(const char * fspec, struct MSVCRT__fin
   WIN32_FIND_DATAA find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
   hfind  = FindFirstFileA(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -452,6 +462,11 @@ MSVCRT_intptr_t CDECL MSVCRT__wfindfirst(const MSVCRT_wchar_t * fspec, struct MS
   WIN32_FIND_DATAW find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
   hfind  = FindFirstFileW(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -473,6 +488,12 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirsti64(const char * fspec, struct MSVCRT__fi
   WIN32_FIND_DATAA find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   hfind  = FindFirstFileA(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -494,6 +515,12 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirst64(const char * fspec, struct MSVCRT__fin
   WIN32_FIND_DATAA find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   hfind  = FindFirstFileA(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -515,6 +542,12 @@ MSVCRT_intptr_t CDECL MSVCRT__wfindfirst64(const MSVCRT_wchar_t * fspec, struct
   WIN32_FIND_DATAW find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   hfind  = FindFirstFileW(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -536,6 +569,12 @@ MSVCRT_intptr_t CDECL MSVCRT__findfirst64i32(const char * fspec, struct MSVCRT__
   WIN32_FIND_DATAA find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   hfind  = FindFirstFileA(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -557,6 +596,12 @@ MSVCRT_intptr_t CDECL MSVCRT__wfindfirst64i32(const MSVCRT_wchar_t * fspec, stru
   WIN32_FIND_DATAW find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   hfind  = FindFirstFileW(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -578,6 +623,12 @@ MSVCRT_intptr_t CDECL MSVCRT__wfindfirsti64(const MSVCRT_wchar_t * fspec, struct
   WIN32_FIND_DATAW find_data;
   HANDLE hfind;
 
+  if (!ft || !fspec)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   hfind  = FindFirstFileW(fspec, &find_data);
   if (hfind == INVALID_HANDLE_VALUE)
   {
@@ -609,6 +660,12 @@ int CDECL MSVCRT__findnext(MSVCRT_intptr_t hand, struct MSVCRT__finddata_t * ft)
 {
   WIN32_FIND_DATAA find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileA((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -626,6 +683,12 @@ int CDECL MSVCRT__findnext32(MSVCRT_intptr_t hand, struct MSVCRT__finddata32_t *
 {
   WIN32_FIND_DATAA find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileA((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -645,6 +708,12 @@ int CDECL MSVCRT__wfindnext(MSVCRT_intptr_t hand, struct MSVCRT__wfinddata_t * f
 {
   WIN32_FIND_DATAW find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileW((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -664,6 +733,12 @@ int CDECL MSVCRT__findnexti64(MSVCRT_intptr_t hand, struct MSVCRT__finddatai64_t
 {
   WIN32_FIND_DATAA find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileA((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -683,6 +758,12 @@ int CDECL MSVCRT__findnext64(long hand, struct MSVCRT__finddata64_t * ft)
 {
   WIN32_FIND_DATAA find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileA((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -702,6 +783,12 @@ int CDECL MSVCRT__wfindnext64(MSVCRT_intptr_t hand, struct MSVCRT__wfinddata64_t
 {
   WIN32_FIND_DATAW find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileW((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -721,6 +808,12 @@ int CDECL MSVCRT__findnext64i32(long hand, struct MSVCRT__finddata64i32_t * ft)
 {
   WIN32_FIND_DATAA find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileA((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -740,6 +833,12 @@ int CDECL MSVCRT__wfindnexti64(MSVCRT_intptr_t hand, struct MSVCRT__wfinddatai64
 {
   WIN32_FIND_DATAW find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileW((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
@@ -759,6 +858,12 @@ int CDECL MSVCRT__wfindnext64i32(MSVCRT_intptr_t hand, struct MSVCRT__wfinddata6
 {
   WIN32_FIND_DATAW find_data;
 
+  if ((HANDLE)hand == INVALID_HANDLE_VALUE || !ft)
+    {
+      *MSVCRT__errno () = MSVCRT_EINVAL;
+      return -1;
+    }
+
   if (!FindNextFileW((HANDLE)hand, &find_data))
   {
     *MSVCRT__errno() = MSVCRT_ENOENT;
-- 
1.7.5.1


More information about the wine-patches mailing list