LINUX.ORG.RU

Кривой pcapy-ng

 ,


0

2

Из доков к pcapy:

int dispatch (	maxcant, 	 
 	(* callback));	 
int maxcant ;
void (* callback) (Pkthdr, string) ;

callback specifies a routine to be called with two arguments: a Pkthdr instance describing the data passed and the data itself.

На деле функции никакие аргументы не передаются:

In [238]: import pcapy

In [239]: reader = pcapy.open_offline(my_pcap_file)

In [240]: reader.dispatch(-1, lambda hdr, data: print(hdr.caplen()))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
TypeError: <lambda>() missing 2 required positional arguments: 'hdr' and 'data'

The above exception was the direct cause of the following exception:

SystemError                               Traceback (most recent call last)
<ipython-input-240-c10b6d091522> in <module>
----> 1 reader.dispatch(-1, lambda hdr, data: print(hdr.caplen()))

SystemError: <built-in method dispatch of Reader object at 0x7fad32317a90> returned a result with an exception set

Очевидно, что ошибка где-то здесь: https://github.com/stamparm/pcapy-ng/blob/master/pcapobj.cc

т.к. в CL у которого plokami:capture поверх того же pcap_dispatch всё работает на ура:

CL-USER> (block b
           (plokami:with-pcap-reader (reader *my-pcap-file*)
             (plokami:set-filter reader "udp")
             (plokami:capture reader -1
                              (lambda (sec usec caplen len buffer)
                                (declare (ignore sec usec buffer))
                                (when (/= caplen len)
                                  (return-from b nil))
                                (format t "Packet length: ~A bytes, on the wire: ~A bytes~%"
                                        caplen len))))
           t)
Packet length: 76 bytes, on the wire: 76 bytes
Packet length: 76 bytes, on the wire: 76 bytes
Packet length: 92 bytes, on the wire: 92 bytes
Packet length: 135 bytes, on the wire: 135 bytes
Packet length: 76 bytes, on the wire: 76 bytes
Packet length: 92 bytes, on the wire: 92 bytes
Packet length: 74 bytes, on the wire: 74 bytes
Packet length: 74 bytes, on the wire: 74 bytes
Packet length: 173 bytes, on the wire: 173 bytes
Packet length: 197 bytes, on the wire: 197 bytes
Packet length: 84 bytes, on the wire: 84 bytes
Packet length: 84 bytes, on the wire: 84 bytes
Packet length: 144 bytes, on the wire: 144 bytes
Packet length: 156 bytes, on the wire: 156 bytes
Packet length: 76 bytes, on the wire: 76 bytes
Packet length: 92 bytes, on the wire: 92 bytes
Packet length: 79 bytes, on the wire: 79 bytes
Packet length: 79 bytes, on the wire: 79 bytes
Packet length: 95 bytes, on the wire: 95 bytes
Packet length: 107 bytes, on the wire: 107 bytes
Packet length: 72 bytes, on the wire: 72 bytes
Packet length: 72 bytes, on the wire: 72 bytes
Packet length: 152 bytes, on the wire: 152 bytes
Packet length: 100 bytes, on the wire: 100 bytes
Packet length: 76 bytes, on the wire: 76 bytes
Packet length: 92 bytes, on the wire: 92 bytes
T
★★★★★

Так напиши в issues проекта на гитхабе

cobold ★★★★★
()
4 апреля 2022 г.

Добрый вечер, ados!

А можно, плз, расписать алгоритм воспроизведения обнаруженной Вами проблемы? Потому как из общего описания неясно как её воспроизводить, а приведенной информации недостаточно. Спасибо!

k_mikhail
()
Ответ на: комментарий от k_mikhail
In [238]: import pcapy

In [239]: reader = pcapy.open_offline(my_pcap_file)

In [240]: reader.dispatch(-1, lambda hdr, data: print(hdr.caplen()))
ados ★★★★★
() автор топика
Ответ на: комментарий от ados

Я понял. А проверьте, плз, воспроизводимость на версии 1.0.7. Ибо с нашей стороны (в частности, у Мирослава) пока не получается воспроизвести проблему… :( Спасибо!

k_mikhail
()
Ответ на: комментарий от k_mikhail
In [1]: import pcapy

In [4]: import subprocess

In [6]: subprocess.call(["pacman", "-Qo", pcapy.__file__])
/usr/lib/python3.10/site-packages/pcapy.cpython-310-x86_64-linux-gnu.so is owned by python-pcapy 1.0.7-1
Out[6]: 0

In [9]: pcap_file = '/tmp/p.pcap'

In [10]: reader = pcapy.open_offline(pcap_file)

In [11]: reader.dispatch(-1, lambda hdr, data: print(hdr.caplen()))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
TypeError: <lambda>() missing 2 required positional arguments: 'hdr' and 'data'

The above exception was the direct cause of the following exception:

SystemError                               Traceback (most recent call last)
<ipython-input-11-c10b6d091522> in <module>
----> 1 reader.dispatch(-1, lambda hdr, data: print(hdr.caplen()))

SystemError: <built-in method dispatch of Reader object at 0x7eff27916610> returned a result with an exception set
ados ★★★★★
() автор топика
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

Отлично! Спасибо за перепроверку и за само сообщение об ошибке.

В принципе, если что, не стесняйтесь писать об обнаруженных проблемах pcapy-ng прямо в гитхаб: https://github.com/stamparm/pcapy-ng/issues , потому как я почти случайно набрёл на данную тему.

Ещё раз спасибо за вашу работу!

k_mikhail
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.