MCPcopy Create free account
hub / github.com/secdev/scapy / NDRConstructedType

Class NDRConstructedType

scapy/layers/dcerpc.py:1845–1924  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1843
1844
1845class NDRConstructedType(object):
1846 def __init__(self, fields):
1847 self.handles_deferred = False
1848 self.ndr_fields = fields
1849 self.rec_check_deferral()
1850
1851 def rec_check_deferral(self):
1852 # We iterate through the fields within this constructed type.
1853 # If we have a pointer, mark this field as handling deferrance
1854 # and make all sub-constructed types not.
1855 for f in self.ndr_fields:
1856 if isinstance(f, NDRFullPointerField) and f.EMBEDDED:
1857 self.handles_deferred = True
1858 if isinstance(f, NDRConstructedType):
1859 f.rec_check_deferral()
1860 if f.handles_deferred:
1861 self.handles_deferred = True
1862 f.handles_deferred = False
1863
1864 def getfield(self, pkt, s):
1865 s, fval = super(NDRConstructedType, self).getfield(pkt, s)
1866 if isinstance(fval, _NDRPacket):
1867 # If a sub-packet we just dissected has deferred pointers,
1868 # pass it to parent packet to propagate.
1869 pkt.deferred_pointers.extend(fval.deferred_pointers)
1870 del fval.deferred_pointers[:]
1871 if self.handles_deferred:
1872 # This field handles deferral !
1873 s = self.read_deferred_pointers(pkt, s)
1874 return s, fval
1875
1876 def read_deferred_pointers(self, pkt, s):
1877 # Now read content of the pointers that were deferred
1878 q = collections.deque()
1879 q.extend(pkt.deferred_pointers)
1880 del pkt.deferred_pointers[:]
1881 while q:
1882 # Recursively resolve pointers that were deferred
1883 ptr, getfld = q.popleft()
1884 s, val = getfld(s)
1885 ptr.value = val
1886 if isinstance(val, _NDRPacket):
1887 # Pointer resolves to a packet.. that may have deferred pointers?
1888 q.extend(val.deferred_pointers)
1889 del val.deferred_pointers[:]
1890 return s
1891
1892 def addfield(self, pkt, s, val):
1893 try:
1894 s = super(NDRConstructedType, self).addfield(pkt, s, val)
1895 except Exception as ex:
1896 try:
1897 ex.args = (
1898 "While building field '%s': " % self.name + ex.args[0],
1899 ) + ex.args[1:]
1900 except (AttributeError, IndexError):
1901 pass
1902 raise ex

Callers 2

do_dissectMethod · 0.85
do_buildMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…