diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-02-03 20:31:44 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-02-03 21:02:59 -0700 |
commit | 652098de8dce01af90a65e0efa48dc156abc6329 (patch) | |
tree | c89aeea10fb14df0489084d13775d3f391bcd3c2 /lib9p/9p.generated.c | |
parent | ae610c5796cb1624f03b79dfae372c757674ea76 (diff) |
lib9p: idl.gen: Simplify special cases
It wasn't validating d_signed length.
Diffstat (limited to 'lib9p/9p.generated.c')
-rw-r--r-- | lib9p/9p.generated.c | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/lib9p/9p.generated.c b/lib9p/9p.generated.c index 8e3e26b..a166fb2 100644 --- a/lib9p/9p.generated.c +++ b/lib9p/9p.generated.c @@ -354,10 +354,10 @@ LM_ALWAYS_INLINE static bool _validate_list(struct _validate_ctx *ctx, return false; } -#define validate_1(ctx) _validate_size_net(ctx, 1) -#define validate_2(ctx) _validate_size_net(ctx, 2) -#define validate_4(ctx) _validate_size_net(ctx, 4) -#define validate_8(ctx) _validate_size_net(ctx, 8) +LM_ALWAYS_INLINE static bool validate_1(struct _validate_ctx *ctx) { return _validate_size_net(ctx, 1); } +LM_ALWAYS_INLINE static bool validate_2(struct _validate_ctx *ctx) { return _validate_size_net(ctx, 2); } +LM_ALWAYS_INLINE static bool validate_4(struct _validate_ctx *ctx) { return _validate_size_net(ctx, 4); } +LM_ALWAYS_INLINE static bool validate_8(struct _validate_ctx *ctx) { return _validate_size_net(ctx, 8); } #if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_L || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_u LM_ALWAYS_INLINE static bool validate_tag(struct _validate_ctx *ctx) { @@ -369,31 +369,30 @@ LM_ALWAYS_INLINE static bool validate_fid(struct _validate_ctx *ctx) { } LM_ALWAYS_INLINE static bool validate_d(struct _validate_ctx *ctx) { - uint32_t base_offset = ctx->net_offset; - if (validate_4(ctx)) - return true; - uint32_t len = uint32le_decode(&ctx->net_bytes[base_offset]); - return _validate_size_net(ctx, len) || _validate_size_host(ctx, len); + uint32_t len; + return false + || (validate_4(ctx) || ({ len = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) + || _validate_list(ctx, len, validate_1, sizeof(uint8_t)) + ; } LM_ALWAYS_INLINE static bool validate_d_signed(struct _validate_ctx *ctx) { - uint32_t base_offset = ctx->net_offset; - if (validate_4(ctx)) - return true; - uint32_t len = uint32le_decode(&ctx->net_bytes[base_offset]); - return _validate_size_net(ctx, len) || _validate_size_host(ctx, len); + uint32_t len; + return false + || (validate_4(ctx) || ({ len = uint32le_decode(&ctx->net_bytes[ctx->net_offset-4]); false; })) + || _validate_list(ctx, len, validate_1, sizeof(uint8_t)) + || ({ uint32_t max = INT32_MAX; (((uint32_t)len) > max) && + lib9p_errorf(ctx->ctx, LINUX_EBADMSG, "len value is too large (%"PRIu32" > %"PRIu32")", len, max); }) + ; } LM_ALWAYS_INLINE static bool validate_s(struct _validate_ctx *ctx) { - uint32_t base_offset = ctx->net_offset; - if (validate_2(ctx)) - return true; - uint16_t len = uint16le_decode(&ctx->net_bytes[base_offset]); - if (_validate_size_net(ctx, len) || _validate_size_host(ctx, ((size_t)len))) - return true; - if (!is_valid_utf8_without_nul(&ctx->net_bytes[base_offset+2], len)) - return lib9p_error(ctx->ctx, LINUX_EBADMSG, "message contains invalid UTF-8"); - return false; + 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)) + || ({ (!is_valid_utf8_without_nul(&ctx->net_bytes[ctx->net_offset-len], len)) && lib9p_error(ctx->ctx, LINUX_EBADMSG, "message contains invalid UTF-8"); }) + ; } #endif /* CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_L || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_u */ @@ -1086,7 +1085,7 @@ LM_FLATTEN static bool validate_Twalk(struct _validate_ctx *ctx) { || validate_fid(ctx) || validate_fid(ctx) || (validate_2(ctx) || ({ nwname = uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]); false; })) - || _validate_list(ctx, uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]), validate_s, sizeof(struct lib9p_s)) + || _validate_list(ctx, nwname, validate_s, sizeof(struct lib9p_s)) || ({ 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 = 110; (((uint8_t)typ) != exp) && @@ -1270,14 +1269,15 @@ LM_FLATTEN static bool validate_Tunlinkat(struct _validate_ctx *ctx) { LM_FLATTEN static bool validate_Tsread(struct _validate_ctx *ctx) { uint32_t size; uint8_t typ; + uint16_t nwname; 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_4(ctx) - || validate_2(ctx) - || _validate_list(ctx, uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]), validate_s, sizeof(struct lib9p_s)) + || (validate_2(ctx) || ({ nwname = uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]); false; })) + || _validate_list(ctx, nwname, validate_s, sizeof(struct lib9p_s)) || ({ 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 = 152; (((uint8_t)typ) != exp) && @@ -1288,14 +1288,15 @@ LM_FLATTEN static bool validate_Tsread(struct _validate_ctx *ctx) { LM_FLATTEN static bool validate_Tswrite(struct _validate_ctx *ctx) { uint32_t size; uint8_t typ; + uint16_t nwname; 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_4(ctx) - || validate_2(ctx) - || _validate_list(ctx, uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]), validate_s, sizeof(struct lib9p_s)) + || (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_d(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); }) @@ -1631,7 +1632,7 @@ LM_FLATTEN static bool validate_Rwalk(struct _validate_ctx *ctx) { || (validate_1(ctx) || ({ typ = ctx->net_bytes[ctx->net_offset-1]; false; })) || validate_tag(ctx) || (validate_2(ctx) || ({ nwqid = uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]); false; })) - || _validate_list(ctx, uint16le_decode(&ctx->net_bytes[ctx->net_offset-2]), validate_qid, sizeof(struct lib9p_qid)) + || _validate_list(ctx, nwqid, validate_qid, sizeof(struct lib9p_qid)) || ({ 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 = 111; (((uint8_t)typ) != exp) && |