src/share/vm/services/diagnosticFramework.cpp
Print this page
rev 3428 : imported patch dcmd-fixes
*** 73,87 ****
--- 73,89 ----
_value_len = 0;
return false;
}
// extracting first item, argument or option name
_key_addr = &_buffer[_cursor];
+ bool arg_had_quotes = false;
while (_cursor <= _len - 1 && _buffer[_cursor] != '=' && _buffer[_cursor] != _delim) {
// argument can be surrounded by single or double quotes
if (_buffer[_cursor] == '\"' || _buffer[_cursor] == '\'') {
_key_addr++;
char quote = _buffer[_cursor];
+ arg_had_quotes = true;
while (_cursor < _len - 1) {
_cursor++;
if (_buffer[_cursor] == quote && _buffer[_cursor - 1] != '\\') {
break;
}
*** 93,112 ****
--- 95,120 ----
break;
}
_cursor++;
}
_key_len = &_buffer[_cursor] - _key_addr;
+ if (arg_had_quotes) {
+ // if the argument was quoted, we need to step past the last quote here
+ _cursor++;
+ }
// check if the argument has the <key>=<value> format
if (_cursor <= _len -1 && _buffer[_cursor] == '=') {
_cursor++;
_value_addr = &_buffer[_cursor];
+ bool value_had_quotes = false;
// extract the value
while (_cursor <= _len - 1 && _buffer[_cursor] != _delim) {
// value can be surrounded by simple or double quotes
if (_buffer[_cursor] == '\"' || _buffer[_cursor] == '\'') {
_value_addr++;
char quote = _buffer[_cursor];
+ value_had_quotes = true;
while (_cursor < _len - 1) {
_cursor++;
if (_buffer[_cursor] == quote && _buffer[_cursor - 1] != '\\') {
break;
}
*** 118,127 ****
--- 126,139 ----
break;
}
_cursor++;
}
_value_len = &_buffer[_cursor] - _value_addr;
+ if (value_had_quotes) {
+ // if the value was quoted, we need to step past the last quote here
+ _cursor++;
+ }
} else {
_value_addr = NULL;
_value_len = 0;
}
return _key_len != 0;
*** 183,194 ****
if (next_argument != NULL) {
arg = next_argument;
arg->read_value(iter.key_addr(), iter.key_length(), CHECK);
next_argument = next_argument->next();
} else {
! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
! "Unknown argument in diagnostic command");
}
}
cont = iter.next(CHECK);
}
check(CHECK);
--- 195,215 ----
if (next_argument != NULL) {
arg = next_argument;
arg->read_value(iter.key_addr(), iter.key_length(), CHECK);
next_argument = next_argument->next();
} else {
! const size_t buflen = 120;
! const size_t argbuflen = 30;
! char buf[buflen];
! char argbuf[argbuflen];
! size_t len = MIN2<size_t>(iter.key_length(), argbuflen - 1);
!
! strncpy(argbuf, iter.key_addr(), len);
! argbuf[len] = '\0';
! jio_snprintf(buf, buflen - 1, "Unknown argument '%s' in diagnostic command.", argbuf);
!
! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf);
}
}
cont = iter.next(CHECK);
}
check(CHECK);
*** 205,227 ****
}
return NULL;
}
void DCmdParser::check(TRAPS) {
GenDCmdArgument* arg = _arguments_list;
while (arg != NULL) {
if (arg->is_mandatory() && !arg->has_value()) {
! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
! "Missing argument for diagnostic command");
}
arg = arg->next();
}
arg = _options;
while (arg != NULL) {
if (arg->is_mandatory() && !arg->has_value()) {
! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
! "Missing option for diagnostic command");
}
arg = arg->next();
}
}
--- 226,250 ----
}
return NULL;
}
void DCmdParser::check(TRAPS) {
+ const size_t buflen = 256;
+ char buf[buflen];
GenDCmdArgument* arg = _arguments_list;
while (arg != NULL) {
if (arg->is_mandatory() && !arg->has_value()) {
! jio_snprintf(buf, buflen - 1, "The argument '%s' is mandatory.", arg->name());
! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf);
}
arg = arg->next();
}
arg = _options;
while (arg != NULL) {
if (arg->is_mandatory() && !arg->has_value()) {
! jio_snprintf(buf, buflen - 1, "The option '%s' is mandatory.", arg->name());
! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf);
}
arg = arg->next();
}
}