PATCH: Compatibility issue with InternetCrackUrlA

wire wire99 at 21cn.com
Sat Feb 28 05:21:26 CST 2004


Hi.

   I have modified my patch about compatibility of InternetCrackUrlA
 function,to deal with the failed case.
  
   If the pointer member of one component is set to point a buffer,but
 the length member is not big enough,then the component should not be
 returned, and the length member is set to the value needed.
 
   And later i'll post the patch for the conformance test.
   
   
 					Bye.

 ChangeLog:
 Fill the nPort field with the corresponding scheme;
 Fix the path and extrainfo components' parse;
 Deal with the failed case.
 

Index: wine/dlls/wininet/internet.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/internet.c,v
retrieving revision 1.73
diff -u -r1.73 internet.c
--- wine/dlls/wininet/internet.c	30 Dec 2003 19:16:37 -0000	1.73
+++ wine/dlls/wininet/internet.c	28 Feb 2004 10:22:19 -0000
@@ -845,29 +845,28 @@
   DWORD nLength;
   URL_COMPONENTSW UCW;
   WCHAR* lpwszUrl;
+  BOOL result;
   if(dwUrlLength==0)
       dwUrlLength=strlen(lpszUrl);
   lpwszUrl=HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(dwUrlLength+1));
   memset(lpwszUrl,0,sizeof(WCHAR)*(dwUrlLength+1));
   nLength=MultiByteToWideChar(CP_ACP,0,lpszUrl,dwUrlLength,lpwszUrl,dwUrlLength+1);
-  memset(&UCW,0,sizeof(UCW));
-  if(lpUrlComponents->dwHostNameLength!=0)
-      UCW.dwHostNameLength=1;
-  if(lpUrlComponents->dwUserNameLength!=0)
-      UCW.dwUserNameLength=1;
-  if(lpUrlComponents->dwPasswordLength!=0)
-      UCW.dwPasswordLength=1;
-  if(lpUrlComponents->dwUrlPathLength!=0)
-      UCW.dwUrlPathLength=1;
-  if(lpUrlComponents->dwSchemeLength!=0)
-      UCW.dwSchemeLength=1;
-  if(lpUrlComponents->dwExtraInfoLength!=0)
-      UCW.dwExtraInfoLength=1;
-  if(!InternetCrackUrlW(lpwszUrl,nLength,dwFlags,&UCW))
-  {
-      HeapFree(GetProcessHeap(), 0, lpwszUrl);
-      return FALSE;
-  }
+
+  memcpy(&UCW,lpUrlComponents,sizeof(UCW));
+  if (UCW.lpszScheme && UCW.dwSchemeLength)
+      UCW.lpszScheme = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(UCW.dwSchemeLength+1));
+  if (UCW.lpszHostName && UCW.dwHostNameLength)
+      UCW.lpszHostName = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(UCW.dwHostNameLength+1));
+  if (UCW.lpszUserName && UCW.dwUserNameLength)
+      UCW.lpszUserName = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(UCW.dwUserNameLength+1));
+  if (UCW.lpszPassword && UCW.dwPasswordLength)
+      UCW.lpszPassword = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(UCW.dwPasswordLength+1));
+  if (UCW.lpszUrlPath && UCW.dwUrlPathLength)
+      UCW.lpszUrlPath = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(UCW.dwUrlPathLength+1));
+  if (UCW.lpszExtraInfo && UCW.dwExtraInfoLength)
+      UCW.lpszExtraInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(UCW.dwExtraInfoLength+1));
+  result = InternetCrackUrlW(lpwszUrl,nLength,dwFlags,&UCW);
+  
   ConvertUrlComponentValue(&lpUrlComponents->lpszHostName, &lpUrlComponents->dwHostNameLength,
                            UCW.lpszHostName, UCW.dwHostNameLength,
                            lpszUrl, lpwszUrl);
@@ -888,7 +887,19 @@
                            lpszUrl, lpwszUrl);
   lpUrlComponents->nScheme=UCW.nScheme;
   lpUrlComponents->nPort=UCW.nPort;
+  lpUrlComponents->dwSchemeLength=UCW.dwSchemeLength;
+  lpUrlComponents->dwHostNameLength=UCW.dwHostNameLength;
+  lpUrlComponents->dwUserNameLength=UCW.dwUserNameLength;
+  lpUrlComponents->dwPasswordLength=UCW.dwPasswordLength;
+  lpUrlComponents->dwUrlPathLength=UCW.dwUrlPathLength;
+  lpUrlComponents->dwExtraInfoLength=UCW.dwExtraInfoLength;
   HeapFree(GetProcessHeap(), 0, lpwszUrl);
+  HeapFree(GetProcessHeap(), 0, UCW.lpszScheme);
+  HeapFree(GetProcessHeap(), 0, UCW.lpszHostName);
+  HeapFree(GetProcessHeap(), 0, UCW.lpszUserName);
+  HeapFree(GetProcessHeap(), 0, UCW.lpszPassword);
+  HeapFree(GetProcessHeap(), 0, UCW.lpszUrlPath);
+  HeapFree(GetProcessHeap(), 0, UCW.lpszExtraInfo);
   
   TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", lpszUrl,
           debugstr_an(lpUrlComponents->lpszScheme,lpUrlComponents->dwSchemeLength),
@@ -896,7 +907,7 @@
           debugstr_an(lpUrlComponents->lpszUrlPath,lpUrlComponents->dwUrlPathLength),
           debugstr_an(lpUrlComponents->lpszExtraInfo,lpUrlComponents->dwExtraInfoLength));
 
-  return TRUE;
+  return result;
 }
 
 /***********************************************************************
@@ -972,10 +983,14 @@
         }
         else
         {
-            INT ncpylen = min((*dwComponentLen)-1, len);
-            strncpyW(*lppszComponent, lpszStart, ncpylen);
-            (*lppszComponent)[ncpylen] = '\0';
-            *dwComponentLen = ncpylen;
+	    if (*dwComponentLen<len+1) {
+		**lppszComponent = '\0';
+		*dwComponentLen = len+1;
+		return FALSE;
+	    }
+            strncpyW(*lppszComponent, lpszStart, len);
+            (*lppszComponent)[len] = '\0';
+            *dwComponentLen = len;
         }
     }
 
@@ -999,6 +1014,8 @@
     LPWSTR lpszcp = NULL;
     WCHAR lpszSeparators[3]={';','?',0};
     WCHAR lpszSlash[2]={'/',0};
+    BOOL  result = TRUE;
+    
     if(dwUrlLength==0)
         dwUrlLength=strlenW(lpszUrl);
 
@@ -1027,12 +1044,12 @@
 
     /* Parse <params> */
     lpszParam = strpbrkW(lpszap, lpszSeparators);
-    if (lpszParam != NULL)
+    if (lpszParam != NULL && (lpUC->dwExtraInfoLength || lpUC->lpszExtraInfo))
     {
         if (!SetUrlComponentValueW(&lpUC->lpszExtraInfo, &lpUC->dwExtraInfoLength,
                                    lpszParam, dwUrlLength-(lpszParam-lpszUrl)))
         {
-            return FALSE;
+            result = FALSE;
         }
     }
 
@@ -1045,7 +1062,7 @@
         lpUC->nScheme = GetInternetSchemeW(lpszUrl, lpszcp - lpszUrl);
         if (!SetUrlComponentValueW(&lpUC->lpszScheme, &lpUC->dwSchemeLength,
                                    lpszUrl, lpszcp - lpszUrl))
-            return FALSE;
+            result = FALSE;
 
         /* Eat ':' in protocol. */
         lpszcp++;
@@ -1112,14 +1129,16 @@
                         lpszcp++;
                     }
 
-                    SetUrlComponentValueW(&lpUC->lpszUserName, &lpUC->dwUserNameLength,
-                                          lpszUser, lpszPasswd - lpszUser);
+                    if (!SetUrlComponentValueW(&lpUC->lpszUserName, &lpUC->dwUserNameLength,
+                                          lpszUser, lpszPasswd - lpszUser))
+			result = FALSE;
 
                     if (lpszPasswd != lpszHost)
                         lpszPasswd++;
-                    SetUrlComponentValueW(&lpUC->lpszPassword, &lpUC->dwPasswordLength,
+                    if (!SetUrlComponentValueW(&lpUC->lpszPassword, &lpUC->dwPasswordLength,
                                           lpszPasswd == lpszHost ? NULL : lpszPasswd,
-                                          lpszHost - lpszPasswd);
+                                          lpszHost - lpszPasswd))
+			result = FALSE;
 
                     lpszcp++; /* Advance to beginning of host */
                 }
@@ -1133,8 +1152,9 @@
                    entire string up to the first '/' */
                 if(lpUC->nScheme==INTERNET_SCHEME_RES)
                 {
-                    SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
-                                          lpszHost, lpszPort - lpszHost);
+                    if (!SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
+                                          lpszHost, lpszPort - lpszHost))
+			result = FALSE;
                     lpUC->nPort = 0;
                     lpszcp=lpszNetLoc;
                 }
@@ -1158,12 +1178,29 @@
                     }
                     else
                     {
-                        SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
-                                              lpszHost, lpszPort - lpszHost);
+                        if (!SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
+                                              lpszHost, lpszPort - lpszHost))
+			    result = FALSE;
                         if (lpszPort != lpszNetLoc)
                             lpUC->nPort = atoiW(++lpszPort);
                         else
-                            lpUC->nPort = 0;
+	     		    switch(lpUC->nScheme) {
+	     			case INTERNET_SCHEME_FTP:
+	     			    lpUC->nPort = INTERNET_DEFAULT_FTP_PORT;
+	     			    break;
+	     			case INTERNET_SCHEME_HTTPS:
+	     			    lpUC->nPort = INTERNET_DEFAULT_HTTPS_PORT;
+	     			    break;
+	      			case INTERNET_SCHEME_HTTP:
+	     			    lpUC->nPort = INTERNET_DEFAULT_HTTP_PORT;
+	     			    break;
+	      			case INTERNET_SCHEME_GOPHER:
+	     			    lpUC->nPort = INTERNET_DEFAULT_GOPHER_PORT;
+	     			    break;
+	      			default:
+				    lpUC->nPort = 0;
+				    break;
+	     		    }
                     }
                 }
             }
@@ -1198,7 +1235,7 @@
 
         if (!SetUrlComponentValueW(&lpUC->lpszUrlPath, &lpUC->dwUrlPathLength,
                                    lpszcp, len))
-            return FALSE;
+            result = FALSE;
     }
     else
     {
@@ -1210,7 +1247,7 @@
              debugstr_wn(lpUC->lpszUrlPath,lpUC->dwUrlPathLength),
              debugstr_wn(lpUC->lpszExtraInfo,lpUC->dwExtraInfoLength));
 
-    return TRUE;
+    return result;
 }
 
 /***********************************************************************

 



More information about the wine-patches mailing list