< prev index next >
src/java.base/share/classes/java/io/DataOutputStream.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -343,16 +343,20 @@
* @return The number of bytes written out.
* @exception IOException if an I/O error occurs.
*/
static int writeUTF(String str, DataOutput out) throws IOException {
int strlen = str.length();
- int utflen = 0;
- int c, count = 0;
- /* use charAt instead of copying String to char array */
+ // UTF length >= strlen so fail-fast if strlen is too long
+ if (strlen > 65535)
+ throw new UTFDataFormatException(
+ "encoded string would be too long: > 65535 bytes");
+
+ // use charAt instead of copying String to char array
+ int utflen = 0;
for (int i = 0; i < strlen; i++) {
- c = str.charAt(i);
+ int c = str.charAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
utflen++;
} else if (c > 0x07FF) {
utflen += 3;
} else {
@@ -372,22 +376,23 @@
bytearr = dos.bytearr;
} else {
bytearr = new byte[utflen+2];
}
+ int count = 0;
bytearr[count++] = (byte) ((utflen >>> 8) & 0xFF);
bytearr[count++] = (byte) ((utflen >>> 0) & 0xFF);
int i=0;
for (i=0; i<strlen; i++) {
- c = str.charAt(i);
+ int c = str.charAt(i);
if (!((c >= 0x0001) && (c <= 0x007F))) break;
bytearr[count++] = (byte) c;
}
for (;i < strlen; i++){
- c = str.charAt(i);
+ int c = str.charAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
bytearr[count++] = (byte) c;
} else if (c > 0x07FF) {
bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
< prev index next >