mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-02 22:48:35 +00:00
8200530: '\r' is not supported as "newline" in java.util.jar.Manifest
Reviewed-by: jlaskey
This commit is contained in:
parent
8b4b130011
commit
fcfd1c85dd
@ -377,7 +377,8 @@ public class Attributes implements Map<Object,Object>, Cloneable {
|
||||
int len;
|
||||
while ((len = is.readLine(lbuf)) != -1) {
|
||||
boolean lineContinued = false;
|
||||
if (lbuf[--len] != '\n') {
|
||||
byte c = lbuf[--len];
|
||||
if (c != '\n' && c != '\r') {
|
||||
throw new IOException("line too long");
|
||||
}
|
||||
if (len > 0 && lbuf[len-1] == '\r') {
|
||||
|
||||
@ -205,7 +205,8 @@ public class Manifest implements Cloneable {
|
||||
byte[] lastline = null;
|
||||
|
||||
while ((len = fis.readLine(lbuf)) != -1) {
|
||||
if (lbuf[--len] != '\n') {
|
||||
byte c = lbuf[--len];
|
||||
if (c != '\n' && c != '\r') {
|
||||
throw new IOException("manifest line too long");
|
||||
}
|
||||
if (len > 0 && lbuf[len-1] == '\r') {
|
||||
@ -381,13 +382,18 @@ public class Manifest implements Cloneable {
|
||||
}
|
||||
int tpos = pos;
|
||||
int maxpos = tpos + n;
|
||||
while (tpos < maxpos && tbuf[tpos++] != '\n') ;
|
||||
byte c = 0;
|
||||
// jar.spec.newline: CRLF | LF | CR (not followed by LF)
|
||||
while (tpos < maxpos && (c = tbuf[tpos++]) != '\n' && c != '\r');
|
||||
if (c == '\r' && tpos < maxpos && tbuf[tpos] == '\n') {
|
||||
tpos++;
|
||||
}
|
||||
n = tpos - pos;
|
||||
System.arraycopy(tbuf, pos, b, off, n);
|
||||
off += n;
|
||||
total += n;
|
||||
pos = tpos;
|
||||
if (tbuf[tpos-1] == '\n') {
|
||||
if (c == '\n' || c == '\r') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
123
test/jdk/java/util/jar/Attributes/TestAttrsNL.java
Normal file
123
test/jdk/java/util/jar/Attributes/TestAttrsNL.java
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 8200530
|
||||
* @summary Test Attributes newline
|
||||
*/
|
||||
|
||||
import java.util.jar.Manifest;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.Attributes.Name;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.util.Map;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
public class TestAttrsNL {
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
|
||||
String manifestStr =
|
||||
"Manifest-Version: 1.0\r\n" +
|
||||
"Created-By: 11 (Oracle Corporation)\r\n" +
|
||||
"key1: value1\r\n" +
|
||||
"key2: value2\r\n END\r\n" +
|
||||
"key3: value3\r\n \r\n" +
|
||||
"key4: value4\r\n" +
|
||||
"\r\n\r\n" +
|
||||
"Name: Hello\r\n" +
|
||||
"key11: value11\r\n" +
|
||||
"key22: value22\r\n END\r\n" +
|
||||
"key33: value33\r\n \r\n" +
|
||||
"key44: value44\r\n";
|
||||
|
||||
Map<Name, String> mainAttrsExped = Map.of(
|
||||
new Name("Manifest-Version"), "1.0",
|
||||
new Name("Created-By"), "11 (Oracle Corporation)",
|
||||
new Name("key1"), "value1",
|
||||
new Name("key2"), "value2END",
|
||||
new Name("key3"), "value3",
|
||||
new Name("key4"), "value4"
|
||||
);
|
||||
|
||||
Map<Name, String> attrsExped = Map.of(
|
||||
new Name("key11"), "value11",
|
||||
new Name("key22"), "value22END",
|
||||
new Name("key33"), "value33",
|
||||
new Name("key44"), "value44"
|
||||
);
|
||||
|
||||
test(new Manifest(new ByteArrayInputStream(manifestStr.getBytes(UTF_8))),
|
||||
mainAttrsExped, attrsExped);
|
||||
|
||||
test(new Manifest(new ByteArrayInputStream(
|
||||
manifestStr.replaceAll("\r\n", "\r").getBytes(UTF_8))),
|
||||
mainAttrsExped, attrsExped);
|
||||
|
||||
test(new Manifest(new ByteArrayInputStream(
|
||||
manifestStr.replaceAll("\r\n", "\n").getBytes(UTF_8))),
|
||||
mainAttrsExped, attrsExped);
|
||||
|
||||
// mixed
|
||||
manifestStr =
|
||||
"Manifest-Version: 1.0\r\n" +
|
||||
"Created-By: 11 (Oracle Corporation)\n" +
|
||||
"key1: value1\r" +
|
||||
"key2: value2\r\n END\r" +
|
||||
"key3: value3\n \r\n" +
|
||||
"key4: value4\r" +
|
||||
"\r\n\n" +
|
||||
"Name: Hello\r\n" +
|
||||
"key11: value11\r" +
|
||||
"key22: value22\n END\r\n" +
|
||||
"key33: value33\r \n" +
|
||||
"key44: value44\n";
|
||||
test(new Manifest(new ByteArrayInputStream(manifestStr.getBytes(UTF_8))),
|
||||
mainAttrsExped, attrsExped);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static void test(Manifest m,
|
||||
Map<Name, String> mainAttrsExped,
|
||||
Map<Name, String> attrsExped) {
|
||||
Attributes mainAttrs = m.getMainAttributes();
|
||||
mainAttrsExped.forEach( (k, v) -> {
|
||||
if (!mainAttrs.containsKey(k) || !mainAttrs.get(k).equals(v)) {
|
||||
System.out.printf(" containsKey(%s) : %b%n", k, mainAttrs.containsKey(k));
|
||||
System.out.printf(" get(%s) : %s%n", k, mainAttrs.get(k));
|
||||
throw new RuntimeException("expected attr: k=<" + k + ">, v=<" + v + ">");
|
||||
}
|
||||
});
|
||||
|
||||
Attributes attrs = m.getAttributes("Hello");
|
||||
attrs.forEach( (k, v) -> {
|
||||
if (!attrs.containsKey(k) || !attrs.get(k).equals(v)) {
|
||||
System.out.printf(" containsKey(%s) : %b%n", k, attrs.containsKey(k));
|
||||
System.out.printf(" get(%s) : %s%n", k, attrs.get(k));
|
||||
throw new RuntimeException("expected attr: k=<" + k + ">, v=<" + v + ">");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user