Module: check_mk
Branch: master
Commit: 7eeb2926e602b92f14b6749bc8b7c5ea148912ca
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=7eeb2926e602b9…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Thu Nov 23 16:18:13 2017 +0100
Report invalid table names via response header.
Change-Id: Ib90d1a5e5fbc0ad16cb8b2782c5394125d9896b6
---
livestatus/src/OutputBuffer.cc | 4 ++--
livestatus/src/Query.cc | 14 +++++++++++---
livestatus/src/Query.h | 2 +-
livestatus/src/Store.cc | 12 ++++++------
4 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/livestatus/src/OutputBuffer.cc b/livestatus/src/OutputBuffer.cc
index 9417b46..e746f39 100644
--- a/livestatus/src/OutputBuffer.cc
+++ b/livestatus/src/OutputBuffer.cc
@@ -44,8 +44,8 @@ OutputBuffer::OutputBuffer(int fd, const bool &termination_flag,
Logger *logger)
, _termination_flag(termination_flag)
, _logger(logger)
// TODO(sp) This is really the wrong default because it hides some early
- // errors, e.g. an unknown table name. But we can't change this easily
- // because of legacy reasons... :-/
+ // errors, e.g. an unknown command. But we can't change this easily because
+ // of legacy reasons... :-/
, _response_header(ResponseHeader::off)
, _response_code(ResponseCode::ok) {}
diff --git a/livestatus/src/Query.cc b/livestatus/src/Query.cc
index d2da61c..06eb203 100644
--- a/livestatus/src/Query.cc
+++ b/livestatus/src/Query.cc
@@ -83,7 +83,7 @@ void checkNoArguments(const char *line) {
Query::Query(const std::list<std::string> &lines, Table *table,
Encoding data_encoding, size_t max_response_size,
- OutputBuffer &output)
+ OutputBuffer &output, Logger *logger)
: _data_encoding(data_encoding)
, _max_response_size(max_response_size)
, _output(output)
@@ -101,7 +101,7 @@ Query::Query(const std::list<std::string> &lines, Table
*table,
, _time_limit_timeout(0)
, _current_line(0)
, _timezone_offset(0)
- , _logger(table->logger()) {
+ , _logger(logger) {
FilterStack filters;
FilterStack wait_conditions;
for (auto &line : lines) {
@@ -118,6 +118,11 @@ Query::Query(const std::list<std::string> &lines, Table
*table,
header = stripped_line.substr(0, pos);
rest = mk::lstrip(stripped_line.substr(pos + 1));
}
+ // In case of an invalid table name, we just want to parse enough to
+ // determine the kind of response header.
+ if (table == nullptr && header != "ResponseHeader") {
+ continue;
+ }
std::vector<char> rest_copy(rest.begin(), rest.end());
rest_copy.push_back('\0');
char *arguments = &rest_copy[0];
@@ -185,7 +190,7 @@ Query::Query(const std::list<std::string> &lines, Table
*table,
}
}
- if (_columns.empty() && !doStats()) {
+ if (table != nullptr && _columns.empty() && !doStats()) {
table->any_column([this](std::shared_ptr<Column> c) {
return _columns.push_back(c), _all_columns.insert(c), false;
});
@@ -491,6 +496,9 @@ void Query::parseLocaltimeLine(char *line) {
bool Query::doStats() const { return !_stats_columns.empty(); }
bool Query::process() {
+ if (_table == nullptr) {
+ return false;
+ }
// Precondition: output has been reset
auto start_time = std::chrono::system_clock::now();
auto renderer =
diff --git a/livestatus/src/Query.h b/livestatus/src/Query.h
index c4dae5a..2909311 100644
--- a/livestatus/src/Query.h
+++ b/livestatus/src/Query.h
@@ -53,7 +53,7 @@ class Table;
class Query {
public:
Query(const std::list<std::string> &lines, Table *, Encoding
data_encoding,
- size_t max_response_size, OutputBuffer &output);
+ size_t max_response_size, OutputBuffer &output, Logger *logger);
bool process();
diff --git a/livestatus/src/Store.cc b/livestatus/src/Store.cc
index 2025908..d0ed454 100644
--- a/livestatus/src/Store.cc
+++ b/livestatus/src/Store.cc
@@ -291,22 +291,22 @@ void Store::answerCommandNagios(const ExternalCommand &command)
{
bool Store::answerGetRequest(const std::list<std::string> &lines,
OutputBuffer &output,
const std::string &tablename) {
+ // NOTE: Even with an invalid table name we continue, so we can parse
+ // headers, especially ResponseHeader.
if (tablename.empty()) {
output.setError(OutputBuffer::ResponseCode::invalid_request,
"Invalid GET request, missing tablename");
- return false;
}
Table *table = findTable(tablename);
if (table == nullptr) {
- output.setError(OutputBuffer::ResponseCode::not_found,
- "Invalid GET request, no such table '" +
- std::string(tablename) + "'");
- return false;
+ output.setError(
+ OutputBuffer::ResponseCode::not_found,
+ "Invalid GET request, no such table '" + tablename +
"'");
}
return Query(lines, table, _mc->dataEncoding(), _mc->maxResponseSize(),
- output)
+ output, logger())
.process();
}