Skip to content

Commit

Permalink
Use name from header not alias when checking entry has expected name
Browse files Browse the repository at this point in the history
Previously, an entry’s potentially aliased name would be used when
checking that it has a particular name. The alias would always be
applied, irrespective of the name in the header. As a result, when
there was a clashing hash and an entry with a particular index did
not have the expected name, this would be concealed by the alias
being applied and the name check being done with the alias.

This commit reworks JarEntry to store the name in its header in
addition to its alias, if any. When checking that the entry has the
expected name, the unaliased name is passed in and the entry compares
it with the name from the header rather than the alias.

Closes spring-projectsgh-15981
  • Loading branch information
wilkinsona committed Feb 18, 2019
1 parent 20c39dc commit 68e3de0
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2018 the original author or authors.
* Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -34,6 +34,8 @@ class JarEntry extends java.util.jar.JarEntry implements FileHeader {

private final AsciiBytes name;

private final AsciiBytes headerName;

private Certificate[] certificates;

private CodeSigner[] codeSigners;
Expand All @@ -45,6 +47,7 @@ class JarEntry extends java.util.jar.JarEntry implements FileHeader {
JarEntry(JarFile jarFile, CentralDirectoryFileHeader header, AsciiBytes nameAlias) {
super((nameAlias != null) ? nameAlias.toString() : header.getName().toString());
this.name = (nameAlias != null) ? nameAlias : header.getName();
this.headerName = header.getName();
this.jarFile = jarFile;
this.localHeaderOffset = header.getLocalHeaderOffset();
setCompressedSize(header.getCompressedSize());
Expand All @@ -62,7 +65,7 @@ AsciiBytes getAsciiBytesName() {

@Override
public boolean hasName(CharSequence name, char suffix) {
return this.name.matches(name, suffix);
return this.headerName.matches(name, suffix);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2018 the original author or authors.
* Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -305,8 +305,7 @@ private <T extends FileHeader> T getEntry(int hashCode, CharSequence name,
int index = getFirstIndex(hashCode);
while (index >= 0 && index < this.size && this.hashCodes[index] == hashCode) {
T entry = getEntry(index, type, cacheEntry, nameAlias);
if (entry.hasName((nameAlias != null) ? nameAlias.toString() : name,
suffix)) {
if (entry.hasName(name, suffix)) {
return entry;
}
index++;
Expand Down

0 comments on commit 68e3de0

Please sign in to comment.