< 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,28 +343,26 @@
      * @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 */
-        for (int i = 0; i < strlen; i++) {
-            c = str.charAt(i);
+        // use charAt instead of copying String to char array
+        int utflen = 0;
+        for (int i = 0; i < strlen && utflen < 65536; i++) {
+            int c = str.charAt(i);
             if ((c >= 0x0001) && (c <= 0x007F)) {
                 utflen++;
             } else if (c > 0x07FF) {
                 utflen += 3;
             } else {
                 utflen += 2;
             }
         }
 
         if (utflen > 65535)
-            throw new UTFDataFormatException(
-                "encoded string too long: " + utflen + " bytes");
+            throw new UTFDataFormatException("encoded string too long");
 
         byte[] bytearr = null;
         if (out instanceof DataOutputStream) {
             DataOutputStream dos = (DataOutputStream)out;
             if(dos.bytearr == null || (dos.bytearr.length < (utflen+2)))

@@ -372,22 +370,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 >