mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 06:02:11 +02:00
Bug 430966 - Prevent StackOverflowError in Makefile editor
Change-Id: I4c9d04290d047f52d56e3f1e5bf874efc55c51cb Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com> Reviewed-on: https://git.eclipse.org/r/25707 Tested-by: Hudson CI Reviewed-by: Andrew Gvozdev <angvoz.dev@gmail.com> Tested-by: Andrew Gvozdev <angvoz.dev@gmail.com>
This commit is contained in:
parent
4e6315d501
commit
18ff3be8fa
1 changed files with 25 additions and 5 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2010 QNX Software Systems and others.
|
* Copyright (c) 2000, 2014 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -7,11 +7,13 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
* Marc-Andre Laperle (Ericsson) - Prevent StackOverflowError (Bug 430966)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.make.internal.core.makefile;
|
package org.eclipse.cdt.make.internal.core.makefile;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.make.core.makefile.IBuiltinFunction;
|
import org.eclipse.cdt.make.core.makefile.IBuiltinFunction;
|
||||||
|
@ -202,6 +204,18 @@ public abstract class AbstractMakefile extends Parent implements IMakefile {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String expandString(String line, boolean recursive) {
|
public String expandString(String line, boolean recursive) {
|
||||||
|
return expandString(line, recursive, new HashSet<String>());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param line
|
||||||
|
* - line to expand
|
||||||
|
* @param expandedMacros
|
||||||
|
* - keep track of expanded macros to prevent infinite recursion.
|
||||||
|
*
|
||||||
|
* @return line after expanding any macros.
|
||||||
|
*/
|
||||||
|
private String expandString(String line, boolean recursive, HashSet<String> expandedMacros) {
|
||||||
int len = line.length();
|
int len = line.length();
|
||||||
boolean foundDollar = false;
|
boolean foundDollar = false;
|
||||||
boolean inMacro = false;
|
boolean inMacro = false;
|
||||||
|
@ -238,8 +252,11 @@ public abstract class AbstractMakefile extends Parent implements IMakefile {
|
||||||
}
|
}
|
||||||
if (defs.length > 0) {
|
if (defs.length > 0) {
|
||||||
String result = defs[0].getValue().toString();
|
String result = defs[0].getValue().toString();
|
||||||
if (result.indexOf('$') != -1 && recursive) {
|
if (result.indexOf('$') != -1 && recursive && !expandedMacros.contains(result)) {
|
||||||
result = expandString(result, recursive);
|
String prevResult = result;
|
||||||
|
expandedMacros.add(prevResult);
|
||||||
|
result = expandString(result, recursive, expandedMacros);
|
||||||
|
expandedMacros.remove(prevResult);
|
||||||
}
|
}
|
||||||
buffer.append(result);
|
buffer.append(result);
|
||||||
} else { // Do not expand
|
} else { // Do not expand
|
||||||
|
@ -263,8 +280,11 @@ public abstract class AbstractMakefile extends Parent implements IMakefile {
|
||||||
}
|
}
|
||||||
if (defs.length > 0) {
|
if (defs.length > 0) {
|
||||||
String result = defs[0].getValue().toString();
|
String result = defs[0].getValue().toString();
|
||||||
if (result.indexOf('$') != -1 && recursive) {
|
if (result.indexOf('$') != -1 && recursive && !expandedMacros.contains(result)) {
|
||||||
result = expandString(result, recursive);
|
String prevResult = result;
|
||||||
|
expandedMacros.add(prevResult);
|
||||||
|
result = expandString(result, recursive, expandedMacros);
|
||||||
|
expandedMacros.remove(prevResult);
|
||||||
}
|
}
|
||||||
buffer.append(result);
|
buffer.append(result);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue