Skip to content

Commit dd1f862

Browse files
committed
Do not reverse bytes for nullvm
This fixes the following istio proxy test on s390x: https://github.com/istio/proxy/blob/master/test/envoye2e/tcp_metadata_exchange/tcp_metadata_exchange_test.go Signed-off-by: Konstantin Maksimov <[email protected]>
1 parent e1f845f commit dd1f862

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

include/proxy-wasm/exports.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,13 @@ template <typename Pairs> size_t pairsSize(const Pairs &result) {
7474

7575
template <typename Pairs> void marshalPairs(const Pairs &result, char *buffer) {
7676
char *b = buffer;
77-
*reinterpret_cast<uint32_t *>(b) = htowasm(result.size());
77+
bool reverse = "null" != contextOrEffectiveContext()->wasmVm()->getEngineName();
78+
*reinterpret_cast<uint32_t *>(b) = reverse ? htowasm(result.size()) : result.size();
7879
b += sizeof(uint32_t);
7980
for (auto &p : result) {
80-
*reinterpret_cast<uint32_t *>(b) = htowasm(p.first.size());
81+
*reinterpret_cast<uint32_t *>(b) = reverse ? htowasm(p.first.size()) : p.first.size();
8182
b += sizeof(uint32_t);
82-
*reinterpret_cast<uint32_t *>(b) = htowasm(p.second.size());
83+
*reinterpret_cast<uint32_t *>(b) = reverse ? htowasm(p.second.size()) : p.second.size();
8384
b += sizeof(uint32_t);
8485
}
8586
for (auto &p : result) {

src/exports.cc

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,22 @@ Pairs toPairs(std::string_view buffer) {
6565
if (buffer.size() < sizeof(uint32_t)) {
6666
return {};
6767
}
68-
auto size = wasmtoh(*reinterpret_cast<const uint32_t *>(b));
68+
bool reverse = "null" != contextOrEffectiveContext()->wasmVm()->getEngineName();
69+
auto size = reverse ? wasmtoh(*reinterpret_cast<const uint32_t *>(b))
70+
: *reinterpret_cast<const uint32_t *>(b);
6971
b += sizeof(uint32_t);
7072
if (sizeof(uint32_t) + size * 2 * sizeof(uint32_t) > buffer.size()) {
7173
return {};
7274
}
7375
result.resize(size);
7476
for (uint32_t i = 0; i < size; i++) {
75-
result[i].first = std::string_view(nullptr, wasmtoh(*reinterpret_cast<const uint32_t *>(b)));
77+
result[i].first =
78+
std::string_view(nullptr, reverse ? wasmtoh(*reinterpret_cast<const uint32_t *>(b))
79+
: *reinterpret_cast<const uint32_t *>(b));
7680
b += sizeof(uint32_t);
77-
result[i].second = std::string_view(nullptr, wasmtoh(*reinterpret_cast<const uint32_t *>(b)));
81+
result[i].second =
82+
std::string_view(nullptr, reverse ? wasmtoh(*reinterpret_cast<const uint32_t *>(b))
83+
: *reinterpret_cast<const uint32_t *>(b));
7884
b += sizeof(uint32_t);
7985
}
8086
for (auto &p : result) {
@@ -691,6 +697,7 @@ Word wasi_unstable_fd_prestat_dir_name(Word /*fd*/, Word /*path_ptr*/, Word /*pa
691697
// logs.
692698
Word writevImpl(Word fd, Word iovs, Word iovs_len, Word *nwritten_ptr) {
693699
auto *context = contextOrEffectiveContext();
700+
bool reverse = "null" != context->wasmVm()->getEngineName();
694701

695702
// Read syscall args.
696703
uint64_t log_level;
@@ -714,8 +721,9 @@ Word writevImpl(Word fd, Word iovs, Word iovs_len, Word *nwritten_ptr) {
714721
}
715722
const auto *iovec = reinterpret_cast<const uint32_t *>(memslice.value().data());
716723
if (iovec[1] != 0U /* buf_len */) {
717-
memslice = context->wasmVm()->getMemory(wasmtoh(iovec[0]) /* buf */,
718-
wasmtoh(iovec[1]) /* buf_len */);
724+
auto iovec0 = reverse ? wasmtoh(iovec[0]) : iovec[0];
725+
auto iovec1 = reverse ? wasmtoh(iovec[1]) : iovec[1];
726+
memslice = context->wasmVm()->getMemory(iovec0 /* buf */, iovec1 /* buf_len */);
719727
if (!memslice) {
720728
return 21; // __WASI_EFAULT
721729
}

0 commit comments

Comments
 (0)