;; Oct 13, 1999 by Hajimu UMEMOTO ;; Index: src/fwtk/fwtk/ftp-gw/ftp-gw.c diff -u src/fwtk/fwtk/ftp-gw/ftp-gw.c:1.18 src/fwtk/fwtk/ftp-gw/ftp-gw.c:1.19 --- src/fwtk/fwtk/ftp-gw/ftp-gw.c:1.18 Sun Oct 10 20:34:12 1999 +++ src/fwtk/fwtk/ftp-gw/ftp-gw.c Tue Oct 12 02:26:37 1999 @@ -71,6 +71,7 @@ #ifdef INET6 static struct sockaddr_storage clntport; static char *clntap; +static char *clntcmd = NULL; #else static struct sockaddr_in clntport; #endif @@ -1123,6 +1124,9 @@ clntap = (char *)&((struct sockaddr_in *)&clntport)->sin_addr; else clntap = (char *)&((struct sockaddr_in6 *)&clntport)->sin6_addr; + if(clntcmd != NULL) + free(clntcmd); + clntcmd = strdup(av[0]); /* paranoid: check that we are really PORTing to the client */ @@ -1835,17 +1839,21 @@ close(rfd); rfd = -1; } - if( pasvport != -1){ #ifdef INET6 - if (x > 8 && - (strncasecmp(buf,"200 EPRT",8)==0 || - strncasecmp(buf,"200 LPRT",8)==0 || - strncasecmp(buf,"200 PORT",8)==0)) + if (x > 8 && (strncasecmp(buf,"200 EPRT",8)==0 || + strncasecmp(buf,"200 LPRT",8)==0 || + strncasecmp(buf,"200 PORT",8)==0)) { + if( pasvport != -1) + return 0; + else if(clntcmd) + strncpy(buf + 4, clntcmd, 4); + } #else + if( pasvport != -1){ if (x > 8 && strncasecmp(buf,"200 PORT",8)==0) -#endif return 0; } +#endif if(net_send(0,buf,x,0) != x) return(1); return(0); Index: src/fwtk/fwtk/lib/hnam.c diff -u src/fwtk/fwtk/lib/hnam.c:1.6 src/fwtk/fwtk/lib/hnam.c:1.7 --- src/fwtk/fwtk/lib/hnam.c:1.6 Sun Oct 10 00:15:12 1999 +++ src/fwtk/fwtk/lib/hnam.c Tue Oct 12 19:46:37 1999 @@ -35,7 +35,6 @@ #ifdef INET6 static char str[512]; struct sockaddr_storage sin; - char *ap; int alen; #ifdef USE_GETIPNODEBY int h_error; @@ -68,21 +67,16 @@ return(name); } - if(hp->h_addrtype == AF_INET) { - ap = (char *) &((struct sockaddr_in *)&sin)->sin_addr; + if(hp->h_addrtype == AF_INET) alen = sizeof(struct in_addr); - } else { - ap = (char *) &((struct sockaddr_in6 *)&sin)->sin6_addr; + else alen = sizeof(struct in6_addr); - } if (hp->h_length > alen) { syslog(LLEV,"securityalert: invalid host address length (%d) hostname %.128s", hp->h_length, name); name = "invalid"; return (name); } - bcopy(hp->h_addr,ap,hp->h_length); - getnameinfo((struct sockaddr *)&sin,sizeof(sin),str,sizeof str, - 0,0,NI_NUMERICHOST); + inet_ntop(hp->h_addrtype, hp->h_addr, str, sizeof str); return(str); #else if((hp = gethostbyname(name)) == (struct hostent *)0)