2727from scapy .error import warning , log_runtime
2828from scapy .interfaces import network_name
2929from scapy .packet import Packet , NoPayload
30- import scapy .packet
3130from scapy .plist import (
3231 PacketList ,
3332 SndRcvList ,
@@ -438,23 +437,22 @@ def __init__(self,
438437 self .rcvcls = streamcls (basecls or conf .raw_layer )
439438 self .metadata : Dict [str , Any ] = {}
440439 self .streamsession : Dict [str , Any ] = {}
441- self .MTU = MTU
440+ self ._buf = b""
442441 super (StreamSocket , self ).__init__ (sock , basecls = basecls )
443442
444443 def recv (self , x = None , ** kwargs ):
445444 # type: (Optional[int], Any) -> Optional[Packet]
446445 if x is None :
447- x = self . MTU
446+ x = MTU
448447 # Block but in PEEK mode
449448 data = self .ins .recv (x , socket .MSG_PEEK )
450449 if data == b"" :
451450 raise EOFError
452451 x = len (data )
453- pkt = self .rcvcls (data , self .metadata , self .streamsession )
452+ pkt = self .rcvcls (self . _buf + data , self .metadata , self .streamsession )
454453 if pkt is None : # Incomplete packet.
455- if len (data ) == self .MTU : # Bigger than MTU. Increase
456- self .MTU *= 2
457- return None
454+ self ._buf += self .ins .recv (x )
455+ return self .recv (x )
458456 self .metadata .clear ()
459457 # Strip any madding
460458 pad = pkt .getlayer (conf .padding_layer )
@@ -471,41 +469,30 @@ def recv(self, x=None, **kwargs):
471469class SSLStreamSocket (StreamSocket ):
472470 desc = "similar usage than StreamSocket but specialized for handling SSL-wrapped sockets" # noqa: E501
473471
472+ # Basically StreamSocket but we can't PEEK
473+
474474 def __init__ (self , sock , basecls = None ):
475475 # type: (socket.socket, Optional[Type[Packet]]) -> None
476- self ._buf = b""
476+ from scapy .sessions import TCPSession
477+ self .sess = TCPSession (app = True )
477478 super (SSLStreamSocket , self ).__init__ (sock , basecls )
478479
479480 # 65535, the default value of x is the maximum length of a TLS record
480481 def recv (self , x = None , ** kwargs ):
481482 # type: (Optional[int], **Any) -> Optional[Packet]
482483 if x is None :
483484 x = MTU
484- pkt = None # type: Optional[Packet]
485- if self ._buf != b"" :
486- try :
487- pkt = self .basecls (self ._buf , ** kwargs )
488- except Exception :
489- # We assume that the exception is generated by a buffer underflow # noqa: E501
490- pass
491-
485+ # Block
486+ data = self .ins .recv (x )
487+ try :
488+ pkt = self .sess .process (data , cls = self .basecls ) # type: ignore
489+ except struct .error :
490+ # Buffer underflow
491+ pkt = None
492+ if data == b"" and not pkt :
493+ raise EOFError
492494 if not pkt :
493- buf = self .ins .recv (x )
494- if len (buf ) == 0 :
495- raise socket .error ((100 , "Underlying stream socket tore down" ))
496- self ._buf += buf
497-
498- x = len (self ._buf )
499- pkt = self .basecls (self ._buf , ** kwargs )
500- if pkt is not None :
501- pad = pkt .getlayer (conf .padding_layer )
502-
503- if pad is not None and pad .underlayer is not None :
504- del pad .underlayer .payload
505- while pad is not None and not isinstance (pad , scapy .packet .NoPayload ): # noqa: E501
506- x -= len (pad .load )
507- pad = pad .payload
508- self ._buf = self ._buf [x :]
495+ return self .recv (x )
509496 return pkt
510497
511498
0 commit comments