এই পৃষ্ঠাটি 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()
-
- বিনামূল্যে ব্যবহার করুন (UAF):
- 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()
-
- বিনামূল্যে ব্যবহার করুন (UAF):
- Linux
6.12-rc4
( aosp/3315251 দেখুন) অবতরণ করার সময় পূর্বে উল্লেখিত পরিবর্তনটি পুনরুদ্ধার করা হয়েছিলCONFIG_OF_DYNAMIC
আবার সক্রিয় করে এবং সম্ভাব্য ত্রুটিপূর্ণ ড্রাইভারগুলিকে প্রকাশ করে।
- সারাংশ: