summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-03 12:25:46 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-03 15:01:30 -0700
commitff451382aa77966565822918967f77dc9b7ea68d (patch)
tree9248547f2b626fedbf1b098dafbf01cb46b6e143
parentcb22bee6679c593e08278a19627ed459e2d3aac5 (diff)
lib9p: idl.gen: Check for duplicate names and msg type ids
-rw-r--r--lib9p/9p.generated.c59
-rw-r--r--lib9p/idl/2010-9P2000.L.9p2
-rw-r--r--lib9p/idl/__init__.py18
-rw-r--r--lib9p/include/lib9p/9p.generated.h14
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;
};