GKI 16-6.12 অ্যান্ড্রয়েড-মেইনলাইন ত্রুটি

এই পৃষ্ঠাটি android-mainline পাওয়া গুরুত্বপূর্ণ সমস্যা এবং বাগ ফিক্সের বর্ণনা করে যা অংশীদারদের জন্য তাৎপর্যপূর্ণ হতে পারে।

15 নভেম্বর, 2024

  • android-mainline এবং android16-6.12 এর জন্য ক্ল্যাং 19.0.1-এ আপডেট করা হয়েছে

    • সারাংশ: ক্ল্যাং-এর নতুন সংস্করণ অ্যারের জন্য একটি বাউন্ডস স্যানিটাইজার প্রবর্তন করে, যেখানে অ্যারের আকার __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 সক্ষম করে, বাউন্ডস স্যানিটাইজার যেকোন অনুসন্ধানে কার্নেল আতঙ্কের সূত্রপাত করে।

      • বাউন্ডস স্যানিটাইজারের পূর্ববর্তী সংস্করণ শুধুমাত্র নির্দিষ্ট-আকারের অ্যারেগুলি পরীক্ষা করেছে এবং গতিশীলভাবে বরাদ্দ করা অ্যারেগুলি পরীক্ষা করতে পারেনি। নতুন সংস্করণ রানটাইমে অ্যারে সীমা নির্ধারণ করতে __counted_by অ্যাট্রিবিউট ব্যবহার করে এবং আউট-অফ-বাউন্ড অ্যাক্সেসের আরও কেস সনাক্ত করে। যাইহোক, কিছু ক্ষেত্রে, সাইজ ভেরিয়েবল সেট করার আগে অ্যারে অ্যাক্সেস করা হয়, যা বাউন্ডস স্যানিটাইজারকে ট্রিগার করে এবং কার্নেল প্যানিক সৃষ্টি করে। এই সমস্যাটি সমাধান করতে, অন্তর্নিহিত মেমরি বরাদ্দ করার সাথে সাথে অ্যারের আকার নির্ধারণ করুন, যেমন aosp/3343204 এ চিত্রিত হয়েছে।
    • CONFIG_UBSAN_SIGNED_WRAP সম্পর্কে : Clang-এর নতুন সংস্করণ -fwrapv কম্পাইলার পতাকা থাকা সত্ত্বেও স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো এবং আন্ডারফ্লোকে স্যানিটাইজ করে। -fwrapv পতাকাটি সংজ্ঞায়িত ওভারফ্লো আচরণের সাথে স্বাক্ষরিত পূর্ণসংখ্যাকে দুটির পরিপূরক স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে বিবেচনা করার জন্য ডিজাইন করা হয়েছে।

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

নভেম্বর 1, 2024

  • Linux 6.12-rc4 ল্যান্ডিং
    • সারাংশ: CONFIG_OF_DYNAMIC সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভারের জন্য গুরুতর রিগ্রেশন সৃষ্টি করে।
    • বিশদ বিবরণ: লিনাক্স 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 জন্য ভুলভাবে রেফ-কাউন্টিং প্রয়োগ করে। এটি মেমরি দুর্নীতি, ব্যবহার-পর-মুক্ত, এবং মেমরি ফাঁসের মতো বিভিন্ন ধরণের ত্রুটি ঘটায়।
    • পার্সিং সম্পর্কিত 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 আবার সক্রিয় করে এবং সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভারগুলিকে প্রকাশ করে।
,

এই পৃষ্ঠাটি android-mainline পাওয়া গুরুত্বপূর্ণ সমস্যা এবং বাগ ফিক্সের বর্ণনা করে যা অংশীদারদের জন্য তাৎপর্যপূর্ণ হতে পারে।

15 নভেম্বর, 2024

  • android-mainline এবং android16-6.12 এর জন্য ক্ল্যাং 19.0.1-এ আপডেট করা হয়েছে

    • সারাংশ: ক্ল্যাং-এর নতুন সংস্করণ অ্যারের জন্য একটি বাউন্ডস স্যানিটাইজার প্রবর্তন করে, যেখানে অ্যারের আকার __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 সক্ষম করে, বাউন্ডস স্যানিটাইজার যেকোন অনুসন্ধানে কার্নেল আতঙ্কের সূত্রপাত করে।

      • বাউন্ডস স্যানিটাইজারের পূর্ববর্তী সংস্করণ শুধুমাত্র নির্দিষ্ট-আকারের অ্যারেগুলি পরীক্ষা করেছে এবং গতিশীলভাবে বরাদ্দ করা অ্যারেগুলি পরীক্ষা করতে পারেনি। নতুন সংস্করণ রানটাইমে অ্যারে সীমা নির্ধারণ করতে __counted_by অ্যাট্রিবিউট ব্যবহার করে এবং আউট-অফ-বাউন্ড অ্যাক্সেসের আরও কেস সনাক্ত করে। যাইহোক, কিছু ক্ষেত্রে, সাইজ ভেরিয়েবল সেট করার আগে অ্যারে অ্যাক্সেস করা হয়, যা বাউন্ডস স্যানিটাইজারকে ট্রিগার করে এবং কার্নেল প্যানিক সৃষ্টি করে। এই সমস্যাটি সমাধান করতে, অন্তর্নিহিত মেমরি বরাদ্দ করার সাথে সাথে অ্যারের আকার নির্ধারণ করুন, যেমন aosp/3343204 এ চিত্রিত হয়েছে।
    • CONFIG_UBSAN_SIGNED_WRAP সম্পর্কে : Clang-এর নতুন সংস্করণ -fwrapv কম্পাইলার পতাকা থাকা সত্ত্বেও স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো এবং আন্ডারফ্লোকে স্যানিটাইজ করে। -fwrapv পতাকাটি সংজ্ঞায়িত ওভারফ্লো আচরণের সাথে স্বাক্ষরিত পূর্ণসংখ্যাকে দুটির পরিপূরক স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে বিবেচনা করার জন্য ডিজাইন করা হয়েছে।

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

নভেম্বর 1, 2024

  • Linux 6.12-rc4 ল্যান্ডিং
    • সারাংশ: CONFIG_OF_DYNAMIC সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভারের জন্য গুরুতর রিগ্রেশন সৃষ্টি করে।
    • বিশদ বিবরণ: লিনাক্স 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 জন্য ভুলভাবে রেফ-কাউন্টিং প্রয়োগ করে। এটি মেমরি দুর্নীতি, ব্যবহার-পর-মুক্ত, এবং মেমরি ফাঁসের মতো বিভিন্ন ধরণের ত্রুটি ঘটায়।
    • পার্সিং সম্পর্কিত 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 আবার সক্রিয় করে এবং সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভারগুলিকে প্রকাশ করে।