diff options
-rw-r--r-- | lib9p/9p.generated.c | 48 | ||||
-rwxr-xr-x | lib9p/idl.gen | 19 |
2 files changed, 30 insertions, 37 deletions
diff --git a/lib9p/9p.generated.c b/lib9p/9p.generated.c index 98ec7bf..eca0666 100644 --- a/lib9p/9p.generated.c +++ b/lib9p/9p.generated.c @@ -431,7 +431,7 @@ LM_ALWAYS_INLINE static bool validate_s(struct _validate_ctx *ctx) { uint16_t len; return false || (validate_2(ctx) || ({ len = uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]); false; })) - || _validate_list(ctx, len, validate_1, sizeof(uint8_t)) + || _validate_size_net(ctx, len) || ({ (!is_valid_utf8_without_nul(&ctx->net_bytes[ctx->net_offset-len], len)) && lib9p_error(ctx->ctx, LINUX_EBADMSG, "message contains invalid UTF-8"); }) ; } @@ -561,7 +561,7 @@ LM_FLATTEN static bool validate_Rread(struct _validate_ctx *ctx) { || (validate_1(ctx) || ({ typ = ctx->net_bytes[ctx->net_offset-1]; false; })) || validate_tag(ctx) || (validate_4(ctx) || ({ count = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) - || _validate_list(ctx, count, validate_1, sizeof(uint8_t)) + || _validate_size_net(ctx, count) || ({ 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 = 117; (((uint8_t)typ) != exp) && @@ -750,7 +750,7 @@ LM_FLATTEN static bool validate_Rreaddir(struct _validate_ctx *ctx) { || (validate_1(ctx) || ({ typ = ctx->net_bytes[ctx->net_offset-1]; false; })) || validate_tag(ctx) || (validate_4(ctx) || ({ count = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) - || _validate_list(ctx, count, validate_1, sizeof(uint8_t)) + || _validate_size_net(ctx, count) || ({ 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 = 41; (((uint8_t)typ) != exp) && @@ -861,7 +861,7 @@ LM_FLATTEN static bool validate_Rsread(struct _validate_ctx *ctx) { || (validate_1(ctx) || ({ typ = ctx->net_bytes[ctx->net_offset-1]; false; })) || validate_tag(ctx) || (validate_4(ctx) || ({ count = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) - || _validate_list(ctx, count, validate_1, sizeof(uint8_t)) + || _validate_size_net(ctx, count) || ({ 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 = 153; (((uint8_t)typ) != exp) && @@ -924,7 +924,7 @@ LM_FLATTEN static bool validate_Twrite(struct _validate_ctx *ctx) { || validate_fid(ctx) || (validate_8(ctx) || ({ offset = uint64le_decode(&ctx->net_bytes[ctx->net_offset-8]); false; })) || (validate_4(ctx) || ({ count = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) - || _validate_list(ctx, count, validate_1, sizeof(uint8_t)) + || _validate_size_net(ctx, count) || ({ 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 = 118; (((uint8_t)typ) != exp) && @@ -1353,7 +1353,7 @@ LM_FLATTEN static bool validate_Tswrite(struct _validate_ctx *ctx) { || (validate_2(ctx) || ({ nwname = uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]); false; })) || _validate_list(ctx, nwname, validate_s, sizeof(struct lib9p_s)) || (validate_4(ctx) || ({ count = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) - || _validate_list(ctx, count, validate_1, sizeof(uint8_t)) + || _validate_size_net(ctx, count) || ({ 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 = 154; (((uint8_t)typ) != exp) && @@ -1972,10 +1972,8 @@ LM_ALWAYS_INLINE static void unmarshal_fid(struct _unmarshal_ctx *ctx, lib9p_fid LM_ALWAYS_INLINE static void unmarshal_s(struct _unmarshal_ctx *ctx, struct lib9p_s *out) { memset(out, 0, sizeof(*out)); unmarshal_2(ctx, &out->len); - out->utf8 = ctx->extra; - ctx->extra += sizeof(out->utf8[0]) * out->len; - for (typeof(out->len) i = 0; i < out->len; i++) - unmarshal_1(ctx, (uint8_t *)&out->utf8[i]); + out->utf8 = (char *)&ctx->net_bytes[ctx->net_offset]; + ctx->net_offset += out->len; } #endif /* CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_L || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_u */ @@ -2047,10 +2045,8 @@ LM_FLATTEN static void unmarshal_Rread(struct _unmarshal_ctx *ctx, struct lib9p_ ctx->net_offset += 1; unmarshal_tag(ctx, &out->tag); unmarshal_4(ctx, &out->count); - out->data = ctx->extra; - ctx->extra += sizeof(out->data[0]) * out->count; - for (typeof(out->count) i = 0; i < out->count; i++) - unmarshal_1(ctx, (uint8_t *)&out->data[i]); + out->data = (char *)&ctx->net_bytes[ctx->net_offset]; + ctx->net_offset += out->count; } LM_FLATTEN static void unmarshal_Rwrite(struct _unmarshal_ctx *ctx, struct lib9p_msg_Rwrite *out) { @@ -2145,10 +2141,8 @@ LM_FLATTEN static void unmarshal_Rreaddir(struct _unmarshal_ctx *ctx, struct lib ctx->net_offset += 1; unmarshal_tag(ctx, &out->tag); unmarshal_4(ctx, &out->count); - out->data = ctx->extra; - ctx->extra += sizeof(out->data[0]) * out->count; - for (typeof(out->count) i = 0; i < out->count; i++) - unmarshal_1(ctx, (uint8_t *)&out->data[i]); + out->data = (char *)&ctx->net_bytes[ctx->net_offset]; + ctx->net_offset += out->count; } LM_FLATTEN static void unmarshal_Rfsync(struct _unmarshal_ctx *ctx, struct lib9p_msg_Rfsync *out) { @@ -2202,10 +2196,8 @@ LM_FLATTEN static void unmarshal_Rsread(struct _unmarshal_ctx *ctx, struct lib9p ctx->net_offset += 1; unmarshal_tag(ctx, &out->tag); unmarshal_4(ctx, &out->count); - out->data = ctx->extra; - ctx->extra += sizeof(out->data[0]) * out->count; - for (typeof(out->count) i = 0; i < out->count; i++) - unmarshal_1(ctx, (uint8_t *)&out->data[i]); + out->data = (char *)&ctx->net_bytes[ctx->net_offset]; + ctx->net_offset += out->count; } LM_FLATTEN static void unmarshal_Rswrite(struct _unmarshal_ctx *ctx, struct lib9p_msg_Rswrite *out) { @@ -2236,10 +2228,8 @@ LM_FLATTEN static void unmarshal_Twrite(struct _unmarshal_ctx *ctx, struct lib9p unmarshal_fid(ctx, &out->fid); unmarshal_8(ctx, &out->offset); unmarshal_4(ctx, &out->count); - out->data = ctx->extra; - ctx->extra += sizeof(out->data[0]) * out->count; - for (typeof(out->count) i = 0; i < out->count; i++) - unmarshal_1(ctx, (uint8_t *)&out->data[i]); + out->data = (char *)&ctx->net_bytes[ctx->net_offset]; + ctx->net_offset += out->count; } LM_FLATTEN static void unmarshal_Tclunk(struct _unmarshal_ctx *ctx, struct lib9p_msg_Tclunk *out) { @@ -2483,10 +2473,8 @@ LM_FLATTEN static void unmarshal_Tswrite(struct _unmarshal_ctx *ctx, struct lib9 for (typeof(out->nwname) i = 0; i < out->nwname; i++) unmarshal_s(ctx, &out->wname[i]); unmarshal_4(ctx, &out->count); - out->data = ctx->extra; - ctx->extra += sizeof(out->data[0]) * out->count; - for (typeof(out->count) i = 0; i < out->count; i++) - unmarshal_1(ctx, (uint8_t *)&out->data[i]); + out->data = (char *)&ctx->net_bytes[ctx->net_offset]; + ctx->net_offset += out->count; } #endif /* CONFIG_9P_ENABLE_9P2000_e */ diff --git a/lib9p/idl.gen b/lib9p/idl.gen index 9a8260a..f2b4f13 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -831,7 +831,10 @@ LM_ALWAYS_INLINE static bool validate_8(struct _validate_ctx *ctx) { return _val if member.in_versions != typ.in_versions: ret += "( " + c_ver_cond(member.in_versions) + " && " if member.cnt is not None: - ret += f"_validate_list(ctx, {member.cnt.name}, validate_{member.typ.name}, sizeof({c_typename(member.typ)}))" + if member.typ.static_size == 1: # SPECIAL (zerocopy) + ret += f"_validate_size_net(ctx, {member.cnt.name})" + else: + ret += f"_validate_list(ctx, {member.cnt.name}, validate_{member.typ.name}, sizeof({c_typename(member.typ)}))" if typ.name == "s": # SPECIAL (string) ret += f'\n\t || ({{ (!is_valid_utf8_without_nul(&ctx->net_bytes[ctx->net_offset-len], len)) && lib9p_error(ctx->ctx, LINUX_EBADMSG, "message contains invalid UTF-8"); }})' else: @@ -935,13 +938,15 @@ LM_ALWAYS_INLINE static void unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *o if member.in_versions != typ.in_versions: ret += "{\n" ret += prefix - ret += f"out->{member.name} = ctx->extra;\n" - ret += f"{prefix}ctx->extra += sizeof(out->{member.name}[0]) * out->{member.cnt.name};\n" - ret += f"{prefix}for (typeof(out->{member.cnt.name}) i = 0; i < out->{member.cnt.name}; i++)\n" - if member.typ.static_size == 1: # SPECIAL (string) - # Special-case is that we cast from `char` to `uint8_t`. - ret += f"{prefix}\tunmarshal_{member.typ.name}(ctx, (uint8_t *)&out->{member.name}[i]);\n" + if member.typ.static_size == 1: # SPECIAL (string, zerocopy) + ret += f"out->{member.name} = (char *)&ctx->net_bytes[ctx->net_offset];\n" + ret += ( + f"{prefix}ctx->net_offset += out->{member.cnt.name};\n" + ) else: + ret += f"out->{member.name} = ctx->extra;\n" + ret += f"{prefix}ctx->extra += sizeof(out->{member.name}[0]) * out->{member.cnt.name};\n" + ret += f"{prefix}for (typeof(out->{member.cnt.name}) i = 0; i < out->{member.cnt.name}; i++)\n" ret += f"{prefix}\tunmarshal_{member.typ.name}(ctx, &out->{member.name}[i]);\n" if member.in_versions != typ.in_versions: ret += "\t}\n" |