[sanitizer] Intercept inet_aton.

llvm-svn: 184735
This commit is contained in:
Evgeniy Stepanov 2013-06-24 13:56:14 +00:00
parent 830550ce4c
commit 02a7460d12
5 changed files with 34 additions and 1 deletions

View File

@ -1950,6 +1950,15 @@ TEST(MemorySanitizer, inet_pton) {
EXPECT_NOT_POISONED(s_out[3]);
}
TEST(MemorySanitizer, inet_aton) {
const char *s = "127.0.0.1";
struct in_addr in[2];
int res = inet_aton(s, in);
ASSERT_NE(0, res);
EXPECT_NOT_POISONED(in[0]);
EXPECT_POISONED(*(char *)(in + 1));
}
TEST(MemorySanitizer, uname) {
struct utsname u;
int res = uname(&u);

View File

@ -878,6 +878,23 @@ INTERCEPTOR(int, inet_pton, int af, const char *src, void *dst) {
#define INIT_INET
#endif
#if SANITIZER_INTERCEPT_INET
INTERCEPTOR(int, inet_aton, const char *cp, void *dst) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, inet_aton, cp, dst);
if (cp) COMMON_INTERCEPTOR_READ_RANGE(ctx, cp, REAL(strlen)(cp) + 1);
int res = REAL(inet_aton)(cp, dst);
if (res != 0) {
uptr sz = __sanitizer_in_addr_sz(af_inet);
if (sz) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, sz);
}
return res;
}
#define INIT_INET_ATON INTERCEPT_FUNCTION(inet_aton);
#else
#define INIT_INET_ATON
#endif
#if SANITIZER_INTERCEPT_PTHREAD_GETSCHEDPARAM
INTERCEPTOR(int, pthread_getschedparam, uptr thread, int *policy, int *param) {
void *ctx;
@ -1275,4 +1292,5 @@ INTERCEPTOR(int, getpeername, int sockfd, void *addr, unsigned *addrlen) {
INIT_MODF; \
INIT_RECVMSG; \
INIT_GETPEERNAME; \
INIT_IOCTL;
INIT_IOCTL; \
INIT_INET_ATON;

View File

@ -90,5 +90,6 @@
# define SANITIZER_INTERCEPT_RECVMSG SI_NOT_WINDOWS
# define SANITIZER_INTERCEPT_GETPEERNAME SI_NOT_WINDOWS
# define SANITIZER_INTERCEPT_IOCTL SI_NOT_WINDOWS
# define SANITIZER_INTERCEPT_INET_ATON SI_NOT_WINDOWS
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H

View File

@ -148,6 +148,9 @@ namespace __sanitizer {
return a->sa_flags & SA_SIGINFO;
}
int af_inet = (int)AF_INET;
int af_inet6 = (int)AF_INET6;
uptr __sanitizer_in_addr_sz(int af) {
if (af == AF_INET)
return sizeof(struct in_addr);

View File

@ -112,6 +112,8 @@ namespace __sanitizer {
extern int e_tabsz;
#endif
extern int af_inet;
extern int af_inet6;
uptr __sanitizer_in_addr_sz(int af);
#if SANITIZER_LINUX