Home | History | Annotate | Download | only in src
      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