#include "pt_sb_file.h"
#include <stdint.h>
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include "intel-pt.h"
int pt_sb_file_load(void **pbuffer, size_t *psize, const char *filename,
size_t begin, size_t end)
{
size_t size;
FILE *file;
void *content;
long fsize, fbegin, fend;
int errcode;
if (!pbuffer || !psize || !filename)
return -pte_invalid;
if (end && end <= begin)
return -pte_invalid;
if (LONG_MAX < begin || LONG_MAX < end)
return -pte_invalid;
file = fopen(filename, "rb");
if (!file)
return -pte_bad_file;
errcode = fseek(file, 0, SEEK_END);
if (errcode)
goto out_file;
fsize = ftell(file);
if (fsize < 0)
goto out_file;
fbegin = (long) begin;
if (!end)
fend = fsize;
else {
fend = (long) end;
if (fsize < fend)
fend = fsize;
}
size = (size_t) (fend - fbegin);
errcode = fseek(file, fbegin, SEEK_SET);
if (errcode)
goto out_file;
content = malloc(size);
if (!content) {
fclose(file);
return -pte_nomem;
}
*psize = fread(content, 1, size, file);
*pbuffer = content;
fclose(file);
return 0;
out_file:
fclose(file);
return -pte_bad_file;
}