data_getf1.c 537 B

12345678910111213141516171819202122232425262728293031323334
  1. #include <bits/socket.h>
  2. #include <nlusctl.h>
  3. #include <cmsg.h>
  4. int ux_getf1(struct ucaux* ux)
  5. {
  6. void* buf = ux->buf;
  7. struct cmsg* cm = buf;
  8. int* fp = (void*)cm->data;
  9. uint len = sizeof(*cm) + sizeof(*fp);
  10. uint mask = sizeof(long) - 1;
  11. uint size = (len + mask) & ~mask;
  12. int ptr = ux->ptr;
  13. if(ptr < (int)len)
  14. goto bad;
  15. if((uint)ptr > size)
  16. goto bad;
  17. if(cm->len != len)
  18. goto bad;
  19. if(cm->level != SOL_SOCKET)
  20. goto bad;
  21. if(cm->type != SCM_RIGHTS)
  22. goto bad;
  23. int fd = *fp;
  24. *fp = -1;
  25. return fd;
  26. bad:
  27. return -1;
  28. }