1 #include <unistd.h> 2 #include <fcntl.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <errno.h> 6 #include <sys/xattr.h> 7 #include "selinux_internal.h" 8 #include "policy.h" 9 10 int fgetfilecon(int fd, security_context_t * context) 11 { 12 char *buf; 13 ssize_t size; 14 ssize_t ret; 15 16 size = INITCONTEXTLEN + 1; 17 buf = malloc(size); 18 if (!buf) 19 return -1; 20 memset(buf, 0, size); 21 22 ret = fgetxattr(fd, XATTR_NAME_SELINUX, buf, size - 1); 23 if (ret < 0 && errno == ERANGE) { 24 char *newbuf; 25 26 size = fgetxattr(fd, XATTR_NAME_SELINUX, NULL, 0); 27 if (size < 0) 28 goto out; 29 30 size++; 31 newbuf = realloc(buf, size); 32 if (!newbuf) 33 goto out; 34 35 buf = newbuf; 36 memset(buf, 0, size); 37 ret = fgetxattr(fd, XATTR_NAME_SELINUX, buf, size - 1); 38 } 39 out: 40 if (ret == 0) { 41 /* Re-map empty attribute values to errors. */ 42 errno = EOPNOTSUPP; 43 ret = -1; 44 } 45 if (ret < 0) 46 free(buf); 47 else 48 *context = buf; 49 return ret; 50 } 51 52