bool Th105DataArchiveExtractor::read_file(FileData &data, const FileInfo &info, FILE *fp) { if(fp == NULL) { return false; } fseek(fp, 0, SEEK_END); const unsigned int file_size = ftell(fp); if(info.filename[0] == '\0' || strnlen(info.filename, sizeof(info.filename)) >= sizeof(info.filename) || info.addr + info.comp_size > file_size){ return false; } data.set_path(info.filename); data.data = std::vector<unsigned char>(info.size); if(info.comp_size == 0) { return true; } fseek(fp, info.addr, SEEK_SET); unsigned char *p = &data.data.front(); if(fread(p, 1, info.comp_size, fp) != info.comp_size){ return false; } return true; }