#BUGFIX by cg
authorClaus Gittinger <cg@exept.de>
Tue, 25 Feb 2020 19:50:56 +0100
changeset 5460 d6423dcd7fdb
parent 5459 70e5b29dd7d3
child 5461 2bf7d49fb682
#BUGFIX by cg class: Socket changed: #primNonBlockingNextPutAll: #setNonBlocking YOU MUST CHECK BEFORE ACCESSING VARIABLES!!!!! BE VERY VERY CAREFUL IN C - PLEASE!
Socket.st
--- 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__
     %}.