#BUGFIX by cg
class: Socket
changed:
#primNonBlockingNextPutAll:
#setNonBlocking
YOU MUST CHECK BEFORE ACCESSING VARIABLES!!!!!
BE VERY VERY CAREFUL IN C - PLEASE!
--- a/Socket.st Mon Feb 24 20:25:49 2020 +0100
+++ b/Socket.st Tue Feb 25 19:50:56 2020 +0100
@@ -4429,22 +4429,29 @@
%{
# ifdef __win32__
- int sendResult;
- int wsaErrorNo;
- char *pBytes = __externalAddressVal(bytes);
- SOCKET socket = SOCKET_FROM_FILE_OBJECT(__INST(handle));
-
- sendResult = send(socket, pBytes, __intVal(byteLength), 0);
- if (sendResult == SOCKET_ERROR) {
- wsaErrorNo = WSAGetLastError();
- if (wsaErrorNo == WSAEWOULDBLOCK) {
- returnValue = __MKSMALLINT(0);
+ // ALWAYS check for proper arguments, please
+ OBJ fp = __INST(handle);
+
+ if (__isExternalAddress(bytes)
+ && __isSmallInteger(byteLength)
+ && (fp != NULL)) {
+ int sendResult;
+ int wsaErrorNo;
+ char *pBytes = __externalAddressVal(bytes);
+ SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
+
+ sendResult = send(socket, pBytes, __intVal(byteLength), 0);
+ if (sendResult == SOCKET_ERROR) {
+ wsaErrorNo = WSAGetLastError();
+ if (wsaErrorNo == WSAEWOULDBLOCK) {
+ returnValue = __MKSMALLINT(0);
+ } else {
+ console_printf("send failed with: %d\n", wsaErrorNo);
+ wsaError = __MKSMALLINT(wsaErrorNo);
+ }
} else {
- console_printf("send failed with: %d\n", wsaErrorNo);
- wsaError = __MKSMALLINT(wsaErrorNo);
+ returnValue = __MKSMALLINT(sendResult);
}
- } else {
- returnValue = __MKSMALLINT(sendResult);
}
#endif // __win32__
%}.
@@ -4473,16 +4480,22 @@
%{
# ifdef __win32__
- int result;
- u_long nonBlocking = 1;
- SOCKET socket = SOCKET_FROM_FILE_OBJECT(__INST(handle));
-
- result = ioctlsocket(socket, FIONBIO, &nonBlocking);
- if (result == SOCKET_ERROR) {
- console_fprintf(stderr, "Win32OS [info]: ioctlsocket failed with %d\n", WSAGetLastError());
+ // ALWAYS check for proper arguments, please
+ OBJ fp = __INST(handle);
+
+ if (fp != NULL) {
+ int result;
+ u_long nonBlocking = 1;
+ SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
+
+ result = ioctlsocket(socket, FIONBIO, &nonBlocking);
+ if (result == SOCKET_ERROR) {
+ console_fprintf(stderr, "Win32OS [info]: ioctlsocket failed with %d\n", WSAGetLastError());
+ RETURN(false);
+ }
+
+ RETURN(true);
}
-
- RETURN(true);
#endif // __win32__
%}.