diff options
author | Andrew Ferrazzutti | 2015-05-15 18:09:04 +0000 |
---|---|---|
committer | Alexander Kurtakov | 2015-05-19 06:33:06 +0000 |
commit | 7a5cad5eaebafa9805e246f08a210e475b5e6bf9 (patch) | |
tree | 48bc0069766390fe2c5d4d6e4e88c05647ec7edf /rpm | |
parent | a9b3f7dcc33a7977abdff0aa2505af96c53af171 (diff) | |
download | org.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')
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; + } } } } |