API and build change and fix summaries. Doc correctsions
and/or changes are not mentioned here; see the commit messages.
+2020 February 24; version 3.2.4
+ Fix meid bug (RIC-220) causing core dump.
+
2020 February 21; version 3.2.3
Add meid routing support to the SI95 interface.
set( major_version "3" ) # should be automatically populated from git tag later, but until CI process sets a tag we use this
set( minor_version "2" )
-set( patch_level "3" )
+set( patch_level "4" )
set( install_root "${CMAKE_INSTALL_PREFIX}" )
set( install_inc "include/rmr" )
We've been told that the meid is a string, thus we count on it being a nil
terminated set of bytes.
+
+ If we return false there is no guarentee that the caller's reference to the
+ ep is valid or nil. Caller can trus the ep reference only when the return is
+ true.
*/
static int epsock_meid( route_table_t *rtable, rmr_mbuf_t* msg, nng_socket* nn_sock, endpoint_t** uepp ) {
endpoint_t* ep; // seected end point
int state = FALSE; // processing state
char* meid;
-
errno = 0;
if( ! nn_sock || msg == NULL || rtable == NULL ) { // missing stuff; bail fast
errno = EINVAL;
meid = ((uta_mhdr_t *) msg->header)->meid;
if( (ep = get_meid_owner( rtable, meid )) == NULL ) {
- if( uepp != NULL ) { // caller needs refernce to endpoint too
- *uepp = NULL;
- }
-
if( DEBUG ) rmr_vlog( RMR_VL_DEBUG, "epsock_meid: no ep in hash for (%s)\n", meid );
return FALSE;
}
+ if( uepp != NULL ) { // ensure ep is returned to the caller
+ *uepp = ep;
+ }
+
state = TRUE;
if( ! ep->open ) { // not connected
if( ep->addr == NULL ) { // name didn't resolve before, try again
We've been told that the meid is a string, thus we count on it being a nil
terminated set of bytes.
+
+ If we return false the caller's ep reference may NOT be valid or even nil.
*/
static int epsock_meid( uta_ctx_t* ctx, route_table_t *rtable, rmr_mbuf_t* msg, int* nn_sock, endpoint_t** uepp ) {
endpoint_t* ep; // seected end point
meid = ((uta_mhdr_t *) msg->header)->meid;
- if( (ep = get_meid_owner( rtable, meid )) == NULL ) {
- if( uepp != NULL ) { // caller needs refernce to endpoint too
- *uepp = NULL;
- }
+ ep = get_meid_owner( rtable, meid );
+ if( uepp != NULL ) { // caller needs refernce to endpoint too
+ *uepp = ep;
+ }
+ if( ep == NULL ) {
if( DEBUG ) rmr_vlog( RMR_VL_DEBUG, "epsock_meid: no ep in hash for (%s)\n", meid );
return FALSE;
}
mbuf->len = 100;
rmr_str2meid( mbuf, "meid1" ); // id that we know is in the map
+ ep = NULL; // force to nil so we see it go non-nil
state = epsock_meid( ctx->rtable, mbuf, &nn_sock, &ep );
errors += fail_if_nil( ep, "ep was nil when looking up ep with known meid in message" );
errors += fail_not_equal( state, 1, "state was not true when looking up ep with known meid in message" );
rmr_str2meid( mbuf, "XXXmeid1" ); // id that we know is NOT in the map
state = epsock_meid( ctx->rtable, mbuf, &nn_sock, &ep );
- errors += fail_not_nil( ep, "ep was NOT nil when looking ep up with unknown meid in message" );
+ // it is NOT a valid check to test ep for nil -- epsock_mied doesn't guarentee ep is set/cleared when state is false
errors += fail_not_equal( state, 0, "state was not false when looking up ep with unknown meid in message" );
return !!errors; // 1 or 0 regardless of count