এই পৃষ্ঠায় android-mainline
তে পাওয়া গুরুত্বপূর্ণ সমস্যা ও বাগ ফিক্সের বিবরণ দেওয়া আছেযা পার্টনারদের জন্য গুরুত্বপূর্ণ হতে পারে।
১৫ নভেম্বর, ২০২৪
android-mainlineওandroid16-6.12-এর জন্য Clang আপডেট করে 19.0.1 করা হয়েছে- সারসংক্ষেপ: Clang-এর নতুন ভার্সনে অ্যারের জন্য বাউন্ডস স্যানিটাইজার যোগ করা হয়েছে,
যেখানে অ্যারের সাইজ
__counted_byঅ্যাট্রিবিউট ব্যবহার করে অ্যারের সাথে লিঙ্ক করা আলাদা ভেরিয়েবলে স্টোর করা হয়। অ্যারের সাইজ সঠিকভাবে আপডেট করা না হলে এই ফিচারের কারণে কার্নেল প্যানিক হতে পারে। সমস্যার মেসেজটি দেখতে এইরকম:
UBSAN: array-index-out-of-bounds in common/net/wireless/nl80211.c index 0 is out of range for type 'struct ieee80211_channel *[] __counted_by(n_channels)' (aka 'struct ieee80211_channel *[]')বিবরণ: বাউন্ডস স্যানিটাইজার, আউট-অফ-বাউন্ডস অ্যাক্সেস শনাক্ত করার মাধ্যমে কার্নেলের অখণ্ডতা রক্ষা করার জন্য অপরিহার্য। এবং
CONFIG_UBSAN_TRAPচালু থাকলে, বাউন্ডস স্যানিটাইজার যেকোনও ফাইন্ডিংয়ে কার্নেল প্যানিক ট্রিগার করে।- Bounds sanitizer-এর আগের ভার্সন শুধুমাত্র নির্দিষ্ট সাইজের অ্যারে চেক করত
এবং ডাইনামিক অ্যালোকেট করা অ্যারে চেক করতে পারত না। নতুন ভার্সন রানটাইমে অ্যারে বাউন্ড নির্ধারণ করতে
__counted_byঅ্যাট্রিবিউট ব্যবহার করে এবং আউট-অফ-বাউন্ড অ্যাক্সেসের আরও কেস শনাক্ত করে। তবে, কিছু ক্ষেত্রে, সাইজ ভেরিয়েবল সেট করার আগে অ্যারে অ্যাক্সেস করা হয়, এর ফলে বাউন্ডস স্যানিটাইজার ট্রিগার হয় এবং কার্নেল প্যানিক হয়। এই সমস্যার সমাধান করতে, অন্তর্নিহিত মেমরি অ্যালোকেট করার সঙ্গে সঙ্গে অ্যারের সাইজ সেট করুন, যেমন aosp/3343204-এ দেখানো হয়েছে।
- Bounds sanitizer-এর আগের ভার্সন শুধুমাত্র নির্দিষ্ট সাইজের অ্যারে চেক করত
এবং ডাইনামিক অ্যালোকেট করা অ্যারে চেক করতে পারত না। নতুন ভার্সন রানটাইমে অ্যারে বাউন্ড নির্ধারণ করতে
CONFIG_UBSAN_SIGNED_WRAPসম্পর্কে:-fwrapvকম্পাইলার ফ্ল্যাগ থাকা সত্ত্বেও, Clang-এর নতুন ভার্সন সাইন করা পূর্ণসংখ্যা ওভারফ্লো ও আন্ডারফ্লো স্যানিটাইজ করে। সংজ্ঞায়িত ওভারফ্লো আচরণ সহ-fwrapvসাইন করা পূর্ণসংখ্যাকে টু'স কমপ্লিমেন্ট আনসাইন করা পূর্ণসংখ্যা হিসেবে বিবেচনা করার জন্য ফ্ল্যাগটি ডিজাইন করা হয়েছে।- Linux কার্নেলে সাইন করা ইন্টিজার ওভারফ্লো স্যানিটাইজ করার সময় বাগ শনাক্ত করতে
সাহায্য করতে পারে, এমন কিছু উদাহরণ আছে যেখানে ওভারফ্লো ইচ্ছাকৃত, যেমন,
atomic_long_t-এর সাথে। এর ফলে, UBSAN-কে শুধুমাত্র বাউন্ড স্যানিটাইজার হিসেবে কাজ করতে দেওয়ার জন্যCONFIG_UBSAN_SIGNED_WRAPবন্ধ করে দেওয়া হয়েছে ।
- Linux কার্নেলে সাইন করা ইন্টিজার ওভারফ্লো স্যানিটাইজ করার সময় বাগ শনাক্ত করতে
সাহায্য করতে পারে, এমন কিছু উদাহরণ আছে যেখানে ওভারফ্লো ইচ্ছাকৃত, যেমন,
CONFIG_UBSAN_TRAPসম্পর্কে: কার্নেলের অখণ্ডতা রক্ষা করার জন্য কোনও সমস্যা শনাক্ত করলে, UBSAN একটি কার্নেল প্যানিক ট্রিগার করার জন্য কনফিগার করা হয়। তবে, আমরা ২৩ অক্টোবর থেকে ১২ নভেম্বর পর্যন্ত এই আচরণ বন্ধ রেখেছিলাম। আমরা এটি করেছি যাতে পরিচিত__counted_byসমস্যার সমাধান করার সময় কম্পাইলার আপডেট আনব্লক করা যায়।
- সারসংক্ষেপ: Clang-এর নতুন ভার্সনে অ্যারের জন্য বাউন্ডস স্যানিটাইজার যোগ করা হয়েছে,
যেখানে অ্যারের সাইজ
১ নভেম্বর, ২০২৪
- Linux 6.12-rc4 ল্যান্ডিং
- সারসংক্ষেপ:
CONFIG_OF_DYNAMICটি ত্রুটিপূর্ণ ড্রাইভারের জন্য গুরুতর রিগ্রেশন ঘটাতে পারে। - বিবরণ: Linux
6.12-rc1-এর সাথেandroid-mainlineমার্জ করার সময় আমরা দেখি যে আউট-অফ-ট্রি ড্রাইভার লোড করা যাচ্ছে না। যে পরিবর্তনটি ড্রাইভারের বাগ প্রকাশ করেছে সেটি274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")কমিট হিসেবে চিহ্নিত করা হয়েছে এবং আমরা aosp/3287735-এ এটি সাময়িকভাবে ফিরিয়ে এনেছি। পরিবর্তনটিCONFIG_OF_OVERLAYবেছে নেয়, যাCONFIG_OF_DYNAMICবেছে নেয়।!OF_DYNAMIC-এর সাথে,of_node_get()এবংof_node_put()-এ রেফারেন্স-কাউন্টিং কার্যকরভাবে বন্ধ করা হয়েছে কারণ সেগুলিnoopsহিসাবে প্রয়োগ করা হয়েছে।OF_DYNAMICআবার চালু করলে, ড্রাইভারের মধ্যে ভুলভাবে রেফারেন্স কাউন্টিং প্রয়োগ করার সমস্যাstruct device_nodeসামনে আসে। এর ফলে মেমরি করাপশন, ইউজ-আফটার-ফ্রি ও মেমরি লিকের মতো বিভিন্ন ধরনের সমস্যা হয়। - OF পার্সিং সম্পর্কিত API-এর সমস্ত ব্যবহার অবশ্যই পরিদর্শন করতে হবে। নিচের তালিকাটি
আংশিক, তবে এতে এমন কেস রয়েছে যা আমরা লক্ষ্য করছি:
- ফ্রি করার পরে ব্যবহার (UAF):
- একই
device_nodeআর্গুমেন্টের আবার ব্যবহার: সেইসব ফাংশন প্রদত্ত নোডেof_node_put()কল করে, সেগুলিকে কল করার আগেof_node_get()যোগ করার প্রয়োজন হতে পারে (যেমন, একই নোডকে আর্গুমেন্ট হিসেবে ব্যবহার করে বারবার কল করার সময়):of_find_compatible_node()of_find_node_by_name()of_find_node_by_path()of_find_node_by_type()of_get_next_cpu_node()of_get_next_parent()of_get_next_child()of_get_next_available_child()of_get_next_reserved_child()of_find_node_with_property()of_find_matching_node_and_match()
- নির্দিষ্ট লুপ থেকে বেরিয়ে আসার পরে
device_nodeব্যবহার করা:for_each_available_child_of_node_scoped()for_each_available_child_of_node()for_each_child_of_node_scoped()for_each_child_of_node()
device_nodeথেকেchar *প্রপার্টিতে সরাসরি পয়েন্টার রাখা যেমন, এগুলি ব্যবহার করা:const char *foo = struct device_node::nameof_property_read_string()of_property_read_string_array()of_property_read_string_index()of_get_property()
- একই
- মেমরি লিক:
device_nodeপাওয়া এবং সেটি আনরেফারেন্স করতে ভুলে যাওয়া (of_node_put())। এগুলি থেকে রিটার্ন করা নোড কোনও এক সময় ফ্রি করতে হবে:of_find_compatible_node()of_find_node_by_name()of_find_node_by_path()of_find_node_by_type()of_find_node_by_phandle()of_parse_phandle()of_find_node_opts_by_path()of_get_next_cpu_node()of_get_compatible_child()of_get_child_by_name()of_get_parent()of_get_next_parent()of_get_next_child()of_get_next_available_child()of_get_next_reserved_child()of_find_node_with_property()of_find_matching_node_and_match()
- লুপ ইটারেশন থেকে
device_nodeরাখা হচ্ছে। আপনি যদি নিম্নলিখিত কোনও একটি থেকে রিটার্ন বা ব্রেক করেন, তাহলে আপনাকে কোনও এক সময় বাকি থাকা রেফারেন্স ড্রপ করতে হবে:for_each_available_child_of_node()for_each_child_of_node()for_each_node_by_type()for_each_compatible_node()of_for_each_phandle()
- ফ্রি করার পরে ব্যবহার (UAF):
- Linux ল্যান্ড করার সময় আগে উল্লেখ করা পরিবর্তন রিস্টোর করা হয়েছে
6.12-rc4(aosp/3315251 দেখুন)CONFIG_OF_DYNAMICআবার চালু করা হয়েছে এবং এর ফলে সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভার এক্সপোজ করা হয়েছে।
- সারসংক্ষেপ: