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
5
5
/**
6
6
* Creates a stack parser with the supplied line parsers
@@ -14,7 +14,10 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser {
14
14
15
15
return ( stack : string , skipFirst : number = 0 ) : StackFrame [ ] => {
16
16
const frames : StackFrame [ ] = [ ] ;
17
- for ( const line of stack . split ( '\n' ) . slice ( skipFirst ) ) {
17
+ const lines = stack . split ( '\n' ) ;
18
+
19
+ for ( let i = skipFirst ; i < lines . length ; i ++ ) {
20
+ const line = lines [ i ] ;
18
21
// Ignore lines over 1kb as they are unlikely to be stack frames.
19
22
// Many of the regular expressions use backtracking which results in run time that increases exponentially with
20
23
// input size. Huge strings can result in hangs/Denial of Service:
@@ -35,6 +38,10 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser {
35
38
break ;
36
39
}
37
40
}
41
+
42
+ if ( frames . length >= STACKTRACE_FRAME_LIMIT ) {
43
+ break ;
44
+ }
38
45
}
39
46
40
47
return stripSentryFramesAndReverse ( frames ) ;
@@ -79,7 +86,7 @@ export function stripSentryFramesAndReverse(stack: StackFrame[]): StackFrame[] {
79
86
80
87
// The frame where the crash happened, should be the last entry in the array
81
88
return localStack
82
- . slice ( 0 , STACKTRACE_LIMIT )
89
+ . slice ( 0 , STACKTRACE_FRAME_LIMIT )
83
90
. map ( frame => ( {
84
91
...frame ,
85
92
filename : frame . filename || localStack [ 0 ] . filename ,
0 commit comments