• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Виснет на $sock->recv. Perl под Windows.

  • Автор темы DenisPerm
  • Дата начала
D

DenisPerm

Не работает вот такая конструкция:

eval{
local $SIG{ALRM} = sub { die "Net::NTP timed out geting NTP packet\n"; };
alarm($TIMEOUT);
$sock->recv($data,960) or die "recv() failed: $!\n";
alarm(0)
};

Если идет обращение к несуществующему хосту, то виснет на $sock->recv.
Если ответ от хоста есть, то все нормально.

В чем дело и как правильно это реализуется ?
 
V

Vovochka


Хотя тема старая, но кто знает....
 
D

DenisPerm

Нее. Винда точно XP.
Да и сама конструкция alarm работает.
Т. е. если $sock->recv заменить на sleep,
то alarm через TIMEOUT работает.

Виснет именно $sock->recv.

И я ХЗ что с этим делать.
Самый смех, что текст их модуля Net-NTP.
И модулю то 300 лет.
 
V

Vovochka

Хех :)
Может вместо эвала попробовать в поток обернуть?
Хотя вряд ли оно того стоит.
 
E

European

Слабо представляю что делает ваш код на Перле, но все же...
В MSDN (Winsocks v.2) по поводу recv сказано:
If no incoming data is available at the socket, the recv call blocks and waits for data
Т.е. будет висеть пока не пойдут данные.
 
V

Vovochka

В том то и прикол. Этот хак (код) помогает избавиться от блокировки:
Код:
local $SIG{ALRM} = sub { die "Net::NTP timed out geting NTP packet\n"; };
Присваиваем обработчик для сигнала SIGALART
С этим обработчиком при получении сигнала программа должна "умереть", но так как этот участок кода завернут в eval, то просто мы выпадем из этого блока.
Код:
alarm($TIMEOUT);
Заказываем SIGALARM через $TIMEOUT сек.
Код:
$sock->recv($data,960) or die "recv() failed: $!\n";
Блокирующий вызов.
Код:
alarm(0);
Мы не выпали из блока, значит блокирующий вызов завершился. Отказываемся от заказа на SIGALARM
Вот такая вот ботва :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!