Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d2cd2e5

Browse files
authored
Merge pull request #88628 from mikeash/remote-mirror-field-descriptor-size-fix
[Reflection] Fix overrun when reading field records of nonstandard size.
2 parents 83d4291 + 8a119df commit d2cd2e5

1 file changed

Lines changed: 14 additions & 7 deletions

File tree

include/swift/RemoteInspection/Records.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,19 +116,25 @@ using FieldRecord = TargetFieldRecord<InProcess>;
116116

117117
template <typename Runtime>
118118
struct TargetFieldRecordIterator {
119+
uint16_t RecordSize;
119120
const TargetFieldRecord<Runtime> *Cur;
120121
const TargetFieldRecord<Runtime> *const End;
121122

122-
TargetFieldRecordIterator(const TargetFieldRecord<Runtime> *Cur,
123+
TargetFieldRecordIterator(uint16_t RecordSize,
124+
const TargetFieldRecord<Runtime> *Cur,
123125
const TargetFieldRecord<Runtime> *const End)
124-
: Cur(Cur), End(End) {}
126+
: RecordSize(RecordSize), Cur(Cur), End(End) {}
125127

126128
const TargetFieldRecord<Runtime> &operator*() const { return *Cur; }
127129

128130
const TargetFieldRecord<Runtime> *operator->() const { return Cur; }
129131

132+
static const TargetFieldRecord<Runtime> *advanceRecordPointer(const TargetFieldRecord<Runtime> *Ptr, size_t bytes) {
133+
return reinterpret_cast<const TargetFieldRecord<Runtime> *>(reinterpret_cast<const char *>(Ptr) + bytes);
134+
}
135+
130136
TargetFieldRecordIterator &operator++() {
131-
++Cur;
137+
Cur = advanceRecordPointer(Cur, RecordSize);
132138
return *this;
133139
}
134140

@@ -215,14 +221,15 @@ class TargetFieldDescriptor {
215221

216222
const_iterator begin() const {
217223
auto Begin = getFieldRecordBuffer();
218-
auto End = Begin + NumFields;
219-
return const_iterator { Begin, End };
224+
auto End = FieldRecordIterator::advanceRecordPointer(Begin, NumFields * FieldRecordSize);
225+
fprintf(stderr, "FieldRecordIterator begin %p end %p\n", Begin, End);
226+
return const_iterator { FieldRecordSize, Begin, End };
220227
}
221228

222229
const_iterator end() const {
223230
auto Begin = getFieldRecordBuffer();
224-
auto End = Begin + NumFields;
225-
return const_iterator { End, End };
231+
auto End = FieldRecordIterator::advanceRecordPointer(Begin, NumFields * FieldRecordSize);
232+
return const_iterator { FieldRecordSize, End, End };
226233
}
227234

228235
llvm::ArrayRef<TargetFieldRecord<Runtime>> getFields() const {

0 commit comments

Comments
 (0)