/* if sleeping is allowed, wait for the page, if necessary */ if (r->may_fault && (IS_ERR(r->folio) || !folio_test_uptodate(r->folio))) {
filemap_invalidate_lock_shared(r->file->f_mapping);
r->folio = read_cache_folio(r->file->f_mapping, file_off >> PAGE_SHIFT,
NULL, r->file);
filemap_invalidate_unlock_shared(r->file->f_mapping);
}
if (IS_ERR(r->folio) || !folio_test_uptodate(r->folio)) { if (!IS_ERR(r->folio))
folio_put(r->folio);
r->folio = NULL; return -EFAULT;
}
/* working with memory buffer is much more straightforward */ if (!r->buf) { if (file_off + sz > r->data_sz) {
r->err = -ERANGE; return NULL;
} return r->data + file_off;
}
/* fetch or reuse folio for given file offset */
r->err = freader_get_folio(r, file_off); if (r->err) return NULL;
/* if requested data is crossing folio boundaries, we have to copy * everything into our local buffer to keep a simple linear memory * access interface
*/
folio_sz = folio_size(r->folio); if (file_off + sz > r->folio_off + folio_sz) { int part_sz = r->folio_off + folio_sz - file_off;
/* copy the part that resides in the current folio */
memcpy(r->buf, r->addr + (file_off - r->folio_off), part_sz);
/* fetch next folio */
r->err = freader_get_folio(r, r->folio_off + folio_sz); if (r->err) return NULL;
/* copy the rest of requested data */
memcpy(r->buf + part_sz, r->addr, sz - part_sz);
return r->buf;
}
/* if data fits in a single folio, just return direct pointer */ return r->addr + (file_off - r->folio_off);
}
/* only support executable file and shared object file */ if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) goto out;
if (ehdr->e_ident[EI_CLASS] == ELFCLASS32)
ret = get_build_id_32(&r, build_id, size); elseif (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
ret = get_build_id_64(&r, build_id, size);
out:
freader_cleanup(&r); return ret;
}
/* * Parse build ID of ELF file mapped to vma * @vma: vma object * @build_id: buffer to store build id, at least BUILD_ID_SIZE long * @size: returns actual build id size in case of success * * Assumes no page fault can be taken, so if relevant portions of ELF file are * not already paged in, fetching of build ID fails. * * Return: 0 on success; negative error, otherwise
*/ int build_id_parse_nofault(struct vm_area_struct *vma, unsignedchar *build_id, __u32 *size)
{ return __build_id_parse(vma, build_id, size, false/* !may_fault */);
}
/* * Parse build ID of ELF file mapped to VMA * @vma: vma object * @build_id: buffer to store build id, at least BUILD_ID_SIZE long * @size: returns actual build id size in case of success * * Assumes faultable context and can cause page faults to bring in file data * into page cache. * * Return: 0 on success; negative error, otherwise
*/ int build_id_parse(struct vm_area_struct *vma, unsignedchar *build_id, __u32 *size)
{ return __build_id_parse(vma, build_id, size, true/* may_fault */);
}
/** * build_id_parse_buf - Get build ID from a buffer * @buf: ELF note section(s) to parse * @buf_size: Size of @buf in bytes * @build_id: Build ID parsed from @buf, at least BUILD_ID_SIZE_MAX long * * Return: 0 on success, -EINVAL otherwise
*/ int build_id_parse_buf(constvoid *buf, unsignedchar *build_id, u32 buf_size)
{ struct freader r; int err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.