- ผู้เขียนกำลังจัดการปัญหาการดีบักในโปรเจ็กต์ที่มี gdbserver ทำงานอยู่บนสถาปัตยกรรม PowerPC32 และมีแอปพลิเคชันแบบหลายเธรด
- ปัญหาคือการเชื่อมต่อกับ gdbserver หลุด ทำให้ไม่สามารถควบคุมเซสชันดีบักได้อีกต่อไป
- หลังจากการค้นคว้าและตรวจสอบ ผู้เขียนพบเธรดอีเมลที่ชี้ไปยังคอมมิตที่แน่ชัดซึ่งเป็นสาเหตุของปัญหานี้
- ผู้เขียนใช้เวลา 3-4 วันอ่านคำอธิบายคอมมิตที่เกี่ยวข้องกับสถาปัตยกรรม PowerPC และการเปลี่ยนแปลงรอบ ๆ
task_struct พร้อมพยายามหาว่าปัญหานี้ถูกแก้ในเคอร์เนลเวอร์ชันถัดไปแล้วหรือไม่
- ผู้เขียนใช้เครื่องมือและเทคนิคหลากหลาย เช่น การย้ายเธรด
thread_struct, การตรวจสอบเลย์เอาต์ของ task_struct ด้วย pahole และการใช้ ftrace เพื่อดูว่าเธรดของโปรเซสที่กำลังดีบักถูกจัดตารางเวลาเมื่อใด
- ผู้เขียนพบว่าปัญหาอาจเป็นเรื่องหน่วยความจำเสียหาย โดยเธรดที่ค้างถูกจัดตารางเวลาเพียงครั้งเดียว ต่างจากเธรดอื่น
- ผู้เขียนใช้ฮาร์ดแวร์เบรกพอยต์บน Linux และเขียนโมดูลเคอร์เนล Linux เพื่อวางฮาร์ดแวร์เบรกพอยต์บนฟิลด์
__state เพื่อดูว่าใครเป็นคนเขียนค่าลงไป
- ผู้เขียนพบว่าปัญหาเกิดจากบัฟเฟอร์โอเวอร์โฟลว์ใน
ptrace_put_fpr (ซึ่ง API POKEUSER ใช้งาน) ทำให้ฟิลด์สำคัญใน task_struct เช่น __state ถูกเขียนทับ
- ผู้เขียนมองว่าปัญหานี้อาจนำไปสู่ประเด็นด้านความปลอดภัย จึงส่งแพตช์ไปยังทีมความปลอดภัยของลินุกซ์เคอร์เนล (
security@kernel.org) เพื่อแก้ไขปัญหานี้
- แทนที่จะรับแพตช์ของผู้เขียน Michael Ellerman ผู้ดูแล PowerPC กลับเขียนวิธีแก้เวอร์ชันของตนเองขึ้นมา
- ผู้เขียนรู้สึกว่าผลงานของตนไม่ได้รับการยอมรับอย่างเหมาะสม ถูกมองข้าม และรู้สึกโกรธ เพราะได้รับเพียงแท็ก
Reported-by เท่านั้น
- การมีส่วนร่วมกับเคอร์เนลครั้งแรกของผู้เขียนจึงเป็นประสบการณ์ที่เต็มไปด้วยความหงุดหงิดและความท้อแท้ จากการพูดคุยกับผู้คนที่ดูเหมือนไม่เห็นความสำคัญของการให้เครดิตอย่างเหมาะสมกับงานของผู้อื่น
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
Suggested-byในเอกสารของเคอร์เนลว่าเป็นวิธีให้เครดิตแก่ผู้ที่เสนอแนวคิดของแพตช์