Skip to content

Commit 8431524

Browse files
fixed checks for valid GDB data
1 parent d771f8f commit 8431524

3 files changed

Lines changed: 21 additions & 2 deletions

File tree

src/views/component-viewer/component-viewer-target-access.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,6 @@ export class ComponentViewerTargetAccess {
136136
}
137137
}
138138

139-
140-
141139
public async evaluateMemory(address: string, length: number, offset: number): Promise<string | undefined> {
142140
try {
143141
const args: DebugProtocol.ReadMemoryArguments = {

src/views/component-viewer/scvd-debug-target.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ function toUint32(value: number | bigint): number | bigint {
4949
return value >>> 0;
5050
}
5151

52+
function isLikelyBase64(data: string): boolean {
53+
const trimmed = data.trim();
54+
if (trimmed.length === 0 || trimmed.length % 4 === 1) {
55+
return false;
56+
}
57+
if (/[^A-Za-z0-9+/=]/.test(trimmed)) {
58+
return false;
59+
}
60+
return true;
61+
}
62+
5263
export function gdbNameFor(name: string): string | undefined {
5364
return REGISTER_GDB_MAP.get(normalize(name));
5465
}
@@ -234,6 +245,10 @@ export class ScvdDebugTarget {
234245
if (dataAsString.startsWith('Unable')) {
235246
return undefined;
236247
}
248+
if (!isLikelyBase64(dataAsString)) {
249+
console.error(`ScvdDebugTarget.readMemory: invalid base64 data for address ${address.toString()}`);
250+
return undefined;
251+
}
237252
// Convert String data to Uint8Array
238253
const byteArray = this.decodeGdbData(dataAsString);
239254

src/views/component-viewer/test/integration/scvd-debug-target.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ describe('scvd-debug-target', () => {
180180
accessMock.evaluateMemory.mockResolvedValue(undefined);
181181
await expect(target.readMemory(0x0, 3)).resolves.toBeUndefined();
182182

183+
const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
184+
accessMock.evaluateMemory.mockResolvedValue('No active session');
185+
await expect(target.readMemory(0x0, 3)).resolves.toBeUndefined();
186+
expect(errorSpy).toHaveBeenCalled();
187+
errorSpy.mockRestore();
188+
183189
accessMock.evaluateMemory.mockResolvedValue('AQID'); // len 3 vs requested 4
184190
await expect(target.readMemory(0x0, 4)).resolves.toEqual(new Uint8Array([1, 2, 3]));
185191
});

0 commit comments

Comments
 (0)