diff options
| author | Damien George | 2014-04-08 14:08:14 +0000 |
|---|---|---|
| committer | Damien George | 2014-04-08 14:08:14 +0000 |
| commit | 26cf55ae05658c8a47719d46d48df8c9751108b5 (patch) | |
| tree | be29a2ba6c82b486b21e6a7efb98f22eb44645af /py/nlrx64.S | |
| parent | 094ebef259e86dfc0f1f3c1b493d81e5e8b1b6c4 (diff) | |
Add a check for NULL nlr_top in nlr_jump.
If no nlr_buf has been pushed, and an nlr_jump is called, then control
is transferred to nlr_jump_fail (which should bail out with a fatal
error).
Diffstat (limited to 'py/nlrx64.S')
| -rw-r--r-- | py/nlrx64.S | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/py/nlrx64.S b/py/nlrx64.S index a4073981a..929a348ca 100644 --- a/py/nlrx64.S +++ b/py/nlrx64.S @@ -61,6 +61,8 @@ nlr_jump: #endif movq %rdi, %rax # put return value in %rax movq nlr_top(%rip), %rdi # get nlr_top into %rdi + test %rdi, %rdi # check for nlr_top being NULL + je .fail # fail if nlr_top is NULL movq %rax, 8(%rdi) # store return value movq (%rdi), %rax # load prev nlr_buf movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) @@ -76,10 +78,14 @@ nlr_jump: xorq %rax, %rax # clear return register inc %al # increase to make 1, non-local return ret # return +.fail: + movq %rax, %rdi # put argument back in first-arg register + je nlr_jump_fail # transfer control to nlr_jump_fail #if !(defined(__APPLE__) && defined(__MACH__)) .size nlr_jump, .-nlr_jump #endif + .bss #if !(defined(__APPLE__) && defined(__MACH__)) .local nlr_top #endif @@ -107,12 +113,21 @@ nlr_push: xorq %rax, %rax # return 0, normal return ret # return -/* void nlr_jump(rcx=uint val) */ +/* void nlr_pop() */ + .globl nlr_pop +nlr_pop: + movq nlr_top(%rip), %rax # get nlr_top into %rax + movq (%rax), %rax # load prev nlr_buf + movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) + ret # return +/* void nlr_jump(rcx=uint val) */ .globl nlr_jump nlr_jump: movq %rcx, %rax # put return value in %rax - movq nlr_top(%rip), %rcx # get nlr_top into %rsi + movq nlr_top(%rip), %rcx # get nlr_top into %rcx + test %rcx, %rcx # check for nlr_top being NULL + je .fail # fail if nlr_top is NULL movq %rax, 8(%rcx) # store return value movq (%rcx), %rax # load prev nlr_buf movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) @@ -130,17 +145,13 @@ nlr_jump: xorq %rax, %rax # clear return register inc %al # increase to make 1, non-local return ret # return +.fail: + movq %rax, %rcx # put argument back in first-arg register + je nlr_jump_fail # transfer control to nlr_jump_fail + .bss .comm nlr_top,8,8 - /* void nlr_pop() */ - .globl nlr_pop -nlr_pop: - movq nlr_top(%rip), %rax # get nlr_top into %rax - movq (%rax), %rax # load prev nlr_buf - movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) - ret # return - #endif // !defined(__CYGWIN__) #endif // __x86_64__ |
