| 1843 | |
| 1844 | |
| 1845 | class 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 |
no outgoing calls
no test coverage detected
searching dependent graphs…