Skip to content

Commit f33d51d

Browse files
committed
[sanitizer] Intercept sem_open/sem_unlink
Without interceptor implementation may call strlen on internal buffers causing false msan errors. Differential Revision: https://reviews.llvm.org/D107615
1 parent bb2a92e commit f33d51d

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6538,14 +6538,39 @@ INTERCEPTOR(int, sem_getvalue, __sanitizer_sem_t *s, int *sval) {
65386538
}
65396539
return res;
65406540
}
6541+
6542+
INTERCEPTOR(__sanitizer_sem_t *, sem_open, const char *name, int oflag, ...) {
6543+
void *ctx;
6544+
va_list ap;
6545+
va_start(ap, oflag);
6546+
u32 mode = va_arg(ap, u32);
6547+
u32 value = va_arg(ap, u32);
6548+
COMMON_INTERCEPTOR_ENTER(ctx, sem_open, name, oflag, mode, value);
6549+
COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1);
6550+
__sanitizer_sem_t *s = REAL(sem_open)(name, oflag, mode, value);
6551+
if (s)
6552+
COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, sizeof(*s));
6553+
va_end(ap);
6554+
return s;
6555+
}
6556+
6557+
INTERCEPTOR(int, sem_unlink, const char *name) {
6558+
void *ctx;
6559+
COMMON_INTERCEPTOR_ENTER(ctx, sem_unlink, name);
6560+
COMMON_INTERCEPTOR_READ_RANGE(ctx, name, REAL(strlen)(name) + 1);
6561+
return REAL(sem_unlink)(name);
6562+
}
6563+
65416564
# define INIT_SEM \
65426565
COMMON_INTERCEPT_FUNCTION(sem_init); \
65436566
COMMON_INTERCEPT_FUNCTION(sem_destroy); \
65446567
COMMON_INTERCEPT_FUNCTION(sem_wait); \
65456568
COMMON_INTERCEPT_FUNCTION(sem_trywait); \
65466569
COMMON_INTERCEPT_FUNCTION(sem_timedwait); \
65476570
COMMON_INTERCEPT_FUNCTION(sem_post); \
6548-
COMMON_INTERCEPT_FUNCTION(sem_getvalue);
6571+
COMMON_INTERCEPT_FUNCTION(sem_getvalue); \
6572+
COMMON_INTERCEPT_FUNCTION(sem_open); \
6573+
COMMON_INTERCEPT_FUNCTION(sem_unlink);
65496574
#else
65506575
# define INIT_SEM
65516576
#endif // SANITIZER_INTERCEPT_SEM
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: %clangxx -O0 %s -o %t && %run %t
2+
3+
// Android does not implement this calls.
4+
// UNSUPPORTED: android
5+
6+
#include <assert.h>
7+
#include <fcntl.h>
8+
#include <semaphore.h>
9+
#include <stdio.h>
10+
#include <unistd.h>
11+
12+
int main() {
13+
char name[1024];
14+
sprintf(name, "/sem_open_test_%d", getpid());
15+
16+
sem_t *s1 = sem_open(name, O_CREAT, 0644, 123);
17+
assert(s1 != SEM_FAILED);
18+
19+
sem_t *s2 = sem_open(name, O_CREAT, 0644, 123);
20+
assert(s2 != SEM_FAILED);
21+
22+
assert(sem_close(s1) == 0);
23+
assert(sem_close(s2) == 0);
24+
25+
assert(sem_unlink(name) == 0);
26+
}

0 commit comments

Comments
 (0)