Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ws2_32/tests/sock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 134c4d383f..a89a964129 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3546,13 +3546,13 @@ static void test_WSAStringToAddress(void) ipv6_tests[j].address[6], ipv6_tests[j].address[7] ); ok( sockaddr6.sin6_scope_id == 0, "WSAStringToAddress(%s) gave scope %d, expected 0\n", - wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_scope_id ); + wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_scope_id ); ok( sockaddr6.sin6_port == ipv6_tests[j].port, "WSAStringToAddress(%s) gave port %04x, expected %04x\n", wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_port, ipv6_tests[j].port ); ok( sockaddr6.sin6_flowinfo == 0, "WSAStringToAddress(%s) gave flowinfo %d, expected 0\n", - wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_flowinfo ); + wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_flowinfo ); } } }
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- inet_pton, RtlIpv4StringToAddress, and RtlIpv6StringToAddress crash on bad pointers, but not inet_addr. --- dlls/ws2_32/socket.c | 9 +++++++-- dlls/ws2_32/tests/sock.c | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 8e66ab8fec..5e1e9201ab 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -4462,8 +4462,13 @@ int WINAPI WSAHtons(SOCKET s, WS_u_short hostshort, WS_u_short *lpnetshort) */ WS_u_long WINAPI WS_inet_addr(const char *cp) { - if (!cp) return INADDR_NONE; - return inet_addr(cp); + WS_u_long ret; + __TRY + ret = inet_addr(cp); + __EXCEPT_PAGE_FAULT + ret = INADDR_NONE; + __ENDTRY + return ret; }
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index a89a964129..a38db46eab 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -4788,6 +4788,8 @@ static void test_inet_addr(void)
addr = inet_addr(NULL); ok(addr == INADDR_NONE, "inet_addr succeeded unexpectedly\n"); + + inet_addr((const char *)0xdeadbeef); /* should not crash */ }
static void test_addr_to_print(void)
Alex Henrie alexhenrie24@gmail.com writes:
Signed-off-by: Alex Henrie alexhenrie24@gmail.com
inet_pton, RtlIpv4StringToAddress, and RtlIpv6StringToAddress crash on bad pointers, but not inet_addr.
Is there an app that depends on this? We don't want to add exception handlers where they are not needed.
On Wed, May 20, 2020 at 12:11 PM Alexandre Julliard julliard@winehq.org wrote:
Alex Henrie alexhenrie24@gmail.com writes:
Signed-off-by: Alex Henrie alexhenrie24@gmail.com
inet_pton, RtlIpv4StringToAddress, and RtlIpv6StringToAddress crash on bad pointers, but not inet_addr.
Is there an app that depends on this? We don't want to add exception handlers where they are not needed.
I'm not aware of any such app, it's just something that I noticed while debugging this family of functions. I'm sure there are apps that depend on inet_addr(NULL) not crashing though.
Thanks for taking the other two patches I sent this morning!
-Alex
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ws2_32/socket.c | 4 ++-- dlls/ws2_32/tests/sock.c | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 5e1e9201ab..cebe66fe49 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -8519,7 +8519,6 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, res = WSAEFAULT; break; } - *lpAddressLength = sizeof(SOCKADDR_IN); memset(lpAddress, 0, sizeof(SOCKADDR_IN));
status = RtlIpv4StringToAddressExA(AddressString, FALSE, &addr4->sin_addr, &addr4->sin_port); @@ -8529,6 +8528,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, break; } addr4->sin_family = WS_AF_INET; + *lpAddressLength = sizeof(SOCKADDR_IN); break; } case WS_AF_INET6: @@ -8542,7 +8542,6 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, res = WSAEFAULT; break; } - *lpAddressLength = sizeof(SOCKADDR_IN6); memset(lpAddress, 0, sizeof(SOCKADDR_IN6));
status = RtlIpv6StringToAddressExA(AddressString, &addr6->sin6_addr, &addr6->sin6_scope_id, &addr6->sin6_port); @@ -8552,6 +8551,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, break; } addr6->sin6_family = WS_AF_INET6; + *lpAddressLength = sizeof(SOCKADDR_IN6); break; } default: diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index a38db46eab..7082c7908f 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3454,7 +3454,7 @@ static void test_WSAStringToAddress(void) };
WCHAR inputW[64]; - INT len, ret, expected_ret; + INT len, ret, expected_len, expected_ret; short expected_family; SOCKADDR_IN sockaddr; SOCKADDR_IN6 sockaddr6; @@ -3465,13 +3465,16 @@ static void test_WSAStringToAddress(void) ret = WSAStringToAddressA( ipv4_tests[0].input, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); ok( ret == SOCKET_ERROR, "WSAStringToAddressA() returned %d, expected SOCKET_ERROR\n", ret ); ok( WSAGetLastError() == WSAEFAULT, "WSAStringToAddress() gave error %d, expected WSAEFAULT\n", WSAGetLastError() ); + ok( len >= sizeof(sockaddr) || broken(len == 0) /* xp */, + "WSAStringToAddress() gave length %d, expected at least %d\n", len, sizeof(sockaddr) );
for (i = 0; i < 2; i++) { for (j = 0; j < ARRAY_SIZE(ipv4_tests); j++) { - len = sizeof(sockaddr); - memset( &sockaddr, 0xab, len ); + len = sizeof(sockaddr) + 10; + expected_len = ipv4_tests[j].error ? len : sizeof(sockaddr); + memset( &sockaddr, 0xab, sizeof(sockaddr) );
WSASetLastError( 0 ); if (i == 0) @@ -3500,12 +3503,16 @@ static void test_WSAStringToAddress(void) ok( sockaddr.sin_port == ipv4_tests[j].port, "WSAStringToAddress(%s) gave port %04x, expected %04x\n", wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_port, ipv4_tests[j].port ); + ok( len == expected_len, + "WSAStringToAddress(%s) gave length %d, expected %d\n", + wine_dbgstr_a( ipv4_tests[j].input ), len, expected_len ); }
for (j = 0; j < ARRAY_SIZE(ipv6_tests); j++) { - len = sizeof(sockaddr6); - memset( &sockaddr6, 0xab, len ); + len = sizeof(sockaddr6) + 10; + expected_len = ipv6_tests[j].error ? len : sizeof(sockaddr6); + memset( &sockaddr6, 0xab, sizeof(sockaddr6) );
WSASetLastError( 0 ); if (i == 0) @@ -3553,6 +3560,9 @@ static void test_WSAStringToAddress(void) ok( sockaddr6.sin6_flowinfo == 0, "WSAStringToAddress(%s) gave flowinfo %d, expected 0\n", wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_flowinfo ); + ok( len == expected_len, + "WSAStringToAddress(%s) gave length %d, expected %d\n", + wine_dbgstr_a( ipv6_tests[j].input ), len, expected_len ); } } }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=72035
Your paranoid android.
=== w1064v1809_he (32 bit report) ===
ws2_32: sock.c:8647: Test failed: bytesReturned isn't supposed to be 1 sock.c:8671: Test failed: GetOverlappedResult failed, error 0
=== debiant (32 bit Chinese:China report) ===
ws2_32: sock.c:9704: Test succeeded inside todo block: GetQueuedCompletionStatus returned 0 sock.c:9705: Test succeeded inside todo block: Last error was 64
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=72033
Your paranoid android.
=== w864 (64 bit report) ===
ws2_32: sock.c:8635: Test failed: bytesReturned isn't supposed to be 1 sock.c:8659: Test failed: GetOverlappedResult failed, error 0