summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-08-20 12:37:02 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-08-20 12:37:02 +0200
commitacf06ac2e3a8c30f1efa4e83b2fa9db3ec9b1f70 (patch)
treefee73011c50959321f7679483abd15f0a3b269b9
parent2ca1d1fb9390d8b8f7395f6f4c69d53988d9a4a9 (diff)
downloadkube-acf06ac2e3a8c30f1efa4e83b2fa9db3ec9b1f70.tar.gz
kube-acf06ac2e3a8c30f1efa4e83b2fa9db3ec9b1f70.zip
Fixed out of bounds array access.
Happened with events that are partially within the range.
-rw-r--r--framework/src/domain/perioddayeventmodel.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/framework/src/domain/perioddayeventmodel.cpp b/framework/src/domain/perioddayeventmodel.cpp
index af9ca110..bdbacc2f 100644
--- a/framework/src/domain/perioddayeventmodel.cpp
+++ b/framework/src/domain/perioddayeventmodel.cpp
@@ -85,15 +85,20 @@ void PeriodDayEventModel::partitionData()
85 continue; 85 continue;
86 } 86 }
87 87
88 int bucket = bucketOf(eventDate); 88 const int bucket = bucketOf(eventDate);
89 SinkTrace() << "Adding event:" << event->getSummary() << "in bucket #" << bucket; 89 SinkTrace() << "Adding event:" << event->getSummary() << "in bucket #" << bucket;
90 partitionedEvents[bucket].append(event); 90 //Avoid adding events that start in the past
91 if (bucket >= 0) {
92 Q_ASSERT(bucket >= 0 && bucket < partitionedEvents.size());
93 partitionedEvents[bucket].append(event);
94 }
91 95
92 //Also add the event to all other days it spans 96 //Also add the event to all other days it spans
93 QDate endDate = event->getEndTime().date(); 97 const QDate endDate = event->getEndTime().date();
94 if (endDate.isValid()) { 98 if (endDate.isValid()) {
95 const int endBucket = qMin(bucketOf(endDate), periodLength()); 99 const int endBucket = qMin(bucketOf(endDate), periodLength() - 1);
96 for (int i = bucket + 1; i <= endBucket; i++) { 100 for (int i = bucket + 1; i <= endBucket; i++) {
101 Q_ASSERT(i >= 0 && i < partitionedEvents.size());
97 partitionedEvents[i].append(event); 102 partitionedEvents[i].append(event);
98 } 103 }
99 104
@@ -130,7 +135,7 @@ QModelIndex PeriodDayEventModel::index(int row, int column, const QModelIndex &p
130 // Asking for an Event 135 // Asking for an Event
131 auto day = static_cast<int>(parent.row()); 136 auto day = static_cast<int>(parent.row());
132 137
133 Q_ASSERT(0 <= day && day <= mPeriodLength); 138 Q_ASSERT(0 <= day && day < partitionedEvents.size());
134 if (row >= partitionedEvents[day].size()) { 139 if (row >= partitionedEvents[day].size()) {
135 return {}; 140 return {};
136 } 141 }
@@ -160,7 +165,7 @@ int PeriodDayEventModel::rowCount(const QModelIndex &parent) const
160 } 165 }
161 166
162 auto day = parent.row(); 167 auto day = parent.row();
163 168 Q_ASSERT(0 <= day && day < partitionedEvents.size());
164 return partitionedEvents[day].size(); 169 return partitionedEvents[day].size();
165} 170}
166 171
@@ -215,6 +220,7 @@ QVariant PeriodDayEventModel::data(const QModelIndex &id, int role) const
215 auto result = QVariantList{}; 220 auto result = QVariantList{};
216 221
217 QMap<QTime, int> sorted; 222 QMap<QTime, int> sorted;
223 Q_ASSERT(0 <= day && day <= partitionedEvents.size());
218 for (int i = 0; i < partitionedEvents[day].size(); ++i) { 224 for (int i = 0; i < partitionedEvents[day].size(); ++i) {
219 const auto eventId = index(i, 0, id); 225 const auto eventId = index(i, 0, id);
220 sorted.insert(data(eventId, StartTime).toDateTime().time(), i); 226 sorted.insert(data(eventId, StartTime).toDateTime().time(), i);
@@ -258,6 +264,7 @@ QVariant PeriodDayEventModel::data(const QModelIndex &id, int role) const
258 auto day = id.internalId(); 264 auto day = id.internalId();
259 SinkTrace() << "Fetching data for event on day" << day << "with role" 265 SinkTrace() << "Fetching data for event on day" << day << "with role"
260 << QMetaEnum::fromType<Roles>().valueToKey(role); 266 << QMetaEnum::fromType<Roles>().valueToKey(role);
267 Q_ASSERT(0 <= day && day < partitionedEvents.size());
261 auto event = partitionedEvents[day].at(id.row()); 268 auto event = partitionedEvents[day].at(id.row());
262 269
263 switch (role) { 270 switch (role) {