aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <[email protected]>2012-08-10 19:37:06 +0200
committerJoerg Bornemann <[email protected]>2012-08-15 12:11:17 +0200
commitb9829ab0a6aa90c09f85c95dede14df62491d79d (patch)
tree95932208dfa5ce74fba299091e325c61be0d7da4
parenta0c6b3277ba30a4cfa2087b3a284dae22d41306c (diff)
fix leaking of raw data in a bunch of new expand functions
Change-Id: Ifa7e481e7d84c50ca52c780f84156e0a5c8d9e98 Reviewed-by: Joerg Bornemann <[email protected]>
-rw-r--r--src/shared/proparser/qmakebuiltins.cpp46
1 files changed, 28 insertions, 18 deletions
diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp
index 3a6931a1d78..5d9f25606d0 100644
--- a/src/shared/proparser/qmakebuiltins.cpp
+++ b/src/shared/proparser/qmakebuiltins.cpp
@@ -950,38 +950,46 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
evalError(fL1S("shadowed(path) requires one argument."));
} else {
QString val = resolvePath(args.at(0).toQString(m_tmp1));
+ QString rstr;
if (m_option->source_root.isEmpty()) {
- ret += ProString(val);
+ rstr = val;
} else if (val.startsWith(m_option->source_root)
&& (val.length() == m_option->source_root.length()
|| val.at(m_option->source_root.length()) == QLatin1Char('/'))) {
- ret += ProString(m_option->build_root + val.mid(m_option->source_root.length()))
- .setSource(args.at(0));
+ rstr = m_option->build_root + val.mid(m_option->source_root.length());
+ } else {
+ break;
}
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
break;
case E_ABSOLUTE_PATH:
- if (args.count() > 2)
+ if (args.count() > 2) {
evalError(fL1S("absolute_path(path[, base]) requires one or two arguments."));
- else
- ret << ProString(QDir::cleanPath(
+ } else {
+ QString rstr = QDir::cleanPath(
QDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory())
- .absoluteFilePath(args.at(0).toQString(m_tmp1)))).setSource(args.at(0));
+ .absoluteFilePath(args.at(0).toQString(m_tmp1)));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
+ }
break;
case E_RELATIVE_PATH:
if (args.count() > 2) {
evalError(fL1S("relative_path(path[, base]) requires one or two arguments."));
} else {
QDir baseDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory());
- ret << ProString(baseDir.relativeFilePath(baseDir.absoluteFilePath(
- args.at(0).toQString(m_tmp1)))).setSource(args.at(0));
+ QString rstr = baseDir.relativeFilePath(baseDir.absoluteFilePath(
+ args.at(0).toQString(m_tmp1)));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
break;
case E_CLEAN_PATH:
- if (args.count() != 1)
+ if (args.count() != 1) {
evalError(fL1S("clean_path(path) requires one argument."));
- else
- ret << ProString(QDir::cleanPath(args.at(0).toQString(m_tmp1))).setSource(args.at(0));
+ } else {
+ QString rstr = QDir::cleanPath(args.at(0).toQString(m_tmp1));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
+ }
break;
case E_SYSTEM_PATH:
if (args.count() != 1) {
@@ -993,7 +1001,7 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
#else
rstr.replace(QLatin1Char('\\'), QLatin1Char('/'));
#endif
- ret << ProString(rstr).setSource(args.at(0));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
break;
case E_SHELL_PATH:
@@ -1005,14 +1013,16 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
rstr.replace(QLatin1Char('/'), QLatin1Char('\\'));
else
rstr.replace(QLatin1Char('\\'), QLatin1Char('/'));
- ret << ProString(rstr).setSource(args.at(0));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
break;
case E_SYSTEM_QUOTE:
- if (args.count() != 1)
+ if (args.count() != 1) {
evalError(fL1S("system_quote(arg) requires one argument."));
- else
- ret << ProString(IoUtils::shellQuote(args.at(0).toQString(m_tmp1))).setSource(args.at(0));
+ } else {
+ QString rstr = IoUtils::shellQuote(args.at(0).toQString(m_tmp1));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
+ }
break;
case E_SHELL_QUOTE:
if (args.count() != 1) {
@@ -1023,7 +1033,7 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
rstr = IoUtils::shellQuoteWin(rstr);
else
rstr = IoUtils::shellQuoteUnix(rstr);
- ret << ProString(rstr).setSource(args.at(0));
+ ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
break;
case E_INVALID: