1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-08 21:51:28 +00:00

Define in-use-but-undefined ScriptDBSyntaxError

Subclassed SyntaxError to provide some useful info when this happens. It
was happening with unittest.nse because it wasn't part of any category.
Previously, this would crash Zenmap because ScriptDBSyntaxError was
undefined. Now it crashes because there's really a syntax error (fixed
in previous revision)
This commit is contained in:
dmiller
2014-01-21 22:17:16 +00:00
parent 2ea4934bbf
commit 8a07146936

View File

@@ -132,6 +132,11 @@ from zenmapCore.Paths import Path
from zenmapCore.UmitLogging import log from zenmapCore.UmitLogging import log
class ScriptDBSyntaxError(SyntaxError):
"""Exception raised when encountering a syntax error in the script.db"""
pass
class ScriptDB (object): class ScriptDB (object):
"""Class responsible for parsing the script.db file, fetching script """Class responsible for parsing the script.db file, fetching script
names and categories.""" names and categories."""
@@ -144,21 +149,38 @@ class ScriptDB (object):
self.unget_buf = "" self.unget_buf = ""
self.f = open(script_db_path, "r") self.f = open(script_db_path, "r")
self.lineno = 1
self.line = ""
try: try:
self.entries_list = self.parse() self.entries_list = self.parse()
finally: finally:
self.f.close() self.f.close()
def syntax_error(self, message):
e = ScriptDBSyntaxError(message)
e.filename = self.f.name
e.lineno = self.lineno
e.offset = len(self.line)
e.text = self.line
return e
def getchar(self): def getchar(self):
c = None
if self.unget_buf: if self.unget_buf:
c = self.unget_buf[-1] c = self.unget_buf[-1]
self.unget_buf = self.unget_buf[:-1] self.unget_buf = self.unget_buf[:-1]
return c
else: else:
return self.f.read(1) c = self.f.read(1)
if c == "\n":
self.lineno += 1
self.line = ""
else:
self.line += c
return c
def unget(self, data): def unget(self, data):
if data: if data:
self.line = self.line[:-len(data)]
self.unget_buf += data self.unget_buf += data
def parse(self): def parse(self):
@@ -199,7 +221,7 @@ class ScriptDB (object):
repl = None repl = None
c = self.getchar() c = self.getchar()
if not c: if not c:
raise ScriptDBSyntaxError() raise self.syntax_error("Unexpected EOF")
if c.isdigit(): if c.isdigit():
d1 = c d1 = c
d2 = self.getchar() d2 = self.getchar()
@@ -207,7 +229,8 @@ class ScriptDB (object):
if d1 and d2 and d3: if d1 and d2 and d3:
n = int(d1 + d2 + d3) n = int(d1 + d2 + d3)
if n > 255: if n > 255:
raise ScriptDBSyntaxError() raise self.syntax_error(
"Character code >255")
repl = chr(n) repl = chr(n)
else: else:
self.unget(d3) self.unget(d3)
@@ -215,7 +238,7 @@ class ScriptDB (object):
if not repl: if not repl:
repl = self.LUA_STRING_ESCAPES.get(c) repl = self.LUA_STRING_ESCAPES.get(c)
if not repl: if not repl:
raise ScriptDBSyntaxError() raise self.syntax_error("Unhandled string escape")
c = repl c = repl
string.append(c) string.append(c)
c = self.getchar() c = self.getchar()
@@ -223,13 +246,15 @@ class ScriptDB (object):
elif c in "{},=": elif c in "{},=":
return ("delim", c) return ("delim", c)
else: else:
raise ScriptDBSyntaxError() raise self.syntax_error("Unknown token")
def expect(self, tokens): def expect(self, tokens):
for token in tokens: for token in tokens:
t = self.token() t = self.token()
if t != token: if t != token:
raise ScriptDBSyntaxError() raise self.syntax_error(
"Unexpected token '%s', expected '%s'" % (
t[1], token[1]))
def parse_entry(self): def parse_entry(self):
entry = {} entry = {}
@@ -239,7 +264,7 @@ class ScriptDB (object):
self.expect((("delim", "{"), ("ident", "filename"), ("delim", "="))) self.expect((("delim", "{"), ("ident", "filename"), ("delim", "=")))
token = self.token() token = self.token()
if not token or token[0] != "string": if not token or token[0] != "string":
raise ScriptDBSyntaxError() raise self.syntax_error("Unexpected non-string token or EOF")
entry["filename"] = token[1] entry["filename"] = token[1]
self.expect((("delim", ","), ("ident", "categories"), self.expect((("delim", ","), ("ident", "categories"),
("delim", "="), ("delim", "{"))) ("delim", "="), ("delim", "{")))
@@ -256,12 +281,14 @@ class ScriptDB (object):
break break
token = self.token() token = self.token()
if token != ("delim", "}"): if token != ("delim", "}"):
raise ScriptDBSyntaxError() raise self.syntax_error(
"Unexpected token '%s', expected '}'" % (token[1]))
token = self.token() token = self.token()
if token == ("delim", ","): if token == ("delim", ","):
token = self.token() token = self.token()
if token != ("delim", "}"): if token != ("delim", "}"):
raise ScriptDBSyntaxError() raise self.syntax_error(
"Unexpected token '%s', expected '}'" % (token[1]))
return entry return entry
def get_entries_list(self): def get_entries_list(self):
@@ -472,7 +499,8 @@ def get_script_entries(scripts_dir, nselib_dir):
return entries return entries
if __name__ == '__main__': if __name__ == '__main__':
for entry in get_script_entries(): import sys
for entry in get_script_entries(sys.argv[1], sys.argv[2]):
print "*" * 75 print "*" * 75
print "Filename:", entry.filename print "Filename:", entry.filename
print "Categories:", entry.categories print "Categories:", entry.categories