// Use the libarchive entry to store common attributes
struct archive_entry* entry;
- // File Descriptor
- int fd;
-
// Capabilities
cap_t caps;
// Initialize reference counter
f->nrefs = 1;
- // Initialize file descriptor
- f->fd = -EBADF;
-
// Create a new archive entry
f->entry = archive_entry_new();
if (!f->entry) {
}
static void pakfire_file_free(struct pakfire_file* file) {
- if (file->fd >= 0)
- close(file->fd);
-
// Free capabilities
if (file->caps)
cap_free(file->caps);
return 0;
}
-// File Descriptor
-
-int pakfire_file_get_fd(struct pakfire_file* file) {
- return file->fd;
-}
-
-int pakfire_file_set_fd(struct pakfire_file* file, int fd) {
- // Close any previously assigned file descriptors
- if (file->fd >= 0)
- close(file->fd);
-
- // Duplicate the file descriptor
- file->fd = dup(fd);
- if (file->fd < 0) {
- ERROR(file->ctx, "Could not duplicate file descriptor: %m\n");
- return -errno;
- }
-
- return 0;
-}
-
#define pakfire_file_strmode(file, buffer) \
__pakfire_file_strmode(file, buffer, sizeof(buffer))
}
static int pakfire_linter_file_is_elf(
- struct pakfire_linter* linter, struct pakfire_file* file) {
+ struct pakfire_linter* linter, struct pakfire_file* file, int fd) {
Elf* elf = NULL;
int r;
- // Fetch the file descriptor
- int fd = pakfire_file_get_fd(file);
-
// Initialize libelf
r = pakfire_linter_init_libelf(linter);
if (r < 0)
/*
A helper function that opens an ELF file and calls a callback.
*/
-static int pakfire_linter_elf(struct pakfire_linter* linter, struct pakfire_file* file,
+static int pakfire_linter_elf(struct pakfire_linter* linter, struct pakfire_file* file, int fd,
int (*callback)(struct pakfire_linter* linter, struct pakfire_file* file, Elf* elf, void* data),
void* data) {
Elf* elf = NULL;
- int fd = -EBADF;
int r;
// Initialize libelf
if (r < 0)
return r;
- // Fetch file descriptor
- fd = pakfire_file_get_fd(file);
- if (fd < 0)
- return fd;
-
// Parse the ELF header
elf = elf_begin(fd, ELF_C_READ, NULL);
if (!elf) {
}
static int pakfire_linter_get_elf_type(
- struct pakfire_linter* linter, struct pakfire_file* file) {
+ struct pakfire_linter* linter, struct pakfire_file* file, int fd) {
int type = ET_NONE;
int r;
// Fetch the type
- r = pakfire_linter_elf(linter, file, __pakfire_linter_get_elf_type, &type);
+ r = pakfire_linter_elf(linter, file, fd, __pakfire_linter_get_elf_type, &type);
if (r < 0)
return r;
}
static int pakfire_linter_check_pie(
- struct pakfire_linter* linter, struct pakfire_file* file) {
- switch (pakfire_linter_get_elf_type(linter, file)) {
+ struct pakfire_linter* linter, struct pakfire_file* file, int fd) {
+ switch (pakfire_linter_get_elf_type(linter, file, fd)) {
// Shared Object files are good
case ET_DYN:
return 0;
goto ERROR;
}
- // Store the file descriptor
- r = pakfire_file_set_fd(file, fd);
- if (r < 0)
- goto ERROR;
+ return fd;
ERROR:
if (fd >= 0)
static int pakfire_linter_payload(
struct pakfire_linter* linter, struct pakfire_file* file, struct archive* a) {
+ int fd = -EBADF;
int r;
// Fetch path
DEBUG(linter->ctx, "Checking payload of %s\n", path);
// Read the file
- r = pakfire_linter_read_file(linter, file, a);
+ fd = r = pakfire_linter_read_file(linter, file, a);
if (r < 0)
goto ERROR;
// Check ELF files
- if (pakfire_linter_file_is_elf(linter, file)) {
+ if (pakfire_linter_file_is_elf(linter, file, fd)) {
// Check PIE
- r = pakfire_linter_check_pie(linter, file);
+ r = pakfire_linter_check_pie(linter, file, fd);
if (r < 0)
goto ERROR;