1
1
import type { StackFrame , StackLineParser , StackLineParserFn , StackParser } from '@sentry/types' ;
2
2
3
- const STACKTRACE_LIMIT = 50 ;
3
+ const STACKTRACE_FRAME_LIMIT = 50 ;
4
4
// Used to sanitize webpack (error: *) wrapped stack errors
5
5
const WEBPACK_ERROR_REGEXP = / \( e r r o r : ( .* ) \) / ;
6
6
@@ -16,7 +16,10 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser {
16
16
17
17
return ( stack : string , skipFirst : number = 0 ) : StackFrame [ ] => {
18
18
const frames : StackFrame [ ] = [ ] ;
19
- for ( const line of stack . split ( '\n' ) . slice ( skipFirst ) ) {
19
+ const lines = stack . split ( '\n' ) ;
20
+
21
+ for ( let i = skipFirst ; i < lines . length ; i ++ ) {
22
+ const line = lines [ i ] ;
20
23
// Ignore lines over 1kb as they are unlikely to be stack frames.
21
24
// Many of the regular expressions use backtracking which results in run time that increases exponentially with
22
25
// input size. Huge strings can result in hangs/Denial of Service:
@@ -37,6 +40,10 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser {
37
40
break ;
38
41
}
39
42
}
43
+
44
+ if ( frames . length >= STACKTRACE_FRAME_LIMIT ) {
45
+ break ;
46
+ }
40
47
}
41
48
42
49
return stripSentryFramesAndReverse ( frames ) ;
@@ -67,7 +74,7 @@ export function stripSentryFramesAndReverse(stack: ReadonlyArray<StackFrame>): S
67
74
return [ ] ;
68
75
}
69
76
70
- const localStack = stack . slice ( 0 , STACKTRACE_LIMIT ) ;
77
+ const localStack = stack . slice ( 0 , STACKTRACE_FRAME_LIMIT ) ;
71
78
72
79
const lastFrameFunction = localStack [ localStack . length - 1 ] . function ;
73
80
// If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)
0 commit comments