ขณะที่ผมกำลังอ่านรหัสที่มาลินุกซ์และอื่น ๆ โดยเฉพาะรหัสสายระบบผมมาในsys_reboot
การดำเนินงาน: http://lxr.free-electrons.com/source/kernel/reboot.c#L199
199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200 void __user *, arg)
201 {
202 ...
...
286 }
ตรงกลางมีโค้ดเฉพาะส่วนนี้:
209
210 /* For safety, we require "magic" arguments. */
211 if (magic1 != LINUX_REBOOT_MAGIC1 ||
212 (magic2 != LINUX_REBOOT_MAGIC2 &&
213 magic2 != LINUX_REBOOT_MAGIC2A &&
214 magic2 != LINUX_REBOOT_MAGIC2B &&
215 magic2 != LINUX_REBOOT_MAGIC2C))
216 return -EINVAL;
ฉันสงสัยว่ามันปลอดภัยแค่ไหน ฉันหมายความว่ามันเป็นการป้องกันการใช้ผิดวัตถุประสงค์หรือไม่? ในกรณีนี้เนื่องจากพารามิเตอร์เป็นสาธารณะไลบรารีหรือแอ็พพลิเคชันใด ๆ อาจใช้การโทรของระบบในทางที่ผิดแม้ว่าพวกเขาจะต้องผ่านพารามิเตอร์ ฉันพลาดอะไร?
getpid
และสิ่งที่ชอบแน่นอนว่าพวกเขาทุกคนสามารถมีผลกระทบที่คาดเดาไม่ได้หากใช้ผิดวัตถุประสงค์ หรือบางที syscalls อื่น ๆ ทั้งหมดมีพารามิเตอร์เพียงพอที่จะตรวจสอบเพื่อให้ไม่เป็นอันตรายหากถูกเรียกผิด มันให้ความรู้สึกเหมือนความคิดที่แปลกประหลาดของ "ความปลอดภัย" ให้ฉัน แต่ ...