aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/PropSet.cxx
diff options
context:
space:
mode:
authornyamatongwe <unknown>2003-04-30 10:48:46 +0000
committernyamatongwe <unknown>2003-04-30 10:48:46 +0000
commit9fbb2672d2753efdb8fc6149c6e257e8c568558e (patch)
tree43ed22b834fcf13be815bb6daf9e823c335a93f4 /src/PropSet.cxx
parentdc9a5dcabf55728bb9f2488501a2a78f74b1edac (diff)
downloadscintilla-mirror-9fbb2672d2753efdb8fc6149c6e257e8c568558e.tar.gz
More protection against recursive property settings.
Diffstat (limited to 'src/PropSet.cxx')
-rw-r--r--src/PropSet.cxx32
1 files changed, 16 insertions, 16 deletions
diff --git a/src/PropSet.cxx b/src/PropSet.cxx
index 18544aef2..8455d854d 100644
--- a/src/PropSet.cxx
+++ b/src/PropSet.cxx
@@ -9,7 +9,6 @@
#include <stdlib.h>
#include <string.h>
-//#include <ctype.h>
#include <stdio.h>
#include "Platform.h"
@@ -182,25 +181,26 @@ SString PropSet::GetExpanded(const char *key) {
return Expand(val.c_str());
}
-SString PropSet::Expand(const char *withVars) {
+SString PropSet::Expand(const char *withVars, int maxExpands) {
char *base = StringDup(withVars);
char *cpvar = strstr(base, "$(");
- int maxExpands = 1000; // Avoid infinite expansion of recursive definitions
while (cpvar && (maxExpands > 0)) {
char *cpendvar = strchr(cpvar, ')');
- if (cpendvar) {
- int lenvar = cpendvar - cpvar - 2; // Subtract the $()
- char *var = StringDup(cpvar + 2, lenvar);
- SString val = GetExpanded(var);
- size_t newlenbase = strlen(base) + val.length() - lenvar;
- char *newbase = new char[newlenbase];
- strncpy(newbase, base, cpvar - base);
- strcpy(newbase + (cpvar - base), val.c_str());
- strcpy(newbase + (cpvar - base) + val.length(), cpendvar + 1);
- delete []var;
- delete []base;
- base = newbase;
- }
+ if (!cpendvar)
+ break;
+ int lenvar = cpendvar - cpvar - 2; // Subtract the $()
+ char *var = StringDup(cpvar + 2, lenvar);
+ SString val = Get(var);
+ if (IncludesVar(val.c_str(), var))
+ break;
+ size_t newlenbase = strlen(base) + val.length() - lenvar;
+ char *newbase = new char[newlenbase];
+ strncpy(newbase, base, cpvar - base);
+ strcpy(newbase + (cpvar - base), val.c_str());
+ strcpy(newbase + (cpvar - base) + val.length(), cpendvar + 1);
+ delete []var;
+ delete []base;
+ base = newbase;
cpvar = strstr(base, "$(");
maxExpands--;
}