딱국 왈:
"파라미터로 x 받아와놓고선 (copy로 받아온거)

그거에다가 *(&x) = ~~; 이딴 병신짓 해놓는것도 그렇고

야... 그거 그냥 로컬변수만 바껴...

코드를 잘못짤수도 있는데, *(&x) 이거는 진짜 충격임. 이거는 그냥 흠... 아니 이거는 솔직히 장애가 있는거야. 실무자로 쓰면 안되는 그런거... 그리고 얘가 막 프로그래밍 배운지 반년된 초짜 그런것도 아니잖아?? 급식때부터 C로 프로그래밍하던애아님? 도대체 이런 장애가 왜 있는거지?
"


딱국이가 eip는 copy한 값이라 &eip는 새롭게 copy된 녀석의 주소 값을 가리키므로
*(새롭게 카피된 엉뚱한 주소) 로 original eip를 수정하는게 아니니까 잘못된 코드라고 하는 거 같은데
반박 간다.

문제의 코드: do_signal (kernel/signl.c)



해당 함수를 부르기 전 스택 layout에 대해서는 kernel/system_call.c에 아래와 같이 정리되어있다



do_signal 함수 인자랑 순서를 비교해 보면 똑같다는 거 알 수 있다.

do_signal을 호출하는 곳은 kernel/system_call.s인데 그 코드는 아래와 같다.


중요한 거는 do_signal을 하고 나서 부터야

위에서 볼 수 있듯이 스택을 pop하기 시작하는데
eax, ebs, ..., ds까지 pop하고 eip직전에서 멈춘다.
그다음에 iret을 부르지.

iret이 뭐하는 거냐구? 핵심만 말하면 스택에서 eip를 pop해서 글로 점프함.
eip에는 뭐가 저장되어 있다구? 시그널 핸들러의 주소가 저장되어 있지 *(&eip) = sa_handler

3줄 요약하면
1. 딱국이가 *(&eip) = sa_handler 는 희대의 ㅄ짓이라고 리누스를 오질나게 까내림
2. 딱국이 말을 의역해 보면 eip는 함수 내에서 copy로 받아온 값인데 거기다가 &를 취하고 *를 취하면 original eip레지스터가 변하겠냐고 지적하는 거 같음
3. original eip가 변하지 않고 stack에 복사된 eip가 변하는 건 맞는데, 결국 iret가 그 eip를 pop해서 그 주소로 점프하기 때문에 코드에 이상 없음.

한 마디로 딱국 == 리누스 발끝에도 못미치는 ㅄ

개추좀 해줘라. 딱국이 뭐라하나 보게.