Fix a possible bug in path normalization code.
The NormalizePath() function always added a trailing separator when normalizing environment variables. Now it checks an environment variable for a trailing separator and only adds one if it doesn't already exist. May be a partial fix for: Fixes lp:1733217 https://bugs.launchpad.net/kicad/+bug/1733217
This commit is contained in:
parent
527c6f0014
commit
bc0306ba99
|
@ -23,8 +23,8 @@
|
||||||
#include <env_paths.h>
|
#include <env_paths.h>
|
||||||
|
|
||||||
static bool normalizeAbsolutePaths( const wxFileName& aPathA,
|
static bool normalizeAbsolutePaths( const wxFileName& aPathA,
|
||||||
const wxFileName& aPathB,
|
const wxFileName& aPathB,
|
||||||
wxString* aResultPath )
|
wxString* aResultPath )
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( aPathA.IsAbsolute(), false, aPathA.GetPath() + " is not an absolute path." );
|
wxCHECK_MSG( aPathA.IsAbsolute(), false, aPathA.GetPath() + " is not an absolute path." );
|
||||||
wxCHECK_MSG( aPathB.IsAbsolute(), false, aPathB.GetPath() + " is not an absolute path." );
|
wxCHECK_MSG( aPathB.IsAbsolute(), false, aPathB.GetPath() + " is not an absolute path." );
|
||||||
|
@ -56,7 +56,7 @@ static bool normalizeAbsolutePaths( const wxFileName& aPathA,
|
||||||
{
|
{
|
||||||
while( i < bDirs.GetCount() )
|
while( i < bDirs.GetCount() )
|
||||||
{
|
{
|
||||||
*aResultPath += bDirs[i] + wxT( "/" );
|
*aResultPath += bDirs[i] + "/";
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars
|
||||||
{
|
{
|
||||||
wxFileName envPath;
|
wxFileName envPath;
|
||||||
wxString tmp, varName, normalizedFullPath;
|
wxString tmp, varName, normalizedFullPath;
|
||||||
|
bool hasTrailingSeparator = false;
|
||||||
|
|
||||||
if( aEnvVars )
|
if( aEnvVars )
|
||||||
{
|
{
|
||||||
|
@ -80,6 +81,12 @@ wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars
|
||||||
|| !wxFileName::IsDirReadable( entry.second.GetValue() ) )
|
|| !wxFileName::IsDirReadable( entry.second.GetValue() ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// Do not add separator to the end of environment variable if it already has one.
|
||||||
|
wxUniChar separator = entry.second.GetValue().Last();
|
||||||
|
|
||||||
|
if( separator == '\\' || separator == '/' )
|
||||||
|
hasTrailingSeparator = true;
|
||||||
|
|
||||||
envPath.SetPath( entry.second.GetValue() );
|
envPath.SetPath( entry.second.GetValue() );
|
||||||
|
|
||||||
if( normalizeAbsolutePaths( envPath, aFilePath, &tmp ) )
|
if( normalizeAbsolutePaths( envPath, aFilePath, &tmp ) )
|
||||||
|
@ -100,7 +107,10 @@ wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars
|
||||||
|
|
||||||
if( !varName.IsEmpty() )
|
if( !varName.IsEmpty() )
|
||||||
{
|
{
|
||||||
normalizedFullPath = wxString::Format( "${%s}/", varName );
|
normalizedFullPath = wxString::Format( "${%s}", varName );
|
||||||
|
|
||||||
|
if( !hasTrailingSeparator )
|
||||||
|
normalizedFullPath += "/";
|
||||||
|
|
||||||
if( !tmp.IsEmpty() )
|
if( !tmp.IsEmpty() )
|
||||||
normalizedFullPath += tmp;
|
normalizedFullPath += tmp;
|
||||||
|
|
|
@ -28,10 +28,10 @@
|
||||||
#include <pgm_base.h>
|
#include <pgm_base.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normalizes a file path to an environmental variable, if possible.
|
* Normalize a file path to an environmental variable, if possible.
|
||||||
*
|
*
|
||||||
* @param aFilePath is the full file path (path and file name) to be normalized.
|
* @param aFilePath is the full file path (path and file name) to be normalized.
|
||||||
* @param aEnvVars is an optional map of environmental variables to try substition with.
|
* @param aEnvVars is an optional map of environmental variables to try substitution with.
|
||||||
* @param aProject is an optional project, to normalize the file path to the project path.
|
* @param aProject is an optional project, to normalize the file path to the project path.
|
||||||
* @return Normalized full file path (path and file name) if succeeded or empty string if the
|
* @return Normalized full file path (path and file name) if succeeded or empty string if the
|
||||||
* path could not be normalized.
|
* path could not be normalized.
|
||||||
|
@ -40,13 +40,13 @@ wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars
|
||||||
const PROJECT* aProject );
|
const PROJECT* aProject );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches the default paths trying to find one with the requested file.
|
* Search the default paths trying to find one with the requested file.
|
||||||
*
|
*
|
||||||
* @param aFileName is the name of the searched file. It might be a relative path.
|
* @param aFileName is the name of the searched file. It might be a relative path.
|
||||||
* @param aEnvVars is an optional map of environmental variables that can contain paths.
|
* @param aEnvVars is an optional map of environmental variables that can contain paths.
|
||||||
* @param aProject is an optional project, to check the project path.
|
* @param aProject is an optional project, to check the project path.
|
||||||
* @return Full path (apth and file name) if the file was found in one of the paths, otherwise
|
* @return Full path (path and file name) if the file was found in one of the paths, otherwise
|
||||||
* an empty string.
|
* an empty string.
|
||||||
*/
|
*/
|
||||||
wxString ResolveFile( const wxString& aFileName, const ENV_VAR_MAP* aEnvVars,
|
wxString ResolveFile( const wxString& aFileName, const ENV_VAR_MAP* aEnvVars,
|
||||||
const PROJECT* aProject );
|
const PROJECT* aProject );
|
||||||
|
|
Loading…
Reference in New Issue