Add interceptor for the setvbuf(3) from NetBSD
Summary: setvbuf(3) is a routine to setup stream buffering. Enable the interceptor for NetBSD. Add dedicated tests for setvbuf(3) and functions on top of this interface: setbuf, setbuffer, setlinebuf. Based on original work by Yang Zheng. Reviewers: joerg, vitalybuka Reviewed By: vitalybuka Subscribers: devnexen, tomsun.0.7, kubamracek, llvm-commits, mgorny, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D54548 llvm-svn: 347270
This commit is contained in:
		
							parent
							
								
									994a8451ba
								
							
						
					
					
						commit
						74abaf8cdc
					
				| 
						 | 
				
			
			@ -7298,6 +7298,21 @@ INTERCEPTOR(void, mi_vector_hash, const void *key, SIZE_T len, u32 seed,
 | 
			
		|||
#define INIT_MI_VECTOR_HASH
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if SANITIZER_INTERCEPT_SETVBUF
 | 
			
		||||
INTERCEPTOR(int, setvbuf, __sanitizer_FILE *stream, char *buf, int mode,
 | 
			
		||||
  SIZE_T size) {
 | 
			
		||||
  void *ctx;
 | 
			
		||||
  COMMON_INTERCEPTOR_ENTER(ctx, setvbuf, stream, buf, mode, size);
 | 
			
		||||
  int ret = REAL(setvbuf)(stream, buf, mode, size);
 | 
			
		||||
  if (buf)
 | 
			
		||||
    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, size);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#define INIT_SETVBUF COMMON_INTERCEPT_FUNCTION(setvbuf)
 | 
			
		||||
#else
 | 
			
		||||
#define INIT_SETVBUF
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void InitializeCommonInterceptors() {
 | 
			
		||||
  static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
 | 
			
		||||
  interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap();
 | 
			
		||||
| 
						 | 
				
			
			@ -7553,6 +7568,7 @@ static void InitializeCommonInterceptors() {
 | 
			
		|||
  INIT_NETENT;
 | 
			
		||||
  INIT_GETMNTINFO;
 | 
			
		||||
  INIT_MI_VECTOR_HASH;
 | 
			
		||||
  INIT_SETVBUF;
 | 
			
		||||
 | 
			
		||||
  INIT___PRINTF_CHK;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -516,6 +516,7 @@
 | 
			
		|||
#define SANITIZER_INTERCEPT_TTYENT SI_NETBSD
 | 
			
		||||
#define SANITIZER_INTERCEPT_PROTOENT SI_NETBSD
 | 
			
		||||
#define SANITIZER_INTERCEPT_NETENT SI_NETBSD
 | 
			
		||||
#define SANITIZER_INTERCEPT_SETVBUF SI_NETBSD
 | 
			
		||||
#define SANITIZER_INTERCEPT_GETMNTINFO SI_NETBSD
 | 
			
		||||
#define SANITIZER_INTERCEPT_MI_VECTOR_HASH SI_NETBSD
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
void print_something() {
 | 
			
		||||
  for (size_t i = 0; i < 10 * BUFSIZ; i++)
 | 
			
		||||
    printf("Hello world %zu\n", i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void test_setbuf() {
 | 
			
		||||
  char buf[BUFSIZ];
 | 
			
		||||
 | 
			
		||||
  setbuf(stdout, NULL);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
 | 
			
		||||
  setbuf(stdout, buf);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void test_setbuffer() {
 | 
			
		||||
  char buf[BUFSIZ];
 | 
			
		||||
 | 
			
		||||
  setbuffer(stdout, NULL, 0);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
 | 
			
		||||
  setbuffer(stdout, buf, BUFSIZ);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void test_setlinebuf() {
 | 
			
		||||
  char buf[BUFSIZ];
 | 
			
		||||
 | 
			
		||||
  setlinebuf(stdout);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void test_setvbuf() {
 | 
			
		||||
  char buf[BUFSIZ];
 | 
			
		||||
 | 
			
		||||
  setvbuf(stdout, NULL, _IONBF, 0);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
 | 
			
		||||
  setvbuf(stdout, buf, _IOLBF, BUFSIZ);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
 | 
			
		||||
  setvbuf(stdout, buf, _IOFBF, BUFSIZ);
 | 
			
		||||
 | 
			
		||||
  print_something();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(void) {
 | 
			
		||||
  printf("setvbuf\n");
 | 
			
		||||
 | 
			
		||||
  test_setbuf();
 | 
			
		||||
  test_setbuffer();
 | 
			
		||||
  test_setlinebuf();
 | 
			
		||||
  test_setvbuf();
 | 
			
		||||
 | 
			
		||||
  // CHECK: setvbuf
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue