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;
 }