Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Eugene Grosbein                      2:5006/1       06 May 2004  20:35:57
 To : Eugene Grosbein
 Subject : Re: ftpd и euid
 -------------------------------------------------------------------------------- 
 
 
  OK>>> Если сокет создан не рутом, то под нагрузкой получишь
  OK>>> EADDRINUSE при попытке bind() на 20 порт.
  OK>>> Если нагрузка маленькая или если сокет создан рутом,
  OK>>> то нормально биндиться...
  >>> Давно ты сталкивался? Потому что лишь относительно недавно
  >>> ftpd стал использовать setsockopt для REUSE. Вообще надо потестировать...
 
  EG> Да, это я с пассивным режимом перепутал. Ты совершенно прав, ftpd
  EG> получает EADDRINUSE и ложится в спячку...
 
 Вот только EADDRINUSE он получает вовсе не от bind() и не в том месте кода.
 А вот тут:
 
 0x281351b4 in nanosleep () from /usr/lib/libc.so.4
 (gdb) bt
 #0  0x281351b4 in nanosleep () from /usr/lib/libc.so.4
 #1  0x28100a26 in sleep () from /usr/lib/libc.so.4
 #2  0x804e8fd in dataconn (name=0xbfbfed10 "/bin/ls", size=-1,
     mode=0x80583e9 "w") at /usr/local/src/libexec/ftpd/ftpd.c:1946
 #3  0x804dc1e in retrieve (cmd=0x805b23e "/bin/ls -lgA %s",
     name=0xbfbfed10 "/bin/ls") at /usr/local/src/libexec/ftpd/ftpd.c:1674
 #4  0x8053b02 in yyparse () at /usr/local/src/libexec/ftpd/ftpcmd.y:495
 #5  0x804ba99 in main (argc=2, argv=0xbfbffce8, envp=0xbfbffcf4)
     at /usr/local/src/libexec/ftpd/ftpd.c:639
 
 То есть, от connect() после вполне успешного bind():
 
                 file = getdatasock(mode);
    ...
                 data = fileno(file);
                 conerrno = 0;
                 if (connect(data, (struct sockaddr *)&data_dest,
                     data_dest.su_len) == 0)
                         break;
                 conerrno = errno;
                 (void) fclose(file);
                 data = -1;
                 if (conerrno == EADDRINUSE) {
                         sleep((unsigned) swaitint);
                         retry += swaitint;
                 }
 
 И дело все в клиенте. А клиенту знаете что мешает?
 А мешает ему, в меньшей степени, net.inet.ip.portrange.last=5000,
 но в гораздо большей степени net.inet.ip.portrange.randomized=1.
 
 У кого затыки были, повторите свои опыты с 
 sysctl net.inet.ip.portrange.randomized=0.
 
 Поискав ipport_randomized в sys/netinet/in_pcb.c, наверное,
 можно догадаться, почему с отключенной рандомизацией проблема исчезает.
 
 Eugene
 -- 
 "Люди забыли эту истину," - сказал Лис, - "но ты не забывай"
 --- slrn/0.9.8.0 (FreeBSD)
  * Origin: Svyaz Service JSC (2:5006/1@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: ftpd и euid   Eugene Grosbein   26 Apr 2004 21:07:06 
 Re: ftpd и euid   Eugene Grosbein   06 May 2004 20:35:57 
Архивное /ru.unix.bsd/2609300a3d702.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional