[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Win32 : SOCKET type sign causes malfunctions all over the DLL on libssh 0.4.4
[Thread Prev] | [Thread Next]
- Subject: Re: Win32 : SOCKET type sign causes malfunctions all over the DLL on libssh 0.4.4
- From: Aris Adamantiadis <aris@xxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Thu, 17 Jun 2010 10:17:39 +0200
- To: libssh@xxxxxxxxxx
Hi Andrea, Thanks for your report, we opened a ticket about this. It seems other libraries work around this problem by defining a constant INVALID_SOCKET and comparing to this constant rather than doing a comparison with 0. kr, Aris Andrea Moretto a écrit : > Hi all! > > I uncovered that there is a serious issue that affects the libssh > when compiling it on win environments, as of latest stable 0.4.4 release. > > If you check the definition of socket_t type in libssh.h : > > /* Socket type */ > #ifdef _WIN32 > #define socket_t SOCKET > #else > typedef int socket_t; > #endif > > It defines the socket_t type as SOCKET, which is unsigned in winsock. While the > sockets in Unices environments are commonly integer types. > This means that a lot of comparisons that assume it as signed (as in Unices) > do actually fail in windows platforms. > > For instance check the bsd_poll function body : > > static int bsd_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) { > fd_set readfds, writefds, exceptfds; > struct timeval tv, *ptv; > socket_t max_fd; > int rc; > nfds_t i; > > if (fds == NULL) { > errno = EFAULT; > return -1; > } > > FD_ZERO (&readfds); > FD_ZERO (&writefds); > FD_ZERO (&exceptfds); > > /* compute fd_sets and find largest descriptor */ > for (max_fd = -1, i = 0; i < nfds; i++) { > if (fds[i].fd < 0) { > continue; > } > > if (fds[i].events & (POLLIN | POLLRDNORM)) { > FD_SET (fds[i].fd, &readfds); > } > if (fds[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND)) { > FD_SET (fds[i].fd, &writefds); > } > if (fds[i].events & (POLLPRI | POLLRDBAND)) { > FD_SET (fds[i].fd, &exceptfds); > } > if (fds[i].fd >= max_fd && HERE!!!!!!!!! > (fds[i].events & (POLLIN | POLLOUT | POLLPRI | > POLLRDNORM | POLLRDBAND | > POLLWRNORM | POLLWRBAND))) > { > max_fd = fds[i].fd; > } > } > . > . > . > > The comparison fds[i].fd >= max_fd assumes both of them to be signed ints, > and the invalid socket to be -1. In windows platforms that comparison fails > because the invalid socket value is 0xFFFFFFFF, so that comparison is never > true. > > I also read a message in the mailing list reporting a user complaining that > channel_poll is not working on windows platforms, while it works properly on unices. > I debugged the DLL and found out it is due to the unsignedness of socket_t. > > I temporarily fixed those issue type-defiinig socket_t as the following: > > /* Socket type */ > #ifdef _WIN32 > #define socket_t long > #else > typedef int socket_t; > #endif > > Of course this is (and must be) only a temporary fix, because SOCKET can get over > 0x10000000, causing issues. > > Hope this helps! > > Cheers, > > Andrea > > > Andrea Moretto > moretto.andrea@xxxxxxxxx > ------------------------------------------------------- > CONFIDENTIALITY NOTICE > This message and its attachments are addressed solely to the persons > above and may contain confidential information. If you have received > the message in error, be informed that any use of the content hereof > is prohibited. Please return it immediately to the sender and delete > the message. > ------------------------------------------------------- > >
Re: Win32 : SOCKET type sign causes malfunctions all over the DLL on libssh 0.4.4 | Andreas Schneider <asn@xxxxxxxxxxxx> |
Win32 : SOCKET type sign causes malfunctions all over the DLL on libssh 0.4.4 | Andrea Moretto <moretto.andrea@xxxxxxxxx> |