GKI 16-6.12 android-mainline errata

এই পৃষ্ঠায় 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-এ দেখানো হয়েছে।
    • CONFIG_UBSAN_SIGNED_WRAP সম্পর্কে: -fwrapv কম্পাইলার ফ্ল্যাগ থাকা সত্ত্বেও, Clang-এর নতুন ভার্সন সাইন করা পূর্ণসংখ্যা ওভারফ্লো ও আন্ডারফ্লো স্যানিটাইজ করে। সংজ্ঞায়িত ওভারফ্লো আচরণ সহ -fwrapv সাইন করা পূর্ণসংখ্যাকে টু'স কমপ্লিমেন্ট আনসাইন করা পূর্ণসংখ্যা হিসেবে বিবেচনা করার জন্য ফ্ল্যাগটি ডিজাইন করা হয়েছে।

      • Linux কার্নেলে সাইন করা ইন্টিজার ওভারফ্লো স্যানিটাইজ করার সময় বাগ শনাক্ত করতে সাহায্য করতে পারে, এমন কিছু উদাহরণ আছে যেখানে ওভারফ্লো ইচ্ছাকৃত, যেমন, atomic_long_t-এর সাথে। এর ফলে, UBSAN-কে শুধুমাত্র বাউন্ড স্যানিটাইজার হিসেবে কাজ করতে দেওয়ার জন্য CONFIG_UBSAN_SIGNED_WRAP বন্ধ করে দেওয়া হয়েছে ।
    • CONFIG_UBSAN_TRAP সম্পর্কে: কার্নেলের অখণ্ডতা রক্ষা করার জন্য কোনও সমস্যা শনাক্ত করলে, UBSAN একটি কার্নেল প্যানিক ট্রিগার করার জন্য কনফিগার করা হয়। তবে, আমরা ২৩ অক্টোবর থেকে ১২ নভেম্বর পর্যন্ত এই আচরণ বন্ধ রেখেছিলাম। আমরা এটি করেছি যাতে পরিচিত __counted_by সমস্যার সমাধান করার সময় কম্পাইলার আপডেট আনব্লক করা যায়।

১ নভেম্বর, ২০২৪

  • 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::name
          • of_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()
    • Linux ল্যান্ড করার সময় আগে উল্লেখ করা পরিবর্তন রিস্টোর করা হয়েছে 6.12-rc4 (aosp/3315251 দেখুন) CONFIG_OF_DYNAMIC আবার চালু করা হয়েছে এবং এর ফলে সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভার এক্সপোজ করা হয়েছে।