7131346: Parsing of boolean arguments to diagnostic commands is broken
authorfparain
Wed, 25 Jan 2012 10:32:29 -0800
changeset 11596 3b9802e6c6a2
parent 11594 9a1958280999
child 11597 6f12dcece594
7131346: Parsing of boolean arguments to diagnostic commands is broken Reviewed-by: dholmes, dcubed
hotspot/src/share/vm/services/diagnosticArgument.cpp
hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp
--- a/hotspot/src/share/vm/services/diagnosticArgument.cpp	Wed Jan 25 01:16:03 2012 -0800
+++ b/hotspot/src/share/vm/services/diagnosticArgument.cpp	Wed Jan 25 10:32:29 2012 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012 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
@@ -59,12 +59,13 @@
 
 template <> void DCmdArgument<bool>::parse_value(const char* str,
                                                  size_t len, TRAPS) {
+  // len is the length of the current token starting at str
   if (len == 0) {
     set_value(true);
   } else {
-    if (strcasecmp(str, "true") == 0) {
+    if (len == strlen("true") && strncasecmp(str, "true", len) == 0) {
        set_value(true);
-    } else if (strcasecmp(str, "false") == 0) {
+    } else if (len == strlen("false") && strncasecmp(str, "false", len) == 0) {
        set_value(false);
     } else {
       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
--- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp	Wed Jan 25 01:16:03 2012 -0800
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp	Wed Jan 25 10:32:29 2012 -0800
@@ -130,6 +130,9 @@
 //----------------------------------------------------------------------------------------------------
 // Non-standard stdlib-like stuff:
 inline int strcasecmp(const char *s1, const char *s2) { return _stricmp(s1,s2); }
+inline int strncasecmp(const char *s1, const char *s2, size_t n) {
+  return _strnicmp(s1,s2,n);
+}
 
 
 //----------------------------------------------------------------------------------------------------