Evil: fix fcntl() when used with F_SETFL
authorVincent Torri <vincent.torri@gmail.com>
Sun, 28 Sep 2014 13:26:51 +0000 (15:26 +0200)
committerzmike <michael.blumenkrantz@gmail.com>
Sun, 28 Sep 2014 16:29:54 +0000 (12:29 -0400)
@fix

src/lib/evil/evil_fcntl.c

index 76b6a603e13790c3ab5d9c421b4ee9c6826d2737..169d1926e22162cf736dcf9ab5be4e042f137156 100644 (file)
 int fcntl(int fd, int cmd, ...)
 {
    va_list va;
-   HANDLE  h;
    int     res = -1;
 
    va_start (va, cmd);
 
-   h = (HANDLE)_get_osfhandle(fd);
-   if (h == INVALID_HANDLE_VALUE)
-     return -1;
-
    if (cmd == F_GETFD)
      {
+        HANDLE  h;
         DWORD flag;
 
+        h = (HANDLE)_get_osfhandle(fd);
+        if (h == INVALID_HANDLE_VALUE)
+          return -1;
+
        if (!GetHandleInformation(h, &flag))
-         return -1;
+          {
+             /* FIXME: should we close h ? MSDN seems to say that */
+             return -1;
+          }
 
        res = 0;
      }
 
    if (cmd == F_SETFD)
      {
+        HANDLE  h;
         long flag;
 
+        h = (HANDLE)_get_osfhandle(fd);
+        if (h == INVALID_HANDLE_VALUE)
+          return -1;
+
         flag = va_arg(va, long);
         if (flag == FD_CLOEXEC)
           {
@@ -73,7 +81,7 @@ int fcntl(int fd, int cmd, ...)
              ret = getsockopt((SOCKET)fd, SOL_SOCKET, SO_TYPE, (char *)&type, &len);
              if (!ret && (type == SOCK_STREAM))
                {
-                  if (!ioctlsocket((SOCKET)fd, FIONBIO, &arg) == SOCKET_ERROR)
+                  if (ioctlsocket((SOCKET)fd, FIONBIO, &arg) != SOCKET_ERROR)
                     res = 0;
                }
           }