https://github.com/parchlinux/calamares/commit/5fcc092b9aab9921f10acce35548b01b7b30053a
علت رخ دادن این خطا، تداخل همزمانی (Race Condition) و خطای حافظه (Use-After-Free) بین ترد پسزمینه و ترد اصلی رابط کاربری بود. زمانی که کاربر در صفحه پارتیشنبندی نوع سواپ را تغییر میداد، چون جدول پارتیشنها دستکاری شده و وضعیت دیسک اصطلاحاً Dirty بود، تابع
applyActionChoice عملیات بازگردانی وضعیت دیسک (revertDevice) را از طریق دیالوگ اسکن آغاز میکرد؛ اما منتظر اتمام آن نمیماند و بلافاصله در ترد اصلی اقدام به بهروزرسانی پیشنمایش گرافیکی پارتیشنها (updateActionChoicePreview) میکرد. در همین لحظه، تابع
revertDevice که توسط QtConcurrent::run در یک ترد پسزمینه در حال اجرا بود، مستقیماً متد init مدل پارتیشن را فراخوانی کرده و ساختار داده دیسک را بازنشانی میکرد. دستکاری مدل داده کیوت (QAbstractItemModel) و ارسال سیگنالهای ریست مستقیماً از داخل یک ترد غیر از ترد اصلی GUI، برخلاف اصول کیوت و کاملاً ناامن است. همزمانی این اتفاق با تلاش ترد اصلی برای خواندن حافظه شیء Device که در همان ثانیه در حال تخریب و بازسازی بود، باعث میشد اندیسهای موجود در جدول پارتیشنها به حافظه آزادشده اشاره کنند و با خطای Segmentation Fault برنامه فوراً کرش کند.@ParchLinux | پارچ لینوکس