Viewing: orphan_linkea_check.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2014, 2015, Intel Corporation.
 * Use is subject to license terms.
 */
/*
 * Check that flistxattr() calls on orphans do not return "trusted.link" EAs.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/xattr.h>

int
main(int argc, char *argv[])
{
	char   *names;
	char   *name;
	ssize_t	size;
	int	fd;
	int	rc;

	fd = open(argv[1], O_RDWR | O_CREAT, 0666);
	if (fd == -1) {
		perror("open");
		return 1;
	}

	rc = unlink(argv[1]);
	if (rc == -1) {
		perror("unlink");
		close(fd);
		return 1;
	}

	size = flistxattr(fd, NULL, 0);
	if (size == -1) {
		perror("flistxattr size");
		close(fd);
		return 1;
	}

	names = malloc(size);
	if (names == NULL) {
		fprintf(stderr, "Cannot allocate names\n");
		close(fd);
		return 1;
	}

	size = flistxattr(fd, names, size);
	if (size == -1) {
		perror("flistxattr");
		free(names);
		close(fd);
		return 1;
	}

	for (name = names; name < names + size; name += strlen(name) + 1)
		if (strcmp(name, "trusted.link") == 0) {
			free(names);
			close(fd);
			return 1;
		}

	free(names);

	rc = close(fd);
	if (rc == -1) {
		perror("close");
		return 1;
	}

	return 0;
}