From ff451382aa77966565822918967f77dc9b7ea68d Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Mon, 3 Feb 2025 12:25:46 -0700 Subject: lib9p: idl.gen: Check for duplicate names and msg type ids --- lib9p/idl/2010-9P2000.L.9p | 2 +- lib9p/idl/__init__.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'lib9p/idl') diff --git a/lib9p/idl/2010-9P2000.L.9p b/lib9p/idl/2010-9P2000.L.9p index 3e5db69..5a7d09c 100644 --- a/lib9p/idl/2010-9P2000.L.9p +++ b/lib9p/idl/2010-9P2000.L.9p @@ -101,7 +101,7 @@ msg Rgetlock = "size[4,val=end-&size] typ[1,val=55] tag[tag] type[1] start[8 msg Tlink = "size[4,val=end-&size] typ[1,val=70] tag[tag] dfid[fid] fid[fid] name[s]" msg Rlink = "size[4,val=end-&size] typ[1,val=71] tag[tag]" msg Tmkdir = "size[4,val=end-&size] typ[1,val=72] tag[tag] dfid[fid] name[s] mode[4] gid[nuid]" -msg Tmkdir = "size[4,val=end-&size] typ[1,val=73] tag[tag] qid[qid]" +msg Rmkdir = "size[4,val=end-&size] typ[1,val=73] tag[tag] qid[qid]" msg Trenameat = "size[4,val=end-&size] typ[1,val=74] tag[tag] olddirfid[fid] oldname[s] newdirfid[fid] newname[s]" msg Rrenameat = "size[4,val=end-&size] typ[1,val=75] tag[tag]" msg Tunlinkat = "size[4,val=end-&size] typ[1,val=76] tag[tag] dirfd[fid] name[s] flags[4]" diff --git a/lib9p/idl/__init__.py b/lib9p/idl/__init__.py index 41664f1..82fa69c 100644 --- a/lib9p/idl/__init__.py +++ b/lib9p/idl/__init__.py @@ -468,6 +468,10 @@ def parse_file( for member in typ.members: if other_version in member.in_versions: member.in_versions.add(version) + if typ.name in env and env[typ.name] != typ: + raise ValueError( + f"duplicate type name {repr(typ.name)}" + ) env[typ.name] = typ if symname != "*" and not found: raise ValueError( @@ -482,6 +486,8 @@ def parse_file( assert isinstance(prim, Primitive) num.prim = prim + if num.name in env: + raise ValueError(f"duplicate type name {repr(num.name)}") env[num.name] = num prev = num elif m := re.fullmatch(re_line_bitfield, line): @@ -495,6 +501,8 @@ def parse_file( bf.bits = (prim.static_size * 8) * [""] + if bf.name in env: + raise ValueError(f"duplicate type name {repr(bf.name)}") env[bf.name] = bf prev = bf elif m := re.fullmatch(re_line_bitfield_, line): @@ -511,6 +519,8 @@ def parse_file( struct.members = [] parse_members(version, env, struct, m.group("members")) + if struct.name in env: + raise ValueError(f"duplicate type name {repr(struct.name)}") env[struct.name] = struct prev = struct case "+=": @@ -527,6 +537,8 @@ def parse_file( msg.members = [] parse_members(version, env, msg, m.group("members")) + if msg.name in env: + raise ValueError(f"duplicate type name {repr(msg.name)}") env[msg.name] = msg prev = msg case "+=": @@ -601,4 +613,10 @@ class Parser: raise ValueError(f"duplicate type name {repr(typ.name)}") else: ret_typs[typ.name] = typ + msgids: set[int] = set() + for typ in ret_typs.values(): + if isinstance(typ, Message): + if typ.msgid in msgids: + raise ValueError(f"duplicate msgid {repr(typ.msgid)}") + msgids.add(typ.msgid) return ret_versions, list(ret_typs.values()) -- cgit v1.2.3-2-g168b