@@ -1988,9 +1988,15 @@ class _NDRVarField:
19881988 COUNT_FROM = False
19891989
19901990 def __init__ (self , * args , ** kwargs ):
1991- # size is either from the length_is, if specified, or the "actual_count"
1992- self .from_actual = "length_is" not in kwargs
1993- length_is = kwargs .pop ("length_is" , lambda pkt : pkt .actual_count )
1991+ # We build the length_is function by taking into account both the
1992+ # actual_count (from the varying field) and a potentially provided
1993+ # length_is field.
1994+ if "length_is" in kwargs :
1995+ _length_is = kwargs .pop ("length_is" )
1996+ length_is = lambda pkt : (_length_is (pkt .underlayer ) or pkt .actual_count )
1997+ else :
1998+ length_is = lambda pkt : pkt .actual_count
1999+ # Pass it to the sub-field (actually subclass)
19942000 if self .LENGTH_FROM :
19952001 kwargs ["length_from" ] = length_is
19962002 elif self .COUNT_FROM :
@@ -2008,11 +2014,9 @@ def getfield(self, pkt, s):
20082014 ndrendian = pkt .ndrendian ,
20092015 offset = offset ,
20102016 actual_count = actual_count ,
2017+ _underlayer = pkt ,
20112018 )
2012- if self .from_actual :
2013- remain , val = super (_NDRVarField , self ).getfield (final , remain )
2014- else :
2015- remain , val = super (_NDRVarField , self ).getfield (pkt , remain )
2019+ remain , val = super (_NDRVarField , self ).getfield (final , remain )
20162020 final .value = super (_NDRVarField , self ).i2h (pkt , val )
20172021 return remain , final
20182022
0 commit comments