diff options
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.c | 28 |
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)) |