Fix offset bug in func 0x1737, and added code to automatically check

offsets. Bug found by Marcel Cox <marcel.cox@myrealbox.com>

svn path=/trunk/; revision=2389
This commit is contained in:
Gilbert Ramirez 2000-09-06 04:50:51 +00:00
parent 7acf24b370
commit 066c4e8df9
1 changed files with 45 additions and 11 deletions

View File

@ -9,7 +9,18 @@ part of the 0x2222 "family")
Data comes from "Programmer's Guide to the NetWare Core Protocol" Data comes from "Programmer's Guide to the NetWare Core Protocol"
by Steve Conner and Dianne Conner. by Steve Conner and Dianne Conner.
$Id: ncp2222.py,v 1.5 2000/08/30 02:50:00 gram Exp $ Novell provides info at:
http://developer.novell.com/ndk (where you can download an *.exe file which
installs a PDF)
or
http://developer.novell.com/ndk/doc/docui/index.htm#../ncp/ncp__enu/data/
for a badly-formatted HTML version of the same PDF.
$Id: ncp2222.py,v 1.6 2000/09/06 04:50:51 gram Exp $
Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org> Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
@ -132,24 +143,43 @@ class PTVC(NamedList):
self.list = [] self.list = []
NamedList.__init__(self, name, self.list) NamedList.__init__(self, name, self.list)
expected_offset = None
# Make a PTVCRecord object for each list in 'records' # Make a PTVCRecord object for each list in 'records'
for record in records: for record in records:
ptvc_rec = PTVCRecord(record) ptvc_rec = PTVCRecord(record)
if expected_offset == None:
expected_offset = ptvc_rec.Offset()
elif expected_offset == -1:
pass
elif expected_offset != ptvc_rec.Offset():
sys.stderr.write("Expected offset in %s to be %d\n" % (name,
expected_offset))
sys.exit(1)
# We can't make a PTVC list from a variable-length # We can't make a PTVC list from a variable-length
# packet. XXX - unless it's FT_UINT_STRING # packet, unless it's FT_UINT_STRING
# if type(ptvc_rec.Length()) == type(()): if type(ptvc_rec.Length()) == type(()):
# if ptvc_rec.Field() == nstring8: if isinstance(ptvc_rec.Field(), nstring8):
# pass expected_offset = -1
# else: pass
# self.list = None else:
# return self.list = None
return
elif expected_offset > -1:
expected_offset = expected_offset + ptvc_rec.Length()
self.list.append(ptvc_rec) self.list.append(ptvc_rec)
class PTVCRecord: class PTVCRecord:
def __init__(self, record): def __init__(self, record):
"Constructor" "Constructor"
self.offset = record[0]
self.length = record[1] self.length = record[1]
self.field = record[2] self.field = record[2]
@ -211,6 +241,8 @@ class PTVCRecord:
return "{ &%s, %s, %s }" % (self.field.HFName(), return "{ &%s, %s, %s }" % (self.field.HFName(),
length, endianness) length, endianness)
def Offset(self):
return self.offset
def Length(self): def Length(self):
return self.length return self.length
@ -962,7 +994,9 @@ errors[0xff18] = "The file already exists"
errors[0xff19] = "No files found" errors[0xff19] = "No files found"
############################################################################## ##############################################################################
# NCP Packets # NCP Packets. Here I list functions and subfunctions in hexadecimal like the
# NCP book (and I believe LanAlyzer does this too).
# However, Novell lists these in decimal in their on-line documentation.
############################################################################## ##############################################################################
# 2222/02 # 2222/02
pkt = NCP(0x02, "File Release Lock", 'sync') pkt = NCP(0x02, "File Release Lock", 'sync')
@ -1077,7 +1111,7 @@ pkt = NCP(0x1737, "Scan Bindery Object", 'bindery')
pkt.Request((17,64), [ pkt.Request((17,64), [
[ 10, 4, ObjectID ], [ 10, 4, ObjectID ],
[ 14, 2, ObjectType ], [ 14, 2, ObjectType ],
[ 12, (1,48), ObjectName ], [ 16, (1,48), ObjectName ],
]) ])
pkt.Reply(65, [ pkt.Reply(65, [
[ 8, 4, ObjectID ], [ 8, 4, ObjectID ],