[4/5] ws2_32: Fix WSASocket return code for invalid combination of socket type and protocol
Bruno Jesus
00cpxxx at gmail.com
Sun Sep 15 23:44:22 CDT 2013
Things like SOCK_STREAM + IPPROTOP_UDP or SOCK_DGRAM + IPPROTO_TCP.
-------------- next part --------------
---
dlls/ws2_32/socket.c | 17 ++++++++++++++---
dlls/ws2_32/tests/sock.c | 3 ---
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index b591c5e..dafbeb4 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -5867,6 +5867,7 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
GROUP g, DWORD dwFlags)
{
SOCKET ret;
+ DWORD err;
/*
FIXME: The "advanced" parameters of WSASocketW (lpProtocolInfo,
@@ -5929,16 +5930,26 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
return ret;
}
- if (GetLastError() == WSAEACCES) /* raw socket denied */
+ err = GetLastError();
+ if (err == WSAEACCES) /* raw socket denied */
{
if (type == SOCK_RAW)
ERR_(winediag)("Failed to create a socket of type SOCK_RAW, this requires special permissions.\n");
else
ERR_(winediag)("Failed to create socket, this requires special permissions.\n");
- SetLastError(WSAESOCKTNOSUPPORT);
+ err = WSAESOCKTNOSUPPORT;
+ }
+ else
+ {
+ /* invalid combination of valid parameters, like SOCK_STREAM + IPPROTO_UDP */
+ if (err == WSAEINVAL)
+ err = WSAESOCKTNOSUPPORT;
+ else if (err == WSAEOPNOTSUPP)
+ err = WSAEPROTONOSUPPORT;
}
- WARN("\t\tfailed!\n");
+ WARN("\t\tfailed, error %d!\n", err);
+ SetLastError(err);
return INVALID_SOCKET;
}
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 1b5715f..4c58934 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1854,7 +1854,6 @@ todo_wine
ok(WSASocketA(AF_INET, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET,
"WSASocketA should have failed\n");
err = WSAGetLastError();
-todo_wine
ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
SetLastError(0xdeadbeef);
@@ -1874,7 +1873,6 @@ todo_wine
ok(WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
"WSASocketA should have failed\n");
err = WSAGetLastError();
-todo_wine
ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
/* SOCK_DGRAM does not support IPPROTO_TCP */
@@ -1882,7 +1880,6 @@ todo_wine
ok(WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_TCP, NULL, 0, 0) == INVALID_SOCKET,
"WSASocketA should have failed\n");
err = WSAGetLastError();
-todo_wine
ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
/* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
--
1.8.3.2
More information about the wine-patches
mailing list