DragonFlyBSD Kernel Audit
DF-2878 / regress.c
← back to finding ↓ download raw
#include <sys/types.h>
#include <sys/ioccom.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
#include <unistd.h>
#include <errno.h>
#define DISKMAGIC32 0x82564557u
struct p32 { uint32_t s,o,f; uint8_t t,fr; uint16_t c; };
struct l32 { uint32_t magic; uint16_t type,sub; char tn[16],pn[16];
  uint32_t secsize,nsect,ntrk,ncyl,spc,spu; uint16_t spt,spcyl; uint32_t acyl;
  uint16_t rpm,il,ts,cs; uint32_t hs,ttk,fl; uint32_t dd[5],sp[5];
  uint32_t magic2; uint16_t ck,nparts; uint32_t bbsize,sbsize;
  struct p32 parts[16]; };
_Static_assert(sizeof(struct l32)==404,"size");
#define DIOCSDINFO32 _IOW('d',102,struct l32)
static uint16_t cksum(struct l32*lp){uint16_t*p=(uint16_t*)lp,*e=(uint16_t*)&lp->parts[lp->nparts],s=0;while(p<e)s^=*p++;return s;}
int main(void){
  struct l32 lp; memset(&lp,0,sizeof lp);
  lp.magic=DISKMAGIC32; lp.secsize=512; lp.nsect=32; lp.ntrk=64; lp.spc=2048;
  lp.spu=61696; lp.il=1; lp.magic2=DISKMAGIC32; lp.nparts=3; lp.bbsize=8192; lp.sbsize=8192;
  lp.parts[0].s=16; lp.parts[0].o=2048; lp.parts[0].t=10;   /* 'a' IN-SLICE */
  lp.parts[2].s=61696; lp.parts[2].o=0;                      /* 'c' raw */
  lp.ck=cksum(&lp);
  int fd=open("/dev/vn0s1",O_RDWR);
  if(fd<0){perror("open");return 2;}
  if(ioctl(fd,DIOCSDINFO32,&lp)<0){printf("in-slice label REJECTED: %s\n",strerror(errno));return 1;}
  printf("in-slice label accepted (no regression)\n");
  return 0;
}