Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/rpm
diff options
context:
space:
mode:
authorAndrew Ferrazzutti2015-05-15 18:09:04 +0000
committerAlexander Kurtakov2015-05-19 06:33:06 +0000
commit7a5cad5eaebafa9805e246f08a210e475b5e6bf9 (patch)
tree48bc0069766390fe2c5d4d6e4e88c05647ec7edf /rpm
parenta9b3f7dcc33a7977abdff0aa2505af96c53af171 (diff)
downloadorg.eclipse.linuxtools-7a5cad5eaebafa9805e246f08a210e475b5e6bf9.tar.gz
org.eclipse.linuxtools-7a5cad5eaebafa9805e246f08a210e475b5e6bf9.tar.xz
org.eclipse.linuxtools-7a5cad5eaebafa9805e246f08a210e475b5e6bf9.zip
rpm: Resolve spec parser stack overflow.
462439: stack overflow when trying to open spec file Change-Id: I1c7913f10e04de616434d777b9eb310405090c37 Signed-off-by: Andrew Ferrazzutti <aferrazz@redhat.com> Reviewed-on: https://git.eclipse.org/r/47986 Tested-by: Hudson CI Reviewed-by: Alexander Kurtakov <akurtako@redhat.com>
Diffstat (limited to 'rpm')
-rw-r--r--rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/UiUtils.java33
-rw-r--r--rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/actions/SpecfileChangelogFormatter.java3
-rw-r--r--rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/parser/SpecfileTag.java4
-rw-r--r--rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/rpm/ui/editor/parser/SpecfileParser.java27
4 files changed, 36 insertions, 31 deletions
diff --git a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/UiUtils.java b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/UiUtils.java
index 22e8cb9bd8..4ca9842db1 100644
--- a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/UiUtils.java
+++ b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/UiUtils.java
@@ -12,6 +12,8 @@ package org.eclipse.linuxtools.internal.rpm.ui.editor;
import java.io.File;
import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -50,35 +52,34 @@ public class UiUtils {
}
}
-
-
/**
- * Resolve defines for a give string, if a define is not found or if
- * there is some other error, the original string is returned.
+ * Resolve defines for a given string. Defines in the string that are not found
+ * or have some other error will remain unchanged in the returned string.
*
+ * @param specfile The specfile containing the string to resolve.
* @param stringToResolve The string to resolve.
- * @return resolved string
+ * @return The resolved string.
*/
public static String resolveDefines(Specfile specfile, String stringToResolve) {
- String originalString = stringToResolve;
+ String workingString = stringToResolve;
SpecfileDefine define;
try {
Pattern variablePattern = Pattern.compile("%\\{(\\S+?)\\}"); //$NON-NLS-1$
Matcher variableMatcher = variablePattern.matcher(stringToResolve);
+ Set<String> variablesFound = new HashSet<>();
while (variableMatcher.find()) {
- define = specfile.getDefine(variableMatcher.group(1));
- if (define != null) {
- stringToResolve = stringToResolve.replaceAll("\\b"+variableMatcher.group(1)+"\\b", define.getStringValue()); //$NON-NLS-1$ //$NON-NLS-2$
- } else {
- return originalString;
+ String variable = variableMatcher.group(1);
+ if (variablesFound.contains(variable)) {
+ continue;
+ }
+ define = specfile.getDefine(variable);
+ if (define != null && !stringToResolve.equals(define.getUnresolvedStringValue())) {
+ workingString = workingString.replaceAll("\\%\\{"+variable+"\\}", define.getStringValue()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
- if (!stringToResolve.equals(originalString)) {
- stringToResolve = stringToResolve.replaceAll("\\%\\{|\\}", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
- return stringToResolve;
+ return workingString;
} catch (Exception e) {
- return originalString;
+ return stringToResolve;
}
}
diff --git a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/actions/SpecfileChangelogFormatter.java b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/actions/SpecfileChangelogFormatter.java
index 97801efed2..403a5466e6 100644
--- a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/actions/SpecfileChangelogFormatter.java
+++ b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/actions/SpecfileChangelogFormatter.java
@@ -31,7 +31,6 @@ import org.eclipse.linuxtools.internal.rpm.ui.editor.preferences.PreferenceConst
import org.eclipse.linuxtools.internal.rpm.ui.editor.scanners.SpecfilePartitionScanner;
import org.eclipse.linuxtools.rpm.ui.editor.SpecfileEditor;
import org.eclipse.linuxtools.rpm.ui.editor.parser.Specfile;
-import org.eclipse.linuxtools.rpm.ui.editor.parser.SpecfileElement;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
@@ -45,8 +44,6 @@ public class SpecfileChangelogFormatter implements IFormatterChangeLogContrib {
public String formatDateLine(String authorName, String authorEmail) {
String dateLine;
Specfile specfile = getParsedSpecfile();
- SpecfileElement resolveElement = new SpecfileElement();
- resolveElement.setSpecfile(specfile);
String epoch = specfile.getEpoch() == -1 ? EMPTY_STRING : (specfile.getEpoch() + ":"); //$NON-NLS-1$
String version = specfile.getVersion();
String release = specfile.getRelease();
diff --git a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/parser/SpecfileTag.java b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/parser/SpecfileTag.java
index 9fa290df2a..4225a839c9 100644
--- a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/parser/SpecfileTag.java
+++ b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/internal/rpm/ui/editor/parser/SpecfileTag.java
@@ -56,6 +56,10 @@ public class SpecfileTag extends SpecfileElement {
return resolve(stringValue);
}
+ public String getUnresolvedStringValue() {
+ return stringValue;
+ }
+
public void setValue(String value) {
this.tagType = TagType.STRING;
this.stringValue = value;
diff --git a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/rpm/ui/editor/parser/SpecfileParser.java b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/rpm/ui/editor/parser/SpecfileParser.java
index b087198120..8a20c3a32e 100644
--- a/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/rpm/ui/editor/parser/SpecfileParser.java
+++ b/rpm/org.eclipse.linuxtools.rpm.ui.editor/src/org/eclipse/linuxtools/rpm/ui/editor/parser/SpecfileParser.java
@@ -621,18 +621,21 @@ public class SpecfileParser {
toReturn = null;
}
}
- if ((toReturn != null) && (toReturn.getStringValue() != null)) {
- try {
- int intValue = Integer.parseInt(toReturn.getStringValue());
- toReturn.setValue(intValue);
- } catch (NumberFormatException e) {
- if (toReturn.getName().equalsIgnoreCase(RpmTags.EPOCH)) {
- errorHandler
- .handleError(new SpecfileParseException(
- Messages.getString("SpecfileParser.16"), lineNumber, //$NON-NLS-1$
- 0, lineText.length(),
- IMarker.SEVERITY_ERROR));
- toReturn = null;
+ if ((toReturn != null)) {
+ String returnStringValue = toReturn.getStringValue();
+ if (returnStringValue != null) {
+ try {
+ int intValue = Integer.parseInt(returnStringValue);
+ toReturn.setValue(intValue);
+ } catch (NumberFormatException e) {
+ if (toReturn.getName().equalsIgnoreCase(RpmTags.EPOCH)) {
+ errorHandler
+ .handleError(new SpecfileParseException(
+ Messages.getString("SpecfileParser.16"), lineNumber, //$NON-NLS-1$
+ 0, lineText.length(),
+ IMarker.SEVERITY_ERROR));
+ toReturn = null;
+ }
}
}
}

Back to the top