summaryrefslogtreecommitdiff
path: root/lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c')
-rw-r--r--lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c b/lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c
index c39851ba49..3721e2e2db 100644
--- a/lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c
+++ b/lib/erl_interface/test/ei_decode_encode_SUITE_data/ei_decode_encode_test.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2020. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2023. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
*/
#include "ei_runner.h"
+#include <string.h>
/*
* Purpose: Read pids, funs and others without real meaning on the C side
@@ -291,6 +292,7 @@ void decode_encode(struct Type** tv, int nobj)
ei_x_new(&arg);
for (i=0; i<nobj; i++) {
struct Type* t = tv[i];
+ int small_port = 0;
MESSAGE("ei_decode_%s, arg is type %s", t->name, t->type);
@@ -355,9 +357,17 @@ void decode_encode(struct Type** tv, int nobj)
}
}
if (size1 != size2) {
- MESSAGE("size1 = %d, size2 = %d\n",size1,size2);
- fail("decode and encode size differs when buf is NULL");
- return;
+ if (strcmp(t->type, "erlang_port") == 0
+ && size1 == size2 + 4
+ && objv[oix].u.port.id <= 0x0fffffff /* 28 bits */) {
+ /* old encoding... */
+ small_port = !0;
+ }
+ else {
+ MESSAGE("size1 = %d, size2 = %d\n",size1,size2);
+ fail("decode and encode size differs when buf is NULL");
+ return;
+ }
}
MESSAGE("ei_encode_%s, arg is type %s", t->name, t->type);
size3 = 0;
@@ -371,9 +381,11 @@ void decode_encode(struct Type** tv, int nobj)
return;
}
if (size1 != size3) {
- MESSAGE("size1 = %d, size2 = %d\n",size1,size3);
- fail("decode and encode size differs");
- return;
+ if (!small_port || size2 != size3) {
+ MESSAGE("size1 = %d, size3 = %d\n",size1,size3);
+ fail("decode and encode size differs");
+ return;
+ }
}
MESSAGE("ei_x_encode_%s, arg is type %s", t->name, t->type);
@@ -394,7 +406,7 @@ void decode_encode(struct Type** tv, int nobj)
}
inp += size1;
- outp += size1;
+ outp += size2;
if (objv[oix].nterms) { /* container term */
if (++oix >= sizeof(objv)/sizeof(*objv))