Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pdfdump crashes with UnicodeEncodeError #4319

Open
Abbath opened this issue Mar 15, 2024 · 7 comments
Open

pdfdump crashes with UnicodeEncodeError #4319

Abbath opened this issue Mar 15, 2024 · 7 comments

Comments

@Abbath
Copy link

Abbath commented Mar 15, 2024

Brief description

When dumping packets with random bytes the following happens:

Traceback (most recent call last):
  File "/home/user/test2.py", line 10, in <module>
    packet.pdfdump("test.pdf")
  File "/home/user/.local/lib/python3.10/site-packages/scapy/base_classes.py", line 474, in pdfdump
    canvas = self.canvas_dump(**kargs)
  File "/home/user/.local/lib/python3.10/site-packages/scapy/packet.py", line 930, in canvas_dump
    vt = pyx.text.text(XSTART + 3.5, (YTXT - y) * YMUL, r"\font\cmssfont=cmss10\cmssfont{%s}" % tex_escape(fval))  # noqa: E501
  File "/home/user/.local/lib/python3.10/site-packages/pyx/text.py", line 1455, in wrapped
    return f(self, *args, **kwargs)
  File "/home/user/.local/lib/python3.10/site-packages/pyx/text.py", line 1491, in text
    return self.instance.text(*args, **kwargs)
  File "/home/user/.local/lib/python3.10/site-packages/pyx/text.py", line 1331, in text
    return self.text_pt(unit.topt(x), unit.topt(y), *args, **kwargs)
  File "/home/user/.local/lib/python3.10/site-packages/pyx/text.py", line 1305, in text_pt
    left_pt, right_pt, height_pt, depth_pt = self.do_typeset(expr, self.texmessages_run_default + self.texmessages_run + texmessages)
  File "/home/user/.local/lib/python3.10/site-packages/pyx/text.py", line 1225, in do_typeset
    return self._execute(expr, texmessages, STATE_TYPESET, STATE_TYPESET)
  File "/home/user/.local/lib/python3.10/site-packages/pyx/text.py", line 1085, in _execute
    expr.encode(self.texenc)
UnicodeEncodeError: 'ascii' codec can't encode character '\u0700' in position 32: ordinal not in range(128)

It seems that texenc in pyx is set to default ASCII. If I change it to 'utf-8' everything works fine.

Scapy version

2.5.0

Python version

3.10

Operating system

Kubuntu 22.04

Additional environment information

No response

How to reproduce

This will eventually fail

from scapy.layers.inet import Ether, UDP, IP
from scapy.compat import raw
import numpy as np
import time

while True:
  packet = Ether(dst="00:00:00:00:00:00", src="00:00:00:00:00:00", type=0x800)/IP(src="0.0.0.0", dst="0.0.0.0")/UDP(sport=0, dport=0)
  packet = packet/raw(np.random.bytes(512))
  packet.pdfdump("test.pdf")
  time.sleep(1)

Actual result

Exception

Expected result

A PDF

Related resources

No response

@guedou
Copy link
Member

guedou commented Mar 15, 2024

Thanks for your report. Can you share a single packet that reproduce the issue?

@Abbath
Copy link
Author

Abbath commented Mar 15, 2024

example.zip

<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:00 type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=540 id=1 flags= frag=0 ttl=64 proto=udp chksum=0x78d1 src=0.0.0.0 dst=0.0.0.0 |<UDP  sport=0 dport=0 len=520 chksum=0x93d8 |<Raw  load='\\xb0o߂\\x98\\xbc\n\\xd8y\x14Z\\x97\x02G+m_\\xa9\\xfb\\xed&\\x90S\\xf5c:\\x98\\xf2\\xa3c0/R\\x89\\xf8\\x98\\xfd\\xc2ɒ\\\\xd1X\\x89gqQ\\x87\\xe9\x04\\x8dcI\\x80[mf\\xf3m\x1cAS\\x82y\\xc9=#\\x91\\xc7*j\\xf2\\xba|\\xb4\x0b\\\\x82/\\xf4\x1c\\xd0X\\x97\\xccoT\\xfd\\xfd[\x03G\\xb8b\\xe9N\\xc8\\\\x9f\\x9f"oq{\\xed\\xeb\\xfe\x1d?7\\xf9\\xe4N\\xf5\\xc5>\\xe5q\\x9f\\x8c9\\xac\\xb5\\xe4B\\xcal\\xab\x08\\xf4P)\\xe7\x00\\xda`\\x84q\t\\xd0\x16t \\xe6\\xaf\\xc5\x0b\\xe9\\xf6\\xa8}#{/\\xac\\xc3}\x17[6\\x97E\\x8dB\\xc7T#9\x05R?\\x97\\x87\\xc0\\xe5Vg\\x87)\\x8ab\\x92\\xc8]f\x1a\\xed\\xc0\\x8f^\\xe7鏄^\\x86q\x0f\\x96\\x84\\xa14\x13l\\xea\\xfb\x0cd\\xa2\\xcc1L\\xfdT\\x93+\\xec!b@l|\\xb3\\xedw\\xed\\x82Q\\xe7\\xeb}x\\xfcl8\\xcd̹\u05eb\\x98\\xbb\t|\\xe4\\\xc9"\\xfcy-ɤVMw]\\xfc}\x01\x17\\xc7&\x03\\xe0A\x0f\\xfd3\x06o4\\x83\\xd1]\\xa3\\xd9\'`,\\xae\\x9c\\xd4\\xfa\\x97\\x9b\x0f\\xe6\'ܡ\\xb2\\xab\\xf1\\xe3o5p\\xcds(\x119\\xb6p\\xd2_>\\xddL\\xf6M\x18}\\x92\x16moE|\x14Du\\x97-\\xf0\\xfe\\xc7\\xf7\\xe1\\xf9\\xae\\xdc-_\x05Vi\\xab\\xaa>\\xf0\\xb0\x01\\x84\\x89<Bt\\xfb\\xa7\\x8c\x01tX8*\\x92\\x95YM\\xf1\\xfb\\xc7\x13\\xc1\\xe7\\xd1%5\\xa0\\x83\\xa8}!\\xa6\\xea3\\xa8\\xc7\\xd4[\x1c\\xbc\\x98_tw\\xee)\\x92JP\\xfe\\x8c\\xcdS\\xbc\\xbc\\xa3\r\\x88\\x91͙\x19\x06\\xc5\\xfd\\xbb\x1b\x7fη\\xa7/K\\xe8lWe.\x1d"\x11\x01\\xf7\\xd7U\\xfdF\x1c\\xcbkL\\\xa2\x14g\x17\\x8f\\xb4\\x8ecn\\xa1\\xc3\\xd3Ҩ\\x9fJ\\x91\x13C\\xb7\\xb9x\\xf1R\\xae=7S\x7f\\xdd\\xd1eY\\x92H+u\\xbb\\x9ba\\xa9\\xf5\x07\\xf8\x0e#\\xcd\\xccgਁ\\xa8ۣ\\xb6\\xb3\\xc3@\x03#\\xb7\\xd9\ \r\x7f\\x9c\x04\\x9c\\xd0`\\xa4^@V\\xbf\\x96\\xb5%' |>>>>

@guedou
Copy link
Member

guedou commented Mar 16, 2024 via email

@Abbath
Copy link
Author

Abbath commented Mar 16, 2024

Pcap is inside the example.zip

@guedou
Copy link
Member

guedou commented Mar 16, 2024

Sorry, I haven't seen the zip file in the GitHub email. What's the fix that you propose?

@gpotter2 gpotter2 added this to the 2.6.0 milestone Mar 23, 2024
@Abbath
Copy link
Author

Abbath commented Mar 25, 2024

I propose to add some additional escaping somewhere in Packet.canvas_dump

                if isinstance(fval, str):
                    #HERE MAYBE?
                    if len(fval) > 18:
                        fval = fval[:18] + "[...]"
                else:
                    fval = ""

Changing PyX to unicode breaks LaTeX.
Changing Packet representation in general may break something else.

@gpotter2
Copy link
Member

I can't replicate. Your example.zip works just fine for me.

@gpotter2 gpotter2 removed this from the 2.6.0 milestone Apr 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants