24 lines
981 B
C
Raw Normal View History

2016-11-28 16:30:49 +01:00
#include "exefs.h"
2017-05-03 01:15:47 +02:00
#include "ncch.h"
2016-11-28 16:30:49 +01:00
u32 ValidateExeFsHeader(ExeFsHeader* exefs, u32 size) {
u8 zeroes[32] = { 0 };
2016-11-28 16:30:49 +01:00
u32 data_size = 0;
u32 n_files = 0;
2016-11-28 16:30:49 +01:00
for (u32 i = 0; i < 10; i++) {
ExeFsFileHeader* file = exefs->files + i;
u8* hash = exefs->hashes[9 - i];
if (file->size == 0) continue;
if (!*(file->name)) return 1; // zero filename -> not a valid ExeFS
2017-05-03 01:15:47 +02:00
if (file->offset % NCCH_MEDIA_UNIT) return 1; // not aligned to media unit, failed
if (file->offset < data_size) return 1; // overlapping data, failed
if (memcmp(hash, zeroes, 32) == 0) return 1; // hash not set, failed
if (file->size >= 0xFFFFFE00) return 1; // obviously an improper value, failed
2017-05-03 01:15:47 +02:00
data_size = file->offset + align(file->size, NCCH_MEDIA_UNIT);
n_files++;
2016-11-28 16:30:49 +01:00
}
if (size && (data_size > (size - sizeof(ExeFsHeader)))) // exefs header not included in table
return 1;
return (n_files) ? 0 : 1;
2016-11-28 16:30:49 +01:00
}