Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Jun 2000 17:10:15 -0700 (PDT)
From:      isv@false.vmts.ru
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/19390: non connect virtual hosting support in ftpd daemon
Message-ID:  <20000620001015.4F1C437B95F@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         19390
>Category:       ports
>Synopsis:       non connect virtual hosting support in ftpd daemon
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-ports
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jun 19 17:20:00 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     Sergey Ivanov
>Release:        Release 4.0
>Organization:
VMTS
>Environment:
4.0-RELEASE FreeBSD 4.0-RELEASE #0: Fri Jun 16 11:05:56 VLAST 2000 
>Description:
FreeBSD ftp daemon have bugs in "selecthost" function,
that causes not correct virtual hosting support.
I have detected that in FreeBSD release 4.0.

 selecthost(su)
        union sockunion *su;                                                     
 {                                                                               
...
       while (hrp != NULL) {
                for (hi = hrp->hostinfo; hi != NULL; hi = hi->ai_next)
              {                                                                  
               if (memcmp(su, hi->ai_addr, hi->ai_addrlen) == 0) {
>How-To-Repeat:
Add any vistual host to /etc/ftphosts with necessary rules, described in
man ftpd. and try login to this host as anonymous user. You will be wonder, because we will enter to base host ;)

>Fix:
--- ftpd.orig   Fri Jun 16 21:04:33 2000
+++ ftpd.c      Fri Jun 16 21:04:27 2000
@@ -772,6 +772,7 @@
 selecthost(su) 
        union sockunion *su;
 {
+        int find=0;
        struct ftphost  *hrp; 
        u_int16_t port;
 #ifdef INET6
@@ -792,11 +793,12 @@
        hrp = thishost = firsthost;     /* default */ 
        port = su->su_port;
        su->su_port = 0;
-       while (hrp != NULL) {
+       while (hrp != NULL && !find) {
                for (hi = hrp->hostinfo; hi != NULL; hi = hi->ai_next)
              {
-               if (memcmp(su, hi->ai_addr, hi->ai_addrlen) == 0) {
+               if (memcmp(&su->su_sin, hi->ai_addr, hi->ai_addrlen) == 0) {
                        thishost = hrp;
+                       find=1;
                        break;
                }
 #ifdef INET6
@@ -806,6 +808,7 @@ 
                            &((struct sockaddr_in *)hi->ai_addr)->sin_addr,
                            sizeof(struct in_addr)) == 0)) {
                        thishost = hrp; 
+                       find=1;
                        break;
                }
 #endif 



>Release-Note:
>Audit-Trail:
>Unformatted:
 >>The su union have not compatible format with sockaddr struct.
 >>Therefore we do not find host which necessary
                         thishost = hrp;
                         break;
 >> When break cause we break the "FOR" cycle not the "while"
 >> Actually even if we find necessary hrp structure we do not break
 >> main "WHILE" cycle ;)
 
                 }
  #ifdef INET6                                                                    
                             &((struct sockaddr_in *)hi->ai_addr)->sin_addr,
                             sizeof(struct in_addr)) == 0)) {                     
                         thishost = hrp;                                          
                         break;
 >> Same problem like described above.
 
                 }                                                                
  #endif   
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000620001015.4F1C437B95F>