Invalid code
Francois Gouget
fgouget at free.fr
Mon Jan 21 02:13:59 CST 2002
Gcc flags this code as having an undefined behavior:
SetUrlComponentValue(&lpUrlComponents->lpszPassword,
&lpUrlComponents->dwPasswordLength,
lpszPasswd == lpszHost ? NULL : ++lpszPasswd,
lpszHost - lpszPasswd);
The reason is that the order in which the parameters of a function
are evaluated is not defined by the C standard. But, as I understand
this code, it assumes that the expression for parameter 3 will be
evaluated, together with its side-effect, before the expression for
parameter 4.
Changelog:
* dlls/wininet/internet.c
Fix invalid C code (undefined behavior)
--
Francois Gouget fgouget at free.fr http://fgouget.free.fr/
Cahn's Axiom: When all else fails, read the instructions.
-------------- next part --------------
Index: dlls/wininet/internet.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/internet.c,v
retrieving revision 1.28
diff -u -r1.28 internet.c
--- dlls/wininet/internet.c 2001/12/24 20:24:37 1.28
+++ dlls/wininet/internet.c 2002/01/21 05:40:53
@@ -628,9 +628,11 @@
SetUrlComponentValue(&lpUrlComponents->lpszUserName,
&lpUrlComponents->dwUserNameLength, lpszUser, lpszPasswd - lpszUser);
+ if (lpszPasswd != lpszHost)
+ lpszPasswd++;
SetUrlComponentValue(&lpUrlComponents->lpszPassword,
&lpUrlComponents->dwPasswordLength,
- lpszPasswd == lpszHost ? NULL : ++lpszPasswd,
+ lpszPasswd == lpszHost ? NULL : lpszPasswd,
lpszHost - lpszPasswd);
lpszcp++; /* Advance to beginning of host */
More information about the wine-patches
mailing list