I’m afraid you are right! Doh. Need to add more testing... How about this change:
--- a/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java +++ b/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java @@ -267,9 +267,11 @@ String getErrorMessage(InputStream sis, int maxlen) throws IOException { byte b[] = new byte[maxlen]; int n, off = 0, len = maxlen; + boolean complete = false; do { n = sis.read(b, off, len); if (n == -1) { + complete = true; break; } off += n; @@ -280,7 +282,7 @@ if (off > 0) { message = new String(b, 0, off, "UTF-8"); } - if (off > b.length && message != null) { + if (!complete && message != null) { message += " ..."; } return message; On 4 apr 2014, at 13:55, Ivan Gerasimov <ivan.gerasi...@oracle.com> wrote: > Thank you Staffan for fixing them! > > But I'm afraid that now the function will never add ellipsis to the message, > even if it gets truncated. > > Sincerely yours, > Ivan > > On 04.04.2014 15:47, Staffan Larsen wrote: >> Thanks for finding these bugs, Ivan! >> >> I have updated the webrev at: >> http://cr.openjdk.java.net/~sla/8039173/webrev.01/, and I have also included >> the diff below. >> >> The updated webrev also has some changes in the javadoc for VirtualMachine >> to clarify that some methods can now throw AttachOperationFailedException. >> >> Thanks, >> /Staffan >> >> >> diff --git a/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java >> b/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java >> --- a/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java >> +++ b/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java >> @@ -266,18 +266,21 @@ >> */ >> String getErrorMessage(InputStream sis, int maxlen) throws IOException { >> byte b[] = new byte[maxlen]; >> - int n, off = 0, len = b.length; >> + int n, off = 0, len = maxlen; >> do { >> n = sis.read(b, off, len); >> + if (n == -1) { >> + break; >> + } >> off += n; >> len -= n; >> - } while (n >= 0 && off < b.length); >> + } while (off < maxlen); >> >> String message = null; >> if (off > 0) { >> message = new String(b, 0, off, "UTF-8"); >> } >> - if (off == b.length && message != null) { >> + if (off > b.length && message != null) { >> message += " ..."; >> } >> return message; >> >> >> On 4 apr 2014, at 11:18, Ivan Gerasimov <ivan.gerasi...@oracle.com> wrote: >> >>> Hi Staffan! >>> >>> I think there is a couple of minor bugs in getErrorMessage(InputStream sis, >>> int maxlen). >>> >>> 1) If maxlen is exactly the size of the message to read, the function will >>> add an ellipsis, even though the message isn't truncated, >>> 2) If maxlen is greater than needed, then sis.read(b, off, len) at the line >>> #271 will eventually return -1, and it will cause the message to lose its >>> last character. >>> >>> Sincerely yours, >>> Ivan >>> >> >> >