From ece2906cde1820ac2dbf5a7e0eb32173028b8d2f Mon Sep 17 00:00:00 2001 From: jakcron Date: Sun, 3 Oct 2021 12:01:23 +0800 Subject: [PATCH] Added input stream property checks. --- src/AssetProcess.cpp | 4 ++++ src/CnmtProcess.cpp | 4 ++++ src/EsTikProcess.cpp | 4 ++++ src/NacpProcess.cpp | 14 +++++++++----- src/PfsProcess.cpp | 4 ++++ src/RomfsProcess.cpp | 4 ++++ 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/AssetProcess.cpp b/src/AssetProcess.cpp index 7c933db..ef6ea40 100644 --- a/src/AssetProcess.cpp +++ b/src/AssetProcess.cpp @@ -60,6 +60,10 @@ void nstool::AssetProcess::importHeader() { throw tc::Exception(mModuleName, "No file reader set."); } + if (mFile->canRead() == false || mFile->canSeek() == false) + { + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); + } if (mFile->length() < tc::io::IOUtil::castSizeToInt64(sizeof(nn::hac::sAssetHeader))) { diff --git a/src/CnmtProcess.cpp b/src/CnmtProcess.cpp index 0703e1d..c8c6039 100644 --- a/src/CnmtProcess.cpp +++ b/src/CnmtProcess.cpp @@ -44,6 +44,10 @@ void nstool::CnmtProcess::importCnmt() { throw tc::Exception(mModuleName, "No file reader set."); } + if (mFile->canRead() == false || mFile->canSeek() == false) + { + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); + } // check if file_size is greater than 20MB, don't import. size_t cnmt_file_size = tc::io::IOUtil::castInt64ToSize(mFile->length()); diff --git a/src/EsTikProcess.cpp b/src/EsTikProcess.cpp index 78ee18a..5a4108e 100644 --- a/src/EsTikProcess.cpp +++ b/src/EsTikProcess.cpp @@ -53,6 +53,10 @@ void nstool::EsTikProcess::importTicket() { throw tc::Exception(mModuleName, "No file reader set."); } + if (mFile->canRead() == false || mFile->canSeek() == false) + { + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); + } // check if file_size is greater than 20MB, don't import. size_t file_size = tc::io::IOUtil::castInt64ToSize(mFile->length()); diff --git a/src/NacpProcess.cpp b/src/NacpProcess.cpp index f2e673c..5aeaadb 100644 --- a/src/NacpProcess.cpp +++ b/src/NacpProcess.cpp @@ -44,12 +44,16 @@ void nstool::NacpProcess::importNacp() { throw tc::Exception(mModuleName, "No file reader set."); } - - // check if file_size is greater than 20MB, don't import. - size_t file_size = tc::io::IOUtil::castInt64ToSize(mFile->length()); - if (file_size > (0x100000 * 20)) + if (mFile->canRead() == false || mFile->canSeek() == false) { - throw tc::Exception(mModuleName, "File too large."); + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); + } + + // check if file_size does matches expected size + size_t file_size = tc::io::IOUtil::castInt64ToSize(mFile->length()); + if (file_size != sizeof(nn::hac::sApplicationControlProperty)) + { + throw tc::Exception(mModuleName, "File was incorrect size."); } // read cnmt diff --git a/src/PfsProcess.cpp b/src/PfsProcess.cpp index 81779a1..4dd59e9 100644 --- a/src/PfsProcess.cpp +++ b/src/PfsProcess.cpp @@ -78,6 +78,10 @@ void nstool::PfsProcess::importHeader() { throw tc::Exception(mModuleName, "No file reader set."); } + if (mFile->canRead() == false || mFile->canSeek() == false) + { + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); + } tc::ByteData scratch; diff --git a/src/RomfsProcess.cpp b/src/RomfsProcess.cpp index 8e61bc5..ca1bf6c 100644 --- a/src/RomfsProcess.cpp +++ b/src/RomfsProcess.cpp @@ -71,6 +71,10 @@ void nstool::RomfsProcess::importHeader() { throw tc::Exception(mModuleName, "No file reader set."); } + if (mFile->canRead() == false || mFile->canSeek() == false) + { + throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions."); + } tc::ByteData scratch;