Use name from header not alias when checking entry has expected name

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 gh-15981
This commit is contained in:
Andy Wilkinson 2019-02-18 17:12:50 +00:00
parent 20c39dc554
commit 68e3de0357
2 changed files with 7 additions and 5 deletions

View File

@ -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.
@ -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;
@ -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());
@ -62,7 +65,7 @@ class JarEntry extends java.util.jar.JarEntry implements FileHeader {
@Override
public boolean hasName(CharSequence name, char suffix) {
return this.name.matches(name, suffix);
return this.headerName.matches(name, suffix);
}
/**

View File

@ -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.
@ -305,8 +305,7 @@ class JarFileEntries implements CentralDirectoryVisitor, Iterable<JarEntry> {
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++;