Added DDS Security msg parameters. (#263)

* Added DDS Security msg parameters.

Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>

* Added ENABLE_SECURITY cmake option and DDSI_INCLUDE_SECURITY compile switch.

Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>
This commit is contained in:
martinbremmer 2019-10-01 12:43:33 +02:00 committed by eboasson
parent 992d2b6e55
commit ef90c11e8d
7 changed files with 261 additions and 35 deletions

View file

@ -133,30 +133,32 @@ windows_vs2017: &windows_vs2017
jobs: jobs:
include: include:
- <<: *linux_gcc8 - <<: *linux_gcc8
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=YES, GENERATOR="Unix Makefiles", COVERITY_SCAN=true ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles", COVERITY_SCAN=true ]
if: type = cron if: type = cron
- <<: *linux_gcc8 - <<: *linux_gcc8
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *linux_gcc8 - <<: *linux_gcc8
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *linux_gcc8 - <<: *linux_gcc8
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=NO, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=NO, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *linux_gcc8 - <<: *linux_gcc8
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *linux_clang - <<: *linux_clang
env: [ ARCH=x86_64, ASAN=address, BUILD_TYPE=Debug, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=address, BUILD_TYPE=Debug, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *linux_clang - <<: *linux_clang
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=address, BUILD_TYPE=Debug, SSL=YES, SECURITY=NO, GENERATOR="Unix Makefiles" ]
- <<: *linux_clang
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *osx_xcode10_3 - <<: *osx_xcode10_3
env: [ ARCH=x86_64, ASAN=address, BUILD_TYPE=Debug, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=address, BUILD_TYPE=Debug, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *osx_xcode10_3 - <<: *osx_xcode10_3
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, GENERATOR="Unix Makefiles" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, SECURITY=YES, GENERATOR="Unix Makefiles" ]
- <<: *windows_vs2017 - <<: *windows_vs2017
env: [ ARCH=x86, ASAN=none, BUILD_TYPE=Debug, SSL=YES, GENERATOR="Visual Studio 15 2017" ] env: [ ARCH=x86, ASAN=none, BUILD_TYPE=Debug, SSL=YES, SECURITY=YES, GENERATOR="Visual Studio 15 2017" ]
- <<: *windows_vs2017 - <<: *windows_vs2017
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=YES, GENERATOR="Visual Studio 15 2017 Win64" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Debug, SSL=YES, SECURITY=YES, GENERATOR="Visual Studio 15 2017 Win64" ]
- <<: *windows_vs2017 - <<: *windows_vs2017
env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, GENERATOR="Visual Studio 15 2017 Win64" ] env: [ ARCH=x86_64, ASAN=none, BUILD_TYPE=Release, SSL=YES, SECURITY=YES, GENERATOR="Visual Studio 15 2017 Win64" ]
before_script: before_script:
- conan profile new default --detect - conan profile new default --detect
@ -186,6 +188,7 @@ script:
-DCMAKE_INSTALL_PREFIX=$(pwd)/install -DCMAKE_INSTALL_PREFIX=$(pwd)/install
-DUSE_SANITIZER=${ASAN} -DUSE_SANITIZER=${ASAN}
-DENABLE_SSL=${SSL} -DENABLE_SSL=${SSL}
-DENABLE_SECURITY=${SECURITY}
-DBUILD_TESTING=on -DBUILD_TESTING=on
-DWERROR=on -DWERROR=on
-G "${GENERATOR}" .. -G "${GENERATOR}" ..

View file

@ -53,17 +53,28 @@ if(ENABLE_SSL)
endif() endif()
endif() endif()
# Support the OMG DDS Security within ddsc adds quite a bit of code.
option(ENABLE_SECURITY "Enable OMG DDS Security support" ON)
if(NOT ENABLE_SECURITY)
message(STATUS "Building without OMG DDS Security support")
else()
add_definitions(-DDDSI_INCLUDE_SECURITY)
target_link_libraries(ddsc PRIVATE security_api)
target_include_directories(
ddsc PUBLIC
$<BUILD_INTERFACE:$<TARGET_PROPERTY:security_api,INTERFACE_INCLUDE_DIRECTORIES>>)
endif()
include(ddsi/CMakeLists.txt) include(ddsi/CMakeLists.txt)
include(ddsc/CMakeLists.txt) include(ddsc/CMakeLists.txt)
target_link_libraries(ddsc PRIVATE ddsrt security_api) target_link_libraries(ddsc PRIVATE ddsrt)
target_compile_definitions( target_compile_definitions(
ddsc PUBLIC ddsc PUBLIC
$<BUILD_INTERFACE:$<TARGET_PROPERTY:ddsrt,INTERFACE_COMPILE_DEFINITIONS>>) $<BUILD_INTERFACE:$<TARGET_PROPERTY:ddsrt,INTERFACE_COMPILE_DEFINITIONS>>)
target_include_directories( target_include_directories(
ddsc PUBLIC ddsc PUBLIC
$<BUILD_INTERFACE:$<TARGET_PROPERTY:ddsrt,INTERFACE_INCLUDE_DIRECTORIES>> $<BUILD_INTERFACE:$<TARGET_PROPERTY:ddsrt,INTERFACE_INCLUDE_DIRECTORIES>>)
$<BUILD_INTERFACE:$<TARGET_PROPERTY:security_api,INTERFACE_INCLUDE_DIRECTORIES>>)
# SOVERSION should increase on incompatible ABI change # SOVERSION should increase on incompatible ABI change
set_target_properties(ddsc PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) set_target_properties(ddsc PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})

View file

@ -59,6 +59,10 @@ extern "C" {
/* Security extensions. */ /* Security extensions. */
#define PP_IDENTITY_TOKEN ((uint64_t)1 << 41) #define PP_IDENTITY_TOKEN ((uint64_t)1 << 41)
#define PP_PERMISSIONS_TOKEN ((uint64_t)1 << 42) #define PP_PERMISSIONS_TOKEN ((uint64_t)1 << 42)
#define PP_ENDPOINT_SECURITY_INFO ((uint64_t)1 << 43)
#define PP_PARTICIPANT_SECURITY_INFO ((uint64_t)1 << 44)
#define PP_IDENTITY_STATUS_TOKEN ((uint64_t)1 << 45)
#define PP_DATA_TAGS ((uint64_t)1 << 46)
/* Set for unrecognized parameters that are in the reserved space or /* Set for unrecognized parameters that are in the reserved space or
in our own vendor-specific space that have the in our own vendor-specific space that have the
PID_UNRECOGNIZED_INCOMPATIBLE_FLAG set (see DDSI 2.1 9.6.2.2.1) */ PID_UNRECOGNIZED_INCOMPATIBLE_FLAG set (see DDSI 2.1 9.6.2.2.1) */
@ -100,6 +104,21 @@ typedef struct nn_keyhash {
unsigned char value[16]; unsigned char value[16];
} nn_keyhash_t; } nn_keyhash_t;
#ifdef DDSI_INCLUDE_SECURITY
typedef struct nn_tag {
char *name;
char *value;
} nn_tag_t;
typedef struct nn_tagseq {
uint32_t n;
nn_tag_t *tags;
} nn_tagseq_t;
typedef struct nn_datatags {
nn_tagseq_t tags;
} nn_datatags_t;
#endif
#ifdef DDSI_INCLUDE_SSM #ifdef DDSI_INCLUDE_SSM
typedef struct nn_reader_favours_ssm { typedef struct nn_reader_favours_ssm {
@ -107,6 +126,50 @@ typedef struct nn_reader_favours_ssm {
} nn_reader_favours_ssm_t; } nn_reader_favours_ssm_t;
#endif #endif
#ifdef DDSI_INCLUDE_SECURITY
typedef struct nn_dataholder
{
char *class_id;
dds_propertyseq_t properties;
dds_binarypropertyseq_t binary_properties;
} nn_dataholder_t;
typedef nn_dataholder_t nn_token_t;
/* Used for both nn_participant_security_info and nn_endpoint_security_info. */
typedef struct nn_security_info
{
uint32_t security_attributes;
uint32_t plugin_security_attributes;
} nn_security_info_t;
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_READ_PROTECTED (1u << 0)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_WRITE_PROTECTED (1u << 1)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_PROTECTED (1u << 2)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_PROTECTED (1u << 3)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_PAYLOAD_PROTECTED (1u << 4)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_KEY_PROTECTED (1u << 5)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_PROTECTED (1u << 6)
#define NN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_VALID (1u << 31)
#define NN_PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ENCRYPTED (1u << 0)
#define NN_PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_PAYLOAD_ENCRYPTED (1u << 1)
#define NN_PLUGIN_ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_ORIGIN_AUTHENTICATED (1u << 2)
#define NN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_RTPS_PROTECTED (1u << 0)
#define NN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_PROTECTED (1u << 1)
#define NN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_PROTECTED (1u << 2)
#define NN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_VALID (1u << 31)
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_RTPS_ENCRYPTED (1u << 0)
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_ENCRYPTED (1u << 1)
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_ENCRYPTED (1u << 2)
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_RTPS_AUTHENTICATED (1u << 3)
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_AUTHENTICATED (1u << 4)
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_AUTHENTICATED (1u << 5)
#endif
typedef struct nn_prismtech_participant_version_info typedef struct nn_prismtech_participant_version_info
{ {
uint32_t version; uint32_t version;
@ -159,6 +222,14 @@ typedef struct nn_plist {
uint32_t process_id; uint32_t process_id;
char *type_description; char *type_description;
nn_sequence_number_t coherent_set_seqno; nn_sequence_number_t coherent_set_seqno;
#ifdef DDSI_INCLUDE_SECURITY
nn_token_t identity_token;
nn_token_t permissions_token;
nn_security_info_t endpoint_security_info;
nn_security_info_t participant_security_info;
nn_token_t identity_status_token;
nn_datatags_t data_tags;
#endif
#ifdef DDSI_INCLUDE_SSM #ifdef DDSI_INCLUDE_SSM
nn_reader_favours_ssm_t reader_favours_ssm; nn_reader_favours_ssm_t reader_favours_ssm;
#endif #endif

View file

@ -390,6 +390,10 @@ DDSRT_WARNING_MSVC_ON(4200)
/* Security related PID values. */ /* Security related PID values. */
#define PID_IDENTITY_TOKEN 0x1001u #define PID_IDENTITY_TOKEN 0x1001u
#define PID_PERMISSIONS_TOKEN 0x1002u #define PID_PERMISSIONS_TOKEN 0x1002u
#define PID_DATA_TAGS 0x1003u
#define PID_ENDPOINT_SECURITY_INFO 0x1004u
#define PID_PARTICIPANT_SECURITY_INFO 0x1005u
#define PID_IDENTITY_STATUS_TOKEN 0x1006u
#ifdef DDSI_INCLUDE_SSM #ifdef DDSI_INCLUDE_SSM
/* To indicate whether a reader favours the use of SSM. Iff the /* To indicate whether a reader favours the use of SSM. Iff the

View file

@ -52,7 +52,7 @@ typedef enum update_result (*update_fun_t) (struct cfgst *cfgst, void *parent, s
typedef void (*free_fun_t) (struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem); typedef void (*free_fun_t) (struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem);
typedef void (*print_fun_t) (struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, uint32_t sources); typedef void (*print_fun_t) (struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, uint32_t sources);
#ifdef DDSI_INCLUDE_SECURITY #ifdef DDSI_INCLUDE_ENCRYPTION
struct q_security_plugins q_security_plugin = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; struct q_security_plugins q_security_plugin = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
#endif #endif

View file

@ -1172,6 +1172,14 @@ static const struct piddesc piddesc_omg[] = {
PPV (ENDPOINT_GUID, endpoint_guid, XG), PPV (ENDPOINT_GUID, endpoint_guid, XG),
#ifdef DDSI_INCLUDE_SSM #ifdef DDSI_INCLUDE_SSM
PPV (READER_FAVOURS_SSM, reader_favours_ssm, Xu), PPV (READER_FAVOURS_SSM, reader_favours_ssm, Xu),
#endif
#ifdef DDSI_INCLUDE_SECURITY
PP (ENDPOINT_SECURITY_INFO, endpoint_security_info, Xu, Xu),
PP (PARTICIPANT_SECURITY_INFO, participant_security_info, Xu, Xu),
PP (IDENTITY_TOKEN, identity_token, XS, XQ, XbPROP, XS, XS, XSTOP, XQ, XbPROP, XS, XO, XSTOP),
PP (PERMISSIONS_TOKEN, permissions_token, XS, XQ, XbPROP, XS, XS, XSTOP, XQ, XbPROP, XS, XO, XSTOP),
PP (IDENTITY_STATUS_TOKEN, identity_status_token, XS, XQ, XbPROP, XS, XS, XSTOP, XQ, XbPROP, XS, XO, XSTOP),
PP (DATA_TAGS, data_tags, XQ, XS, XS, XSTOP),
#endif #endif
{ PID_STATUSINFO, PDF_FUNCTION, PP_STATUSINFO, "STATUSINFO", { PID_STATUSINFO, PDF_FUNCTION, PP_STATUSINFO, "STATUSINFO",
offsetof (struct nn_plist, statusinfo), membersize (struct nn_plist, statusinfo), offsetof (struct nn_plist, statusinfo), membersize (struct nn_plist, statusinfo),
@ -1288,11 +1296,21 @@ struct piddesc_index {
nn_plist_init_tables. nn_plist_init_tables.
FIXME: should compute them at build-time */ FIXME: should compute them at build-time */
#define DEFAULT_PROC_ARRAY_SIZE 19
#ifdef DDSI_INCLUDE_SSM #ifdef DDSI_INCLUDE_SSM
static const struct piddesc *piddesc_omg_index[115]; #define DEFAULT_OMG_PIDS_ARRAY_SIZE (PID_READER_FAVOURS_SSM + 1)
#else /* status info is the highest */ #else
static const struct piddesc *piddesc_omg_index[114]; #define DEFAULT_OMG_PIDS_ARRAY_SIZE (PID_STATUSINFO + 1)
#endif #endif
#ifdef DDSI_INCLUDE_SECURITY
#define SECURITY_OMG_PIDS_ARRAY_SIZE (PID_IDENTITY_STATUS_TOKEN - PID_IDENTITY_TOKEN + 1)
#define SECURITY_PROC_ARRAY_SIZE 4
#else
#define SECURITY_OMG_PIDS_ARRAY_SIZE 0
#define SECURITY_PROC_ARRAY_SIZE 0
#endif
static const struct piddesc *piddesc_omg_index[DEFAULT_OMG_PIDS_ARRAY_SIZE + SECURITY_OMG_PIDS_ARRAY_SIZE];
static const struct piddesc *piddesc_eclipse_index[19]; static const struct piddesc *piddesc_eclipse_index[19];
static const struct piddesc *piddesc_prismtech_index[19]; static const struct piddesc *piddesc_prismtech_index[19];
@ -1318,13 +1336,22 @@ static const struct piddesc_index piddesc_vendor_index[] = {
/* List of entries that require unalias, fini processing; /* List of entries that require unalias, fini processing;
initialized by nn_plist_init_tables; will assert when initialized by nn_plist_init_tables; will assert when
table too small or too large */ table too small or too large */
static const struct piddesc *piddesc_unalias[19]; static const struct piddesc *piddesc_unalias[DEFAULT_PROC_ARRAY_SIZE + SECURITY_PROC_ARRAY_SIZE];
static const struct piddesc *piddesc_fini[19]; static const struct piddesc *piddesc_fini[DEFAULT_PROC_ARRAY_SIZE + SECURITY_PROC_ARRAY_SIZE];
static ddsrt_once_t table_init_control = DDSRT_ONCE_INIT; static ddsrt_once_t table_init_control = DDSRT_ONCE_INIT;
static nn_parameterid_t pid_without_flags (nn_parameterid_t pid) static size_t pid_to_index (nn_parameterid_t pid)
{ {
return (nn_parameterid_t) (pid & ~(PID_VENDORSPECIFIC_FLAG | PID_UNRECOGNIZED_INCOMPATIBLE_FLAG)); /* pid without flags. */
size_t idx = (size_t)(pid & ~(PID_VENDORSPECIFIC_FLAG | PID_UNRECOGNIZED_INCOMPATIBLE_FLAG));
#ifdef DDSI_INCLUDE_SECURITY
if ((idx >= PID_IDENTITY_TOKEN) && (idx <= PID_IDENTITY_STATUS_TOKEN))
{
/* Security PIDs start after the 'normal' PIDs. */
idx = (idx - PID_IDENTITY_TOKEN) + DEFAULT_OMG_PIDS_ARRAY_SIZE;
}
#endif
return idx;
} }
static int piddesc_cmp_qos_addr (const void *va, const void *vb) static int piddesc_cmp_qos_addr (const void *va, const void *vb)
@ -1348,12 +1375,13 @@ static void nn_plist_init_tables_real (void)
continue; continue;
struct piddesc const **index = piddesc_vendor_index[i].index; struct piddesc const **index = piddesc_vendor_index[i].index;
#ifndef NDEBUG #ifndef NDEBUG
nn_parameterid_t maxpid = 0; size_t maxpididx = 0;
bool only_qos_seen = true; bool only_qos_seen = true;
#endif #endif
for (size_t j = 0; table[j].pid != PID_SENTINEL; j++) for (size_t j = 0; table[j].pid != PID_SENTINEL; j++)
{ {
nn_parameterid_t pid = pid_without_flags (table[j].pid); nn_parameterid_t pid = table[j].pid;
size_t pididx = pid_to_index(pid);
#ifndef NDEBUG #ifndef NDEBUG
/* Table must first list QoS, then other parameters */ /* Table must first list QoS, then other parameters */
assert (only_qos_seen || !(table[j].flags & PDF_QOS)); assert (only_qos_seen || !(table[j].flags & PDF_QOS));
@ -1361,19 +1389,19 @@ static void nn_plist_init_tables_real (void)
only_qos_seen = false; only_qos_seen = false;
/* Track max PID so we can verify the table is no larger /* Track max PID so we can verify the table is no larger
than necessary */ than necessary */
if (pid > maxpid) if (pididx > maxpididx)
maxpid = pid; maxpididx = pididx;
#endif #endif
/* PAD is used for entries that are never visible on the wire /* PAD is used for entries that are never visible on the wire
and the decoder assumes the PAD entries will be skipped and the decoder assumes the PAD entries will be skipped
because they don't map to an entry */ because they don't map to an entry */
if (pid == PID_PAD) if (pid == PID_PAD)
continue; continue;
assert (pid <= piddesc_vendor_index[i].index_max); assert (pididx <= piddesc_vendor_index[i].index_max);
assert (index[pid] == NULL || index[pid] == &table[j]); assert (index[pididx] == NULL || index[pididx] == &table[j]);
index[pid] = &table[j]; index[pididx] = &table[j];
} }
assert (maxpid == piddesc_vendor_index[i].index_max); assert (maxpididx == piddesc_vendor_index[i].index_max);
} }
/* PIDs requiring unalias; there is overlap between the tables /* PIDs requiring unalias; there is overlap between the tables
@ -2094,9 +2122,10 @@ static dds_return_t init_one_parameter (nn_plist_t *plist, nn_ipaddress_params_t
index = &piddesc_vendor_index[dd->vendorid.id[1]]; index = &piddesc_vendor_index[dd->vendorid.id[1]];
const struct piddesc *entry; const struct piddesc *entry;
if (pid_without_flags (pid) > index->index_max || (entry = index->index[pid_without_flags (pid)]) == NULL) size_t pididx = pid_to_index(pid);
if (pididx > index->index_max || (entry = index->index[pididx]) == NULL)
return return_unrecognized_pid (plist, pid); return return_unrecognized_pid (plist, pid);
assert (pid_without_flags (pid) == pid_without_flags (entry->pid)); assert (pid_to_index (pid) == pid_to_index (entry->pid));
if (pid != entry->pid) if (pid != entry->pid)
{ {
DDS_CERROR (logcfg, "error processing parameter list (vendor %u.%u, version %u.%u): pid %"PRIx16" mapped to pid %"PRIx16"\n", DDS_CERROR (logcfg, "error processing parameter list (vendor %u.%u, version %u.%u): pid %"PRIx16" mapped to pid %"PRIx16"\n",

View file

@ -19,9 +19,9 @@
CU_Test (ddsi_plist, unalias_copy_merge) CU_Test (ddsi_plist, unalias_copy_merge)
{ {
/* one int, one string and one string sequence covers most cases */ /* one int, one string, one string sequence and one struct sequence covers most cases */
nn_plist_t p0, p0memcpy; nn_plist_t p0, p0memcpy;
char *p0strs[3]; char *p0strs[7];
nn_plist_init_empty (&p0); nn_plist_init_empty (&p0);
p0.present = PP_PRISMTECH_PROCESS_ID | PP_ENTITY_NAME; p0.present = PP_PRISMTECH_PROCESS_ID | PP_ENTITY_NAME;
p0.aliased = PP_ENTITY_NAME; p0.aliased = PP_ENTITY_NAME;
@ -34,18 +34,43 @@ CU_Test (ddsi_plist, unalias_copy_merge)
p0strs[0] = p0.qos.partition.strs[0] = "aap"; p0strs[0] = p0.qos.partition.strs[0] = "aap";
p0strs[1] = p0.qos.partition.strs[1] = "noot"; p0strs[1] = p0.qos.partition.strs[1] = "noot";
p0strs[2] = p0.qos.partition.strs[2] = "mies"; p0strs[2] = p0.qos.partition.strs[2] = "mies";
#ifdef DDSI_INCLUDE_SECURITY
p0.present |= PP_IDENTITY_TOKEN;
p0.aliased |= PP_IDENTITY_TOKEN;
p0.identity_token.class_id = "class_id";
p0.identity_token.properties.n = 2;
p0.identity_token.properties.props = ddsrt_malloc (p0.identity_token.properties.n * sizeof (*p0.identity_token.properties.props));
p0.identity_token.properties.props[0].propagate = false;
p0strs[3] = p0.identity_token.properties.props[0].name = "name0";
p0strs[4] = p0.identity_token.properties.props[0].value = "value0";
p0.identity_token.properties.props[1].propagate = true;
p0strs[5] = p0.identity_token.properties.props[1].name = "name1";
p0strs[6] = p0.identity_token.properties.props[1].value = "value1";
p0.identity_token.binary_properties.n = 0;
p0.identity_token.binary_properties.props = NULL;
#endif
memcpy (&p0memcpy, &p0, sizeof (p0)); memcpy (&p0memcpy, &p0, sizeof (p0));
/* manually alias one, so we can free it*/ /* manually alias one, so we can free it*/
nn_plist_t p0alias; nn_plist_t p0alias;
memcpy (&p0alias, &p0, sizeof (p0)); memcpy (&p0alias, &p0, sizeof (p0));
p0alias.qos.partition.strs = ddsrt_memdup (p0alias.qos.partition.strs, p0.qos.partition.n * sizeof (*p0.qos.partition.strs)); p0alias.qos.partition.strs = ddsrt_memdup (p0alias.qos.partition.strs, p0.qos.partition.n * sizeof (*p0.qos.partition.strs));
#ifdef DDSI_INCLUDE_SECURITY
p0alias.identity_token.properties.props = ddsrt_memdup (p0alias.identity_token.properties.props,
p0.identity_token.properties.n * sizeof (*p0.identity_token.properties.props));
#endif
nn_plist_fini (&p0alias); nn_plist_fini (&p0alias);
CU_ASSERT (memcmp (&p0, &p0memcpy, sizeof (p0)) == 0); CU_ASSERT (memcmp (&p0, &p0memcpy, sizeof (p0)) == 0);
CU_ASSERT_STRING_EQUAL (p0.entity_name, "nemo"); CU_ASSERT_STRING_EQUAL (p0.entity_name, "nemo");
CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[0], p0strs[0]); CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[0], p0strs[0]);
CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[1], p0strs[1]); CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[1], p0strs[1]);
CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[2], p0strs[2]); CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[2], p0strs[2]);
#ifdef DDSI_INCLUDE_SECURITY
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[0].name, p0strs[3]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[0].value, p0strs[4]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[1].name, p0strs[5]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[1].value, p0strs[6]);
#endif
/* copy an aliased one; the original must be unchanged, the copy unaliased */ /* copy an aliased one; the original must be unchanged, the copy unaliased */
nn_plist_t p1; nn_plist_t p1;
@ -67,6 +92,24 @@ CU_Test (ddsi_plist, unalias_copy_merge)
CU_ASSERT_STRING_EQUAL (p1.qos.partition.strs[0], p0.qos.partition.strs[0]); CU_ASSERT_STRING_EQUAL (p1.qos.partition.strs[0], p0.qos.partition.strs[0]);
CU_ASSERT_STRING_EQUAL (p1.qos.partition.strs[1], p0.qos.partition.strs[1]); CU_ASSERT_STRING_EQUAL (p1.qos.partition.strs[1], p0.qos.partition.strs[1]);
CU_ASSERT_STRING_EQUAL (p1.qos.partition.strs[2], p0.qos.partition.strs[2]); CU_ASSERT_STRING_EQUAL (p1.qos.partition.strs[2], p0.qos.partition.strs[2]);
#ifdef DDSI_INCLUDE_SECURITY
CU_ASSERT (p1.identity_token.class_id != p0.identity_token.class_id);
CU_ASSERT_STRING_EQUAL (p1.identity_token.class_id, p0.identity_token.class_id);
CU_ASSERT (p1.identity_token.properties.n == p0.identity_token.properties.n);
CU_ASSERT (p1.identity_token.properties.props != p0.identity_token.properties.props);
CU_ASSERT (p1.identity_token.properties.props[0].name != p0.identity_token.properties.props[0].name);
CU_ASSERT (p1.identity_token.properties.props[0].value != p0.identity_token.properties.props[0].value);
CU_ASSERT (p1.identity_token.properties.props[0].propagate == p0.identity_token.properties.props[0].propagate);
CU_ASSERT (p1.identity_token.properties.props[1].name != p0.identity_token.properties.props[1].name);
CU_ASSERT (p1.identity_token.properties.props[1].value != p0.identity_token.properties.props[1].value);
CU_ASSERT (p1.identity_token.properties.props[1].propagate == p0.identity_token.properties.props[1].propagate);
CU_ASSERT_STRING_EQUAL (p1.identity_token.properties.props[0].name, p0.identity_token.properties.props[0].name);
CU_ASSERT_STRING_EQUAL (p1.identity_token.properties.props[0].value, p0.identity_token.properties.props[0].value);
CU_ASSERT_STRING_EQUAL (p1.identity_token.properties.props[1].name, p0.identity_token.properties.props[1].name);
CU_ASSERT_STRING_EQUAL (p1.identity_token.properties.props[1].value, p0.identity_token.properties.props[1].value);
CU_ASSERT (p1.identity_token.binary_properties.n == 0);
CU_ASSERT (p1.identity_token.binary_properties.props == NULL);
#endif
/* merge-in missing ones from an aliased copy: original must remain unchanged; /* merge-in missing ones from an aliased copy: original must remain unchanged;
existing ones should stay without touching "aliased" only new ones are existing ones should stay without touching "aliased" only new ones are
@ -94,6 +137,24 @@ CU_Test (ddsi_plist, unalias_copy_merge)
CU_ASSERT_STRING_EQUAL (p2.qos.partition.strs[0], p0.qos.partition.strs[0]); CU_ASSERT_STRING_EQUAL (p2.qos.partition.strs[0], p0.qos.partition.strs[0]);
CU_ASSERT_STRING_EQUAL (p2.qos.partition.strs[1], p0.qos.partition.strs[1]); CU_ASSERT_STRING_EQUAL (p2.qos.partition.strs[1], p0.qos.partition.strs[1]);
CU_ASSERT_STRING_EQUAL (p2.qos.partition.strs[2], p0.qos.partition.strs[2]); CU_ASSERT_STRING_EQUAL (p2.qos.partition.strs[2], p0.qos.partition.strs[2]);
#ifdef DDSI_INCLUDE_SECURITY
CU_ASSERT (p2.identity_token.class_id != p0.identity_token.class_id);
CU_ASSERT_STRING_EQUAL (p2.identity_token.class_id, p0.identity_token.class_id);
CU_ASSERT (p2.identity_token.properties.n == p0.identity_token.properties.n);
CU_ASSERT (p2.identity_token.properties.props != p0.identity_token.properties.props);
CU_ASSERT (p2.identity_token.properties.props[0].name != p0.identity_token.properties.props[0].name);
CU_ASSERT (p2.identity_token.properties.props[0].value != p0.identity_token.properties.props[0].value);
CU_ASSERT (p2.identity_token.properties.props[0].propagate == p0.identity_token.properties.props[0].propagate);
CU_ASSERT (p2.identity_token.properties.props[1].name != p0.identity_token.properties.props[1].name);
CU_ASSERT (p2.identity_token.properties.props[1].value != p0.identity_token.properties.props[1].value);
CU_ASSERT (p2.identity_token.properties.props[1].propagate == p0.identity_token.properties.props[1].propagate);
CU_ASSERT_STRING_EQUAL (p2.identity_token.properties.props[0].name, p0.identity_token.properties.props[0].name);
CU_ASSERT_STRING_EQUAL (p2.identity_token.properties.props[0].value, p0.identity_token.properties.props[0].value);
CU_ASSERT_STRING_EQUAL (p2.identity_token.properties.props[1].name, p0.identity_token.properties.props[1].name);
CU_ASSERT_STRING_EQUAL (p2.identity_token.properties.props[1].value, p0.identity_token.properties.props[1].value);
CU_ASSERT (p2.identity_token.binary_properties.n == 0);
CU_ASSERT (p2.identity_token.binary_properties.props == NULL);
#endif
/* unalias of p0, partition.strs mustn't change, because it, unlike its elements, wasn't aliased */ /* unalias of p0, partition.strs mustn't change, because it, unlike its elements, wasn't aliased */
nn_plist_unalias (&p0); nn_plist_unalias (&p0);
@ -112,6 +173,17 @@ CU_Test (ddsi_plist, unalias_copy_merge)
CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[0], p0strs[0]); CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[0], p0strs[0]);
CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[1], p0strs[1]); CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[1], p0strs[1]);
CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[2], p0strs[2]); CU_ASSERT_STRING_EQUAL (p0.qos.partition.strs[2], p0strs[2]);
#ifdef DDSI_INCLUDE_SECURITY
CU_ASSERT (p0.identity_token.properties.props[0].name != p0strs[3]);
CU_ASSERT (p0.identity_token.properties.props[0].value != p0strs[4]);
CU_ASSERT (p0.identity_token.properties.props[1].name != p0strs[5]);
CU_ASSERT (p0.identity_token.properties.props[1].value != p0strs[6]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[0].name, p0strs[3]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[0].value, p0strs[4]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[1].name, p0strs[5]);
CU_ASSERT_STRING_EQUAL (p0.identity_token.properties.props[1].value, p0strs[6]);
#endif
memcpy (&p0memcpy, &p0, sizeof (p0)); memcpy (&p0memcpy, &p0, sizeof (p0));
/* copy an aliased one; the original must be unchanged, the copy unaliased */ /* copy an aliased one; the original must be unchanged, the copy unaliased */
@ -134,6 +206,24 @@ CU_Test (ddsi_plist, unalias_copy_merge)
CU_ASSERT_STRING_EQUAL (p3.qos.partition.strs[0], p0.qos.partition.strs[0]); CU_ASSERT_STRING_EQUAL (p3.qos.partition.strs[0], p0.qos.partition.strs[0]);
CU_ASSERT_STRING_EQUAL (p3.qos.partition.strs[1], p0.qos.partition.strs[1]); CU_ASSERT_STRING_EQUAL (p3.qos.partition.strs[1], p0.qos.partition.strs[1]);
CU_ASSERT_STRING_EQUAL (p3.qos.partition.strs[2], p0.qos.partition.strs[2]); CU_ASSERT_STRING_EQUAL (p3.qos.partition.strs[2], p0.qos.partition.strs[2]);
#ifdef DDSI_INCLUDE_SECURITY
CU_ASSERT (p3.identity_token.class_id != p0.identity_token.class_id);
CU_ASSERT_STRING_EQUAL (p3.identity_token.class_id, p0.identity_token.class_id);
CU_ASSERT (p3.identity_token.properties.n == p0.identity_token.properties.n);
CU_ASSERT (p3.identity_token.properties.props != p0.identity_token.properties.props);
CU_ASSERT (p3.identity_token.properties.props[0].name != p0.identity_token.properties.props[0].name);
CU_ASSERT (p3.identity_token.properties.props[0].value != p0.identity_token.properties.props[0].value);
CU_ASSERT (p3.identity_token.properties.props[0].propagate == p0.identity_token.properties.props[0].propagate);
CU_ASSERT (p3.identity_token.properties.props[1].name != p0.identity_token.properties.props[1].name);
CU_ASSERT (p3.identity_token.properties.props[1].value != p0.identity_token.properties.props[1].value);
CU_ASSERT (p3.identity_token.properties.props[1].propagate == p0.identity_token.properties.props[1].propagate);
CU_ASSERT_STRING_EQUAL (p3.identity_token.properties.props[0].name, p0.identity_token.properties.props[0].name);
CU_ASSERT_STRING_EQUAL (p3.identity_token.properties.props[0].value, p0.identity_token.properties.props[0].value);
CU_ASSERT_STRING_EQUAL (p3.identity_token.properties.props[1].name, p0.identity_token.properties.props[1].name);
CU_ASSERT_STRING_EQUAL (p3.identity_token.properties.props[1].value, p0.identity_token.properties.props[1].value);
CU_ASSERT (p3.identity_token.binary_properties.n == 0);
CU_ASSERT (p3.identity_token.binary_properties.props == NULL);
#endif
/* merge-in missing ones from an aliased copy: original must remain unchanged; /* merge-in missing ones from an aliased copy: original must remain unchanged;
existing ones should stay without touching "aliased" only new ones are existing ones should stay without touching "aliased" only new ones are
@ -161,6 +251,24 @@ CU_Test (ddsi_plist, unalias_copy_merge)
CU_ASSERT_STRING_EQUAL (p4.qos.partition.strs[0], p0.qos.partition.strs[0]); CU_ASSERT_STRING_EQUAL (p4.qos.partition.strs[0], p0.qos.partition.strs[0]);
CU_ASSERT_STRING_EQUAL (p4.qos.partition.strs[1], p0.qos.partition.strs[1]); CU_ASSERT_STRING_EQUAL (p4.qos.partition.strs[1], p0.qos.partition.strs[1]);
CU_ASSERT_STRING_EQUAL (p4.qos.partition.strs[2], p0.qos.partition.strs[2]); CU_ASSERT_STRING_EQUAL (p4.qos.partition.strs[2], p0.qos.partition.strs[2]);
#ifdef DDSI_INCLUDE_SECURITY
CU_ASSERT (p4.identity_token.class_id != p0.identity_token.class_id);
CU_ASSERT_STRING_EQUAL (p4.identity_token.class_id, p0.identity_token.class_id);
CU_ASSERT (p4.identity_token.properties.n == p0.identity_token.properties.n);
CU_ASSERT (p4.identity_token.properties.props != p0.identity_token.properties.props);
CU_ASSERT (p4.identity_token.properties.props[0].name != p0.identity_token.properties.props[0].name);
CU_ASSERT (p4.identity_token.properties.props[0].value != p0.identity_token.properties.props[0].value);
CU_ASSERT (p4.identity_token.properties.props[0].propagate == p0.identity_token.properties.props[0].propagate);
CU_ASSERT (p4.identity_token.properties.props[1].name != p0.identity_token.properties.props[1].name);
CU_ASSERT (p4.identity_token.properties.props[1].value != p0.identity_token.properties.props[1].value);
CU_ASSERT (p4.identity_token.properties.props[1].propagate == p0.identity_token.properties.props[1].propagate);
CU_ASSERT_STRING_EQUAL (p4.identity_token.properties.props[0].name, p0.identity_token.properties.props[0].name);
CU_ASSERT_STRING_EQUAL (p4.identity_token.properties.props[0].value, p0.identity_token.properties.props[0].value);
CU_ASSERT_STRING_EQUAL (p4.identity_token.properties.props[1].name, p0.identity_token.properties.props[1].name);
CU_ASSERT_STRING_EQUAL (p4.identity_token.properties.props[1].value, p0.identity_token.properties.props[1].value);
CU_ASSERT (p4.identity_token.binary_properties.n == 0);
CU_ASSERT (p4.identity_token.binary_properties.props == NULL);
#endif
nn_plist_fini (&p0); nn_plist_fini (&p0);
nn_plist_fini (&p1); nn_plist_fini (&p1);