< 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 >