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:
Wayne Stambaugh 2017-11-21 19:04:51 -05:00
parent 527c6f0014
commit bc0306ba99
2 changed files with 19 additions and 9 deletions

View File

@ -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;

View File

@ -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 );