Merge "trace_processor: prevent window table from allowing zero duration tables"
diff --git a/src/trace_processor/table.h b/src/trace_processor/table.h
index d8cd20d..bccf710 100644
--- a/src/trace_processor/table.h
+++ b/src/trace_processor/table.h
@@ -159,6 +159,11 @@
// At registration time, the function should also pass true for |read_write|.
virtual int Update(int, sqlite3_value**, sqlite3_int64*);
+ void SetErrorMessage(char* error) {
+ sqlite3_free(zErrMsg);
+ zErrMsg = error;
+ }
+
const Schema& schema() { return schema_; }
private:
diff --git a/src/trace_processor/window_operator_table.cc b/src/trace_processor/window_operator_table.cc
index 396e18b..6e48e1f 100644
--- a/src/trace_processor/window_operator_table.cc
+++ b/src/trace_processor/window_operator_table.cc
@@ -81,9 +81,18 @@
if (argc < 2 || sqlite3_value_type(argv[0]) == SQLITE_NULL)
return SQLITE_READONLY;
- quantum_ = static_cast<uint64_t>(sqlite3_value_int64(argv[3]));
- window_start_ = static_cast<uint64_t>(sqlite3_value_int64(argv[4]));
- window_dur_ = static_cast<uint64_t>(sqlite3_value_int64(argv[5]));
+ uint64_t new_quantum = static_cast<uint64_t>(sqlite3_value_int64(argv[3]));
+ uint64_t new_start = static_cast<uint64_t>(sqlite3_value_int64(argv[4]));
+ uint64_t new_dur = static_cast<uint64_t>(sqlite3_value_int64(argv[5]));
+ if (new_dur == 0) {
+ auto* err = sqlite3_mprintf("Cannot set duration of window table to zero.");
+ SetErrorMessage(err);
+ return SQLITE_ERROR;
+ }
+
+ quantum_ = new_quantum;
+ window_start_ = new_start;
+ window_dur_ = new_dur;
return SQLITE_OK;
}