summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/ftp/ftp.c7
-rw-r--r--main/network.c22
-rw-r--r--main/php_network.h1
3 files changed, 27 insertions, 3 deletions
diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c
index e44186ec39..4b1915fe75 100644
--- a/ext/ftp/ftp.c
+++ b/ext/ftp/ftp.c
@@ -117,7 +117,7 @@ ftp_open(const char *host, short port, long timeout_sec)
return NULL;
}
- ftp->fd = php_hostconnect(host, port ? port : 21, SOCK_STREAM, (int) timeout_sec);
+ ftp->fd = php_hostconnect(host, (unsigned short) (port ? port : 21), SOCK_STREAM, (int) timeout_sec);
if (ftp->fd == -1) {
goto bail;
}
@@ -1050,14 +1050,14 @@ ftp_getdata(ftpbuf_t *ftp)
goto bail;
}
- size = sizeof(php_sockaddr_storage);
-
/* passive connection handler */
if (ftp->pasv) {
/* clear the ready status */
ftp->pasv = 1;
/* connect */
+ /* Win 95/98 seems not to like size > sizeof(sockaddr_in) */
+ size = php_sockaddr_size(&ftp->pasvaddr);
tv.tv_sec = ftp->timeout_sec;
tv.tv_usec = 0;
if (php_connect_nonb(fd, (struct sockaddr*) &ftp->pasvaddr, size, &tv) == -1) {
@@ -1075,6 +1075,7 @@ ftp_getdata(ftpbuf_t *ftp)
/* bind to a local address */
php_any_addr(sa->sa_family, &addr, 0);
+ size = php_sockaddr_size(&addr);
if (bind(fd, (struct sockaddr*) &addr, size) == -1) {
perror("bind");
diff --git a/main/network.c b/main/network.c
index 5dd6b6ed3a..804784521a 100644
--- a/main/network.c
+++ b/main/network.c
@@ -386,6 +386,28 @@ void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short port)
}
/* }}} */
+/* {{{ php_sockaddr_size
+ * Returns the size of struct sockaddr_xx for the family
+ */
+int php_sockaddr_size(php_sockaddr_storage *addr)
+{
+ switch (((struct sockaddr *)addr)->sa_family) {
+ case AF_INET:
+ return sizeof(struct sockaddr_in);
+#ifdef AF_INET6
+ case AF_INET6:
+ return sizeof(struct sockaddr_in6);
+#endif
+#ifdef AF_UNIX
+ case AF_UNIX:
+ return sizeof(struct sockaddr_un);
+#endif
+ default:
+ return 0;
+ }
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 8
diff --git a/main/php_network.h b/main/php_network.h
index b5c7363c55..dbb3be4627 100644
--- a/main/php_network.h
+++ b/main/php_network.h
@@ -54,6 +54,7 @@ typedef struct {
int php_hostconnect(const char *host, unsigned short port, int socktype, int timeout);
PHPAPI int php_connect_nonb(int sockfd, const struct sockaddr *addr, socklen_t addrlen, struct timeval *timeout);
void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short port);
+int php_sockaddr_size(php_sockaddr_storage *addr);
#endif /* _PHP_NETWORK_H */