Check that topic is from the same participant
Things go really badly wrong when topics from one participant are used to create a reader/writer in another participant. This returns an error if they are not. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									7feab2e982
								
							
						
					
					
						commit
						f3d0438781
					
				
					 4 changed files with 33 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -347,8 +347,11 @@ dds_entity_t dds_create_reader (dds_entity_t participant_or_subscriber, dds_enti
 | 
			
		|||
    goto err_tp_lock;
 | 
			
		||||
  }
 | 
			
		||||
  assert (tp->m_stopic);
 | 
			
		||||
  /* FIXME: domain check */
 | 
			
		||||
  assert (sub->m_entity.m_domain == tp->m_entity.m_domain);
 | 
			
		||||
  if (sub->m_entity.m_participant != tp->m_entity.m_participant)
 | 
			
		||||
  {
 | 
			
		||||
    reader = DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
    goto err_pp_mismatch;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Merge qos from topic and subscriber, dds_copy_qos only fails when it is passed a null
 | 
			
		||||
     argument, but that isn't the case here */
 | 
			
		||||
| 
						 | 
				
			
			@ -414,6 +417,7 @@ dds_entity_t dds_create_reader (dds_entity_t participant_or_subscriber, dds_enti
 | 
			
		|||
  return reader;
 | 
			
		||||
 | 
			
		||||
err_bad_qos:
 | 
			
		||||
err_pp_mismatch:
 | 
			
		||||
  dds_topic_unlock (tp);
 | 
			
		||||
err_tp_lock:
 | 
			
		||||
  dds_subscriber_unlock (sub);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -274,9 +274,13 @@ dds_entity_t dds_create_writer (dds_entity_t participant_or_publisher, dds_entit
 | 
			
		|||
 | 
			
		||||
  if ((rc = dds_topic_lock (topic, &tp)) != DDS_RETCODE_OK)
 | 
			
		||||
    goto err_tp_lock;
 | 
			
		||||
 | 
			
		||||
  assert (tp->m_stopic);
 | 
			
		||||
  assert (pub->m_entity.m_domain == tp->m_entity.m_domain);
 | 
			
		||||
 | 
			
		||||
  if (pub->m_entity.m_participant != tp->m_entity.m_participant)
 | 
			
		||||
  {
 | 
			
		||||
    rc = DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
    goto err_pp_mismatch;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Merge Topic & Publisher qos */
 | 
			
		||||
  wqos = dds_create_qos ();
 | 
			
		||||
| 
						 | 
				
			
			@ -326,6 +330,7 @@ dds_entity_t dds_create_writer (dds_entity_t participant_or_publisher, dds_entit
 | 
			
		|||
  return writer;
 | 
			
		||||
 | 
			
		||||
err_bad_qos:
 | 
			
		||||
err_pp_mismatch:
 | 
			
		||||
  dds_topic_unlock (tp);
 | 
			
		||||
err_tp_lock:
 | 
			
		||||
  dds_publisher_unlock (pub);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -277,6 +277,17 @@ CU_Theory((dds_entity_t *par, dds_entity_t *top), ddsc_reader_create, non_partic
 | 
			
		|||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
CU_Test(ddsc_reader_create, wrong_participant, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t participant2 = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(participant2 > 0);
 | 
			
		||||
    dds_entity_t reader = dds_create_reader(participant2, g_topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(reader, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    dds_delete(participant2);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,6 +72,15 @@ CU_Test(ddsc_create_writer, participant, .init = setup, .fini = teardown)
 | 
			
		|||
    CU_ASSERT_FATAL(writer > 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, wrong_participant, .init = setup, .fini = teardown)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t participant2 = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(participant2 > 0);
 | 
			
		||||
    writer = dds_create_writer(participant2, topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    dds_delete(participant2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, publisher, .init = setup, .fini = teardown)
 | 
			
		||||
{
 | 
			
		||||
    writer = dds_create_writer(publisher, topic, NULL, NULL);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue