@@ -646,3 +646,90 @@ UCS_TEST_F(malloc_hook_cplusplus, mmap_ptrs) {
646646 unset ();
647647
648648}
649+
650+ UCS_TEST_F (malloc_hook_cplusplus, remap_override) {
651+
652+ /*
653+ * Test memory mapping functions which override an existing mapping
654+ */
655+
656+ size_t size = ucs_get_page_size () * 800 ;
657+ void *buffer;
658+ int shmid;
659+
660+ set ();
661+
662+ EXPECT_EQ (0u , m_mapped_size);
663+ EXPECT_EQ (0u , m_unmapped_size);
664+
665+ /* 1. Map a large buffer */
666+ {
667+ buffer = mmap (NULL , size, PROT_READ|PROT_WRITE,
668+ MAP_PRIVATE|MAP_ANONYMOUS, -1 , 0 );
669+ ASSERT_NE (MAP_FAILED, buffer) << strerror (errno);
670+
671+ EXPECT_EQ (size, m_mapped_size);
672+ EXPECT_EQ (0u , m_unmapped_size);
673+ }
674+
675+ /*
676+ * 2. Map another buffer in the same place.
677+ * Expected behavior: unmap event on the old buffer
678+ */
679+ {
680+ m_mapped_size = m_unmapped_size = 0 ;
681+
682+ void *remap = mmap (buffer, size, PROT_READ|PROT_WRITE,
683+ MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1 , 0 );
684+ ASSERT_EQ (buffer, remap);
685+
686+ EXPECT_EQ (size, m_mapped_size);
687+ EXPECT_EQ (size, m_unmapped_size);
688+ }
689+
690+ /* 3. Create a shared memory segment */
691+ {
692+ shmid = shmget (IPC_PRIVATE, size, IPC_CREAT | SHM_R | SHM_W);
693+ ASSERT_NE (-1 , shmid) << strerror (errno);
694+ }
695+
696+ /*
697+ * 4. Attach the segment at the same buffer address.
698+ * Expected behavior: unmap event on the old buffer
699+ */
700+ {
701+ m_mapped_size = m_unmapped_size = 0 ;
702+
703+ void *shmaddr = shmat (shmid, buffer, SHM_REMAP);
704+ ASSERT_EQ (buffer, shmaddr);
705+
706+ EXPECT_EQ (size, m_mapped_size);
707+ EXPECT_EQ (size, m_unmapped_size);
708+ }
709+
710+ /* 5. Detach the sysv segment */
711+ {
712+ m_mapped_size = m_unmapped_size = 0 ;
713+
714+ shmdt (buffer);
715+
716+ EXPECT_EQ (size, m_unmapped_size);
717+ }
718+
719+ /* 6. Remove the shared memory segment */
720+ {
721+ int ret = shmctl (shmid, IPC_RMID, NULL );
722+ ASSERT_NE (-1 , ret) << strerror (errno);
723+ }
724+
725+ /* 7. Unmap the buffer */
726+ {
727+ m_mapped_size = m_unmapped_size = 0 ;
728+
729+ munmap (buffer, size);
730+
731+ EXPECT_EQ (size, m_unmapped_size);
732+ }
733+
734+ unset ();
735+ }
0 commit comments