forked from OSchip/llvm-project
				
			[sanitizer] LibraryNameIs in sanitizer_linux
llvm-svn: 181787
This commit is contained in:
		
							parent
							
								
									14b56186ab
								
							
						
					
					
						commit
						af05543c86
					
				| 
						 | 
					@ -854,6 +854,18 @@ void AdjustStackSizeLinux(void *attr_, int verbosity) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Match full names of the form /path/to/base_name{-,.}*
 | 
				
			||||||
 | 
					bool LibraryNameIs(const char *full_name, const char *base_name) {
 | 
				
			||||||
 | 
					  const char *name = full_name;
 | 
				
			||||||
 | 
					  // Strip path.
 | 
				
			||||||
 | 
					  while (*name != '\0') name++;
 | 
				
			||||||
 | 
					  while (name > full_name && *name != '/') name--;
 | 
				
			||||||
 | 
					  if (*name == '/') name++;
 | 
				
			||||||
 | 
					  uptr base_name_length = internal_strlen(base_name);
 | 
				
			||||||
 | 
					  if (internal_strncmp(name, base_name, base_name_length)) return false;
 | 
				
			||||||
 | 
					  return (name[base_name_length] == '-' || name[base_name_length] == '.');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace __sanitizer
 | 
					}  // namespace __sanitizer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // SANITIZER_LINUX
 | 
					#endif  // SANITIZER_LINUX
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,6 +56,10 @@ void AdjustStackSizeLinux(void *attr, int verbosity);
 | 
				
			||||||
// Exposed for testing.
 | 
					// Exposed for testing.
 | 
				
			||||||
uptr ThreadDescriptorSize();
 | 
					uptr ThreadDescriptorSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Matches a library's file name against a base name (stripping path and version
 | 
				
			||||||
 | 
					// information).
 | 
				
			||||||
 | 
					bool LibraryNameIs(const char *full_name, const char *base_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace __sanitizer
 | 
					}  // namespace __sanitizer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // SANITIZER_LINUX_H
 | 
					#endif  // SANITIZER_LINUX_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,6 +224,30 @@ TEST(SanitizerLinux, ThreadDescriptorSize) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(SanitizerCommon, LibraryNameIs) {
 | 
				
			||||||
 | 
					  EXPECT_FALSE(LibraryNameIs("", ""));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char full_name[256];
 | 
				
			||||||
 | 
					  const char *paths[] = { "", "/", "/path/to/" };
 | 
				
			||||||
 | 
					  const char *suffixes[] = { "", "-linux", ".1.2", "-linux.1.2" };
 | 
				
			||||||
 | 
					  const char *base_names[] = { "lib", "lib.0", "lib-i386" };
 | 
				
			||||||
 | 
					  const char *wrong_names[] = { "", "lib.9", "lib-x86_64" };
 | 
				
			||||||
 | 
					  for (uptr i = 0; i < ARRAY_SIZE(paths); i++)
 | 
				
			||||||
 | 
					    for (uptr j = 0; j < ARRAY_SIZE(suffixes); j++) {
 | 
				
			||||||
 | 
					      for (uptr k = 0; k < ARRAY_SIZE(base_names); k++) {
 | 
				
			||||||
 | 
					        internal_snprintf(full_name, ARRAY_SIZE(full_name), "%s%s%s.so",
 | 
				
			||||||
 | 
					                          paths[i], base_names[k], suffixes[j]);
 | 
				
			||||||
 | 
					        EXPECT_TRUE(LibraryNameIs(full_name, base_names[k]))
 | 
				
			||||||
 | 
					            << "Full name " << full_name
 | 
				
			||||||
 | 
					            << " doesn't match base name " << base_names[k];
 | 
				
			||||||
 | 
					        for (uptr m = 0; m < ARRAY_SIZE(wrong_names); m++)
 | 
				
			||||||
 | 
					          EXPECT_FALSE(LibraryNameIs(full_name, wrong_names[m]))
 | 
				
			||||||
 | 
					            << "Full name " << full_name
 | 
				
			||||||
 | 
					            << " matches base name " << wrong_names[m];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace __sanitizer
 | 
					}  // namespace __sanitizer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // SANITIZER_LINUX 
 | 
					#endif  // SANITIZER_LINUX 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue