Don't allow !addincludedir with trailing path separator to propagate to !include
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6526 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
d66c9a492f
commit
ad03365921
3 changed files with 30 additions and 17 deletions
|
@ -1366,14 +1366,9 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
|
|
||||||
SCRIPT_MSG(_T("!delfile: \"%") NPRIs _T("\"\n"), line.gettoken_str(a));
|
SCRIPT_MSG(_T("!delfile: \"%") NPRIs _T("\"\n"), line.gettoken_str(a));
|
||||||
|
|
||||||
tstring dir = get_dir_name(fc);
|
tstring dir = get_dir_name(fc), spec = get_file_name(fc);
|
||||||
tstring spec = get_file_name(fc);
|
|
||||||
tstring basedir = dir + PLATFORM_PATH_SEPARATOR_STR;
|
tstring basedir = dir + PLATFORM_PATH_SEPARATOR_STR;
|
||||||
if (dir == spec) {
|
if (dir == spec) dir = _T("."), basedir = _T(""); // no path, just file name
|
||||||
// no path, just file name
|
|
||||||
dir = _T(".");
|
|
||||||
basedir = _T("");
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::scoped_ptr<dir_reader> dr( new_dir_reader() );
|
boost::scoped_ptr<dir_reader> dr( new_dir_reader() );
|
||||||
dr->read(dir); // BUGBUG: PATH_CONVERT?
|
dr->read(dir); // BUGBUG: PATH_CONVERT?
|
||||||
|
@ -3200,12 +3195,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
{
|
{
|
||||||
f = line.gettoken_str(++tok);
|
f = line.gettoken_str(++tok);
|
||||||
if (tok >= toks) break;
|
if (tok >= toks) break;
|
||||||
if(!_tcsicmp(f,_T("/nonfatal"))) {
|
if (!_tcsicmp(f,_T("/nonfatal"))) required = false;
|
||||||
required = false;
|
|
||||||
}
|
|
||||||
TCHAR buf[9+1];
|
TCHAR buf[9+1];
|
||||||
my_strncpy(buf,f,COUNTOF(buf));
|
my_strncpy(buf,f,COUNTOF(buf));
|
||||||
if(!_tcsicmp(buf,_T("/charset="))) {
|
if (!_tcsicmp(buf,_T("/charset="))) {
|
||||||
WORD cp = GetEncodingFromString(f+9);
|
WORD cp = GetEncodingFromString(f+9);
|
||||||
if (NStreamEncoding::UNKNOWN == cp) toks = 0;
|
if (NStreamEncoding::UNKNOWN == cp) toks = 0;
|
||||||
enc.SafeSetCodepage(cp);
|
enc.SafeSetCodepage(cp);
|
||||||
|
@ -3214,9 +3207,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
if (!toks || !*f) PRINTHELP();
|
if (!toks || !*f) PRINTHELP();
|
||||||
|
|
||||||
TCHAR *fc = my_convert(f);
|
TCHAR *fc = my_convert(f);
|
||||||
tstring dir = get_dir_name(fc);
|
tstring dir = get_dir_name(fc), spec = get_file_name(fc), basedir = dir;
|
||||||
tstring spec = get_file_name(fc);
|
path_append_separator(basedir);
|
||||||
tstring basedir = dir + PLATFORM_PATH_SEPARATOR_STR;
|
|
||||||
if (dir == spec) basedir = _T(""), dir = _T("."); // no path, just file name
|
if (dir == spec) basedir = _T(""), dir = _T("."); // no path, just file name
|
||||||
my_convert_free(fc);
|
my_convert_free(fc);
|
||||||
|
|
||||||
|
@ -3228,7 +3220,6 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
files_itr++)
|
files_itr++)
|
||||||
{
|
{
|
||||||
if (!dir_reader::matches(*files_itr, spec)) continue;
|
if (!dir_reader::matches(*files_itr, spec)) continue;
|
||||||
|
|
||||||
tstring incfile = basedir + *files_itr;
|
tstring incfile = basedir + *files_itr;
|
||||||
if (includeScript(incfile.c_str(), enc) != PS_OK)
|
if (includeScript(incfile.c_str(), enc) != PS_OK)
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
|
@ -3241,7 +3232,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
TCHAR *incdir = include_dirs.get();
|
TCHAR *incdir = include_dirs.get();
|
||||||
int incdirs = include_dirs.getnum();
|
int incdirs = include_dirs.getnum();
|
||||||
for (int i = 0; i < incdirs; i++, incdir += _tcslen(incdir) + 1) {
|
for (int i = 0; i < incdirs; i++, incdir += _tcslen(incdir) + 1) {
|
||||||
tstring curincdir = tstring(incdir) + PLATFORM_PATH_SEPARATOR_STR + dir;
|
tstring curincdir = path_append(tstring(incdir), dir);
|
||||||
|
|
||||||
boost::scoped_ptr<dir_reader> dr( new_dir_reader() );
|
boost::scoped_ptr<dir_reader> dr( new_dir_reader() );
|
||||||
dr->read(curincdir);
|
dr->read(curincdir);
|
||||||
|
@ -3251,7 +3242,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
||||||
{
|
{
|
||||||
if (!dir_reader::matches(*incdir_itr, spec)) continue;
|
if (!dir_reader::matches(*incdir_itr, spec)) continue;
|
||||||
|
|
||||||
tstring incfile = tstring(incdir) + PLATFORM_PATH_SEPARATOR_STR + basedir + *incdir_itr;
|
tstring incfile = path_append(tstring(incdir), basedir) + *incdir_itr;
|
||||||
if (includeScript(incfile.c_str(), enc) != PS_OK)
|
if (includeScript(incfile.c_str(), enc) != PS_OK)
|
||||||
return PS_ERROR;
|
return PS_ERROR;
|
||||||
else
|
else
|
||||||
|
|
|
@ -718,6 +718,20 @@ tstring remove_file_extension(const tstring& path) {
|
||||||
return get_string_prefix(path, _T("."));
|
return get_string_prefix(path, _T("."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tstring& path_append_separator(tstring& path)
|
||||||
|
{
|
||||||
|
tstring::iterator ib = path.begin(), ie = path.end();
|
||||||
|
if (ib != ie && !IsPathSeparator(*--ie))
|
||||||
|
path.push_back(PLATFORM_PATH_SEPARATOR_C);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
tstring& path_append(tstring& base, const TCHAR* more)
|
||||||
|
{
|
||||||
|
if (IsPathSeparator(*more)) ++more;
|
||||||
|
return path_append_separator(base) += more;
|
||||||
|
}
|
||||||
|
|
||||||
static int PathGetDosDriveNumber(const TCHAR *p)
|
static int PathGetDosDriveNumber(const TCHAR *p)
|
||||||
{
|
{
|
||||||
// Note: Unlike PathGetDriveNumber(), we require a path separator after the colon.
|
// Note: Unlike PathGetDriveNumber(), we require a path separator after the colon.
|
||||||
|
|
|
@ -48,6 +48,14 @@ tstring get_file_name(const tstring& path);
|
||||||
tstring get_executable_path(const TCHAR* argv0);
|
tstring get_executable_path(const TCHAR* argv0);
|
||||||
tstring get_executable_dir(const TCHAR *argv0);
|
tstring get_executable_dir(const TCHAR *argv0);
|
||||||
tstring remove_file_extension(const tstring& path);
|
tstring remove_file_extension(const tstring& path);
|
||||||
|
tstring& path_append_separator(tstring& path);
|
||||||
|
tstring& path_append(tstring& base, const TCHAR* more);
|
||||||
|
inline tstring& path_append(tstring& base, const tstring& more) { return path_append(base, more.c_str()); }
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define IsPathSeparator IsAgnosticPathSeparator
|
||||||
|
#else
|
||||||
|
#define IsPathSeparator(c) ( PLATFORM_PATH_SEPARATOR_C == (c) )
|
||||||
|
#endif
|
||||||
inline bool IsAgnosticPathSeparator(const TCHAR c) { return _T('\\') == c || _T('/') == c; }
|
inline bool IsAgnosticPathSeparator(const TCHAR c) { return _T('\\') == c || _T('/') == c; }
|
||||||
bool IsWindowsPathRelative(const TCHAR *p);
|
bool IsWindowsPathRelative(const TCHAR *p);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue