diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-02-03 12:25:46 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-02-03 15:01:30 -0700 |
commit | ff451382aa77966565822918967f77dc9b7ea68d (patch) | |
tree | 9248547f2b626fedbf1b098dafbf01cb46b6e143 | |
parent | cb22bee6679c593e08278a19627ed459e2d3aac5 (diff) |
lib9p: idl.gen: Check for duplicate names and msg type ids
-rw-r--r-- | lib9p/9p.generated.c | 59 | ||||
-rw-r--r-- | lib9p/idl/2010-9P2000.L.9p | 2 | ||||
-rw-r--r-- | lib9p/idl/__init__.py | 18 | ||||
-rw-r--r-- | lib9p/include/lib9p/9p.generated.h | 14 |
4 files changed, 85 insertions, 8 deletions
diff --git a/lib9p/9p.generated.c b/lib9p/9p.generated.c index df81d25..8e3e26b 100644 --- a/lib9p/9p.generated.c +++ b/lib9p/9p.generated.c @@ -133,6 +133,7 @@ const char * _lib9p_table_msg_name[LIB9P_VER_NUM][0x100] = { _MSG_NAME(Tlink), _MSG_NAME(Rlink), _MSG_NAME(Tmkdir), + _MSG_NAME(Rmkdir), _MSG_NAME(Trenameat), _MSG_NAME(Rrenameat), _MSG_NAME(Tunlinkat), @@ -1418,6 +1419,25 @@ LM_FLATTEN static bool validate_Tmknod(struct _validate_ctx *ctx) { ; } +LM_FLATTEN static bool validate_Tmkdir(struct _validate_ctx *ctx) { + uint32_t size; + uint8_t typ; + uint32_t _size_offset; + return false + || (({ _size_offset = ctx->net_offset; validate_4(ctx); }) || ({ size = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) + || (validate_1(ctx) || ({ typ = ctx->net_bytes[ctx->net_offset-1]; false; })) + || validate_tag(ctx) + || validate_fid(ctx) + || validate_s(ctx) + || validate_4(ctx) + || validate_nuid(ctx) + || ({ uint32_t exp = ctx->net_offset - _size_offset; (((uint32_t)size) != exp) && + lib9p_errorf(ctx->ctx, LINUX_EBADMSG, "size value is wrong (actual:%"PRIu32" != correct:%"PRIu32")", (uint32_t)size, exp); }) + || ({ uint8_t exp = 72; (((uint8_t)typ) != exp) && + lib9p_errorf(ctx->ctx, LINUX_EBADMSG, "typ value is wrong (actual:%"PRIu8" != correct:%"PRIu8")", (uint8_t)typ, exp); }) + ; +} + #endif /* CONFIG_9P_ENABLE_9P2000_L */ #if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_u LM_FLATTEN static bool validate_Topen(struct _validate_ctx *ctx) { @@ -1760,7 +1780,7 @@ LM_FLATTEN static bool validate_Rgetattr(struct _validate_ctx *ctx) { ; } -LM_FLATTEN static bool validate_Tmkdir(struct _validate_ctx *ctx) { +LM_FLATTEN static bool validate_Rmkdir(struct _validate_ctx *ctx) { uint32_t size; uint8_t typ; uint32_t _size_offset; @@ -2447,6 +2467,17 @@ LM_FLATTEN static void unmarshal_Tmknod(struct _unmarshal_ctx *ctx, struct lib9p unmarshal_nuid(ctx, &out->gid); } +LM_FLATTEN static void unmarshal_Tmkdir(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tmkdir *out) { + memset(out, 0, sizeof(*out)); + ctx->net_offset += 4; + ctx->net_offset += 1; + unmarshal_tag(ctx, &out->tag); + unmarshal_fid(ctx, &out->dfid); + unmarshal_s(ctx, &out->name); + unmarshal_4(ctx, &out->mode); + unmarshal_nuid(ctx, &out->gid); +} + #endif /* CONFIG_9P_ENABLE_9P2000_L */ #if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_u LM_FLATTEN static void unmarshal_Topen(struct _unmarshal_ctx *ctx, struct lib9p_msg_Topen *out) { @@ -2656,7 +2687,7 @@ LM_FLATTEN static void unmarshal_Rgetattr(struct _unmarshal_ctx *ctx, struct lib unmarshal_8(ctx, &out->data_version); } -LM_FLATTEN static void unmarshal_Tmkdir(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tmkdir *out) { +LM_FLATTEN static void unmarshal_Rmkdir(struct _unmarshal_ctx *ctx, struct lib9p_msg_Rmkdir *out) { memset(out, 0, sizeof(*out)); ctx->net_offset += 4; ctx->net_offset += 1; @@ -3601,6 +3632,22 @@ LM_FLATTEN static bool marshal_Tmknod(struct _marshal_ctx *ctx, struct lib9p_msg ; } +LM_FLATTEN static bool marshal_Tmkdir(struct _marshal_ctx *ctx, struct lib9p_msg_Tmkdir *val) { + uint32_t _size_offset; + uint32_t _typ_offset; + return false + || ({ _size_offset = ctx->net_offset; ({ ctx->net_offset += 4; false; }); }) + || ({ _typ_offset = ctx->net_offset; ({ ctx->net_offset += 1; false; }); }) + || marshal_tag(ctx, &val->tag) + || marshal_fid(ctx, &val->dfid) + || marshal_s(ctx, &val->name) + || marshal_4(ctx, &val->mode) + || marshal_nuid(ctx, &val->gid) + || ({ uint32le_encode(&ctx->net_bytes[_size_offset], ctx->net_offset - _size_offset); false; }) + || ({ ctx->net_bytes[_typ_offset] = 72; false; }) + ; +} + #endif /* CONFIG_9P_ENABLE_9P2000_L */ #if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_u LM_FLATTEN static bool marshal_Topen(struct _marshal_ctx *ctx, struct lib9p_msg_Topen *val) { @@ -3894,7 +3941,7 @@ LM_FLATTEN static bool marshal_Rgetattr(struct _marshal_ctx *ctx, struct lib9p_m ; } -LM_FLATTEN static bool marshal_Tmkdir(struct _marshal_ctx *ctx, struct lib9p_msg_Tmkdir *val) { +LM_FLATTEN static bool marshal_Rmkdir(struct _marshal_ctx *ctx, struct lib9p_msg_Rmkdir *val) { uint32_t _size_offset; uint32_t _typ_offset; return false @@ -3995,6 +4042,7 @@ const struct _lib9p_recv_tentry _lib9p_table_Tmsg_recv[LIB9P_VER_NUM][0x80] = { _MSG_RECV(Tlock), _MSG_RECV(Tgetlock), _MSG_RECV(Tlink), + _MSG_RECV(Tmkdir), _MSG_RECV(Trenameat), _MSG_RECV(Tunlinkat), _MSG_RECV(Tversion), @@ -4089,7 +4137,7 @@ const struct _lib9p_recv_tentry _lib9p_table_Rmsg_recv[LIB9P_VER_NUM][0x80] = { _MSG_RECV(Rlock), _MSG_RECV(Rgetlock), _MSG_RECV(Rlink), - _MSG_RECV(Tmkdir), + _MSG_RECV(Rmkdir), _MSG_RECV(Rrenameat), _MSG_RECV(Runlinkat), _MSG_RECV(Rversion), @@ -4184,6 +4232,7 @@ const struct _lib9p_send_tentry _lib9p_table_Tmsg_send[LIB9P_VER_NUM][0x80] = { _MSG_SEND(Tlock), _MSG_SEND(Tgetlock), _MSG_SEND(Tlink), + _MSG_SEND(Tmkdir), _MSG_SEND(Trenameat), _MSG_SEND(Tunlinkat), _MSG_SEND(Tversion), @@ -4278,7 +4327,7 @@ const struct _lib9p_send_tentry _lib9p_table_Rmsg_send[LIB9P_VER_NUM][0x80] = { _MSG_SEND(Rlock), _MSG_SEND(Rgetlock), _MSG_SEND(Rlink), - _MSG_SEND(Tmkdir), + _MSG_SEND(Rmkdir), _MSG_SEND(Rrenameat), _MSG_SEND(Runlinkat), _MSG_SEND(Rversion), 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()) diff --git a/lib9p/include/lib9p/9p.generated.h b/lib9p/include/lib9p/9p.generated.h index 99bc4ce..7147e8e 100644 --- a/lib9p/include/lib9p/9p.generated.h +++ b/lib9p/include/lib9p/9p.generated.h @@ -82,7 +82,8 @@ enum lib9p_msg_type { /* uint8_t */ LIB9P_TYP_Rgetlock = 55, LIB9P_TYP_Tlink = 70, LIB9P_TYP_Rlink = 71, - LIB9P_TYP_Tmkdir = 73, + LIB9P_TYP_Tmkdir = 72, + LIB9P_TYP_Rmkdir = 73, LIB9P_TYP_Trenameat = 74, LIB9P_TYP_Rrenameat = 75, LIB9P_TYP_Tunlinkat = 76, @@ -826,6 +827,15 @@ struct lib9p_msg_Tmknod { lib9p_nuid_t gid; }; +/* min_size = 21 ; max_size = 65,556 */ +struct lib9p_msg_Tmkdir { + lib9p_tag_t tag; + lib9p_fid_t dfid; + struct lib9p_s name; + uint32_t mode; + lib9p_nuid_t gid; +}; + #endif /* CONFIG_9P_ENABLE_9P2000_L */ #if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_u /* size = 12 */ @@ -1002,7 +1012,7 @@ struct lib9p_msg_Rgetattr { }; /* size = 20 */ -struct lib9p_msg_Tmkdir { +struct lib9p_msg_Rmkdir { lib9p_tag_t tag; struct lib9p_qid qid; }; |