ASELSANMicrokernel
GELİŞTİRME GÜNLÜĞÜ

M7 — User IPC

M7 audit · 10/10
IPC rights enforcement + reply_cap lifecycle
M7.5 hak kontrolü tamamlandı, reply cap leak'leri kapatıldı, ABI sözleşmesi güncellendi.
M7.1–M7.5 hardened
🔴 Silent bug (3)
  • #1 CALL path'inde reply_cap retain yanlış id (target_id vs reply_cap.id) — asla match etmiyordu → leak. REPLY zaten one-shot temizliyor, CALL'dan tamamen kaldırıldı.
  • #2 deliver_message_and_wake false dönerse mesaj kayboluyordu + Client sonsuz block. Şimdi pending queue'ya enqueue; hedef ep kayıpsa NoReceiver + reply_cap cleanup.
  • #3 Audit'in işaretlediği rights-check sıralaması aslında doğruydu (M6 audit zaten düzeltmiş) — yorum netleştirildi, false positive.
🟡 Rights enforcement (3)
  • #4a SYS_IPC_RECV: artık ep.rights.can_recv() doğrulaması var. Eskiden sadece SYS_IPC_CALL rights check yapıyordu — asimetri.
  • #4b SYS_IPC_REPLY: is_reply_cap && can_reply() birlikte gerekli — REPLY hakkı revoke edilmiş cap çalışmaz.
  • #10 Revoke wake: error case'inde saved_user_gprs[1..=7] sıfırlanıyor — user wrapper çöp r_label/r_data0 okumasın.
🟢 Cleanup + API (4)
  • #6 EndpointRights accessor'ları tamamlandı: can_grant(), can_reply(); raw bitwise erişim kaldırıldı.
  • #7 SYS_LIST_ENDPOINTS magic 6MAX_ENDPOINT_LIST_RETURN const.
  • #8 M7.1 register sözleşme string'i güncel: x7=reply_cap (M6 audit sonrası), full IN/OUT layout.
  • #9 Receive-on-own yorumu netleştirildi (eski "M6 audit" referansı kafa karıştırıyordu).
QEMU kanıtı (M6.4 demo, M7 fix'leri ile)
[IPC-Server] recv loop basliyor                    ← RECV rights check PASS [IPC-Client] CALL gonderiliyor                     ← SEND rights check PASS [IPC-Server] mesaj alindi, echo+1 ile reply gonderiliyor ← REPLY: is_reply_cap && can_reply() PASS [IPC-Client] reply DOGRU (echo+1) - hedef ile esleshme PASS    x3 [IPC-Client] 3 cagri tamam, exit task_exit() name='IPC-Server'/'IPC-Client' state=Dead         ← temiz exit, leak yok
Niye bu önemli
Reply cap leak kapatıldı
Server crash veya REPLY atlatma senaryolarında reply_cap'ler sonsuza dek registry'de birikiyordu. Şimdi pending enqueue + NoReceiver path'i + REPLY one-shot tek doğru yol.
Rights asimetrisi giderildi
Eskiden SYS_IPC_CALL rights check ediyordu ama RECV/REPLY etmiyordu — SEND-only task'lar RECV/REPLY yapabilirdi. Şu an üç syscall da kendi hakkını kontrol ediyor.
Mesaj kaybı imkânsız
CALL hedefte bekleyen yoksa eskiden mesaj siliniyor, client sonsuz block oluyordu. Şimdi pending queue + Server eventually RECV ile alır.