# HG changeset patch # User igerasim # Date 1547066456 28800 # Wed Jan 09 12:40:56 2019 -0800 # Node ID 4c085d0fd6acc9a7581ad6d9c3fb74ebf8545dc0 # Parent bccff579c2ff05a1e1035028f880df6c4c6fad5e imported patch 8216407-java-util-UUID-fromString-accepts-input-that-does-not-match-expected-format diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java --- a/src/java.base/share/classes/java/util/UUID.java +++ b/src/java.base/share/classes/java/util/UUID.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, 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 @@ -194,11 +194,6 @@ * */ public static UUID fromString(String name) { - int len = name.length(); - if (len > 36) { - throw new IllegalArgumentException("UUID string too large"); - } - int dash1 = name.indexOf('-', 0); int dash2 = name.indexOf('-', dash1 + 1); int dash3 = name.indexOf('-', dash2 + 1); @@ -211,20 +206,19 @@ // - if dash1 is positive but dash2 is -1, dash4 will be -1 // - if dash1 and dash2 is positive, dash3 will be -1, dash4 will be // positive, but so will dash5 - if (dash4 < 0 || dash5 >= 0) { - throw new IllegalArgumentException("Invalid UUID string: " + name); + + if (dash4 > 0 && dash5 < 0) { + long x1 = Long.parseLong(name, 0, dash1, 16); + long x2 = Long.parseLong(name, dash1 + 1, dash2, 16); + long x3 = Long.parseLong(name, dash2 + 1, dash3, 16); + long x4 = Long.parseLong(name, dash3 + 1, dash4, 16); + long x5 = Long.parseLong(name, dash4 + 1, name.length(), 16); + + if (((x1 >> 32) | ((x2 | x3 | x4) >> 16) | (x5 >> 48)) == 0L) { + return new UUID((x1 << 32) | (x2 << 16) | x3, (x4 << 48) | x5); + } } - - long mostSigBits = Long.parseLong(name, 0, dash1, 16) & 0xffffffffL; - mostSigBits <<= 16; - mostSigBits |= Long.parseLong(name, dash1 + 1, dash2, 16) & 0xffffL; - mostSigBits <<= 16; - mostSigBits |= Long.parseLong(name, dash2 + 1, dash3, 16) & 0xffffL; - long leastSigBits = Long.parseLong(name, dash3 + 1, dash4, 16) & 0xffffL; - leastSigBits <<= 48; - leastSigBits |= Long.parseLong(name, dash4 + 1, len, 16) & 0xffffffffffffL; - - return new UUID(mostSigBits, leastSigBits); + throw new IllegalArgumentException("Invalid UUID string: " + name); } // Field Accessor Methods diff --git a/test/jdk/java/util/UUID/UUIDTest.java b/test/jdk/java/util/UUID/UUIDTest.java --- a/test/jdk/java/util/UUID/UUIDTest.java +++ b/test/jdk/java/util/UUID/UUIDTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, 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 @@ -22,7 +22,7 @@ */ /* @test - * @bug 4173528 5068772 8148936 + * @bug 4173528 5068772 8148936 8216407 * @summary Unit tests for java.util.UUID * @key randomness * @run main/othervm -XX:+CompactStrings UUIDTest @@ -107,6 +107,11 @@ testFromStringError("0-0-0-0-"); testFromStringError("0-0-0-0-0-"); testFromStringError("0-0-0-0-x"); + testFromStringError("123456789-0-0-0-0"); + testFromStringError("0-1abcd-0-0-0"); + testFromStringError("0-0-1ef01-0-0"); + testFromStringError("0-0-0-12345-0"); + testFromStringError("0-0-0-0-f1234567890ab"); } private static void testFromStringError(String str) {