የሚኒሶታ ዩኒቨርሲቲ ቡድን ስለተላኩት ተንኮል አዘል ለውጦች ዝርዝሮችን አሳይቷል።

ክፍት የይቅርታ ደብዳቤ ተከትሎ በሊኑክስ ከርነል ላይ የተደረጉ ለውጦችን በግሬግ ክሮህ-ሃርትማን መቀበል የታገደው የሚኒሶታ ዩኒቨርሲቲ የተመራማሪዎች ቡድን ለከርነል አልሚዎች ስለተላኩት ጥገናዎች እና ከጠባቂዎቹ ጋር ስላለው ግንኙነት ዝርዝር መረጃ አጋልጧል። ከእነዚህ ንጣፎች ጋር የተያያዘ.

ሁሉም ችግር ያለባቸው ጥገናዎች በአስተዳዳሪዎች አነሳሽነት ውድቅ መሆናቸው ትኩረት የሚስብ ነው ፣ አንድም ንጣፍ አልፀደቀም። ይህ እውነታ ግሬግ ክሮአ-ሃርትማን ይህን ያህል ጨካኝ እርምጃ የወሰደበትን ምክንያት ግልጽ ያደርገዋል፣ ምክንያቱም ተመራማሪዎቹ ጥገናዎቹ በጠባቂዎቹ ቢፀድቁ ምን ያደርጉ እንደነበር ግልፅ ስላልሆነ። በቅድመ-እይታ፣ ስህተትን ሪፖርት ለማድረግ እንዳሰቡ እና ጥገናዎቹ ወደ ጂት እንዲሄዱ እንደማይፈቅዱ ተናግረዋል፣ ነገር ግን ምን ያደርጉ እንደነበር እና ምን ያህል ርቀት ሊሄዱ እንደሚችሉ ግልፅ አይደለም።

ከማይታወቁ አድራሻዎች ጠቅላላ በነሐሴ 2020 [ኢሜል የተጠበቀ] и [ኢሜል የተጠበቀ] (ከጄምስ ቦንድ የተላከ ደብዳቤ) አምስት ጥገናዎች ተልከዋል፡ ሁለት ትክክለኛ (1፣ 2) እና ሶስት የተደበቁ ስህተቶችን (1፣ 2፣ 3) የያዙ፣ ለተጋላጭነት ሁኔታዎችን መፍጠር። እያንዳንዱ ፕላስተር ከ1-4 የኮድ መስመሮችን ብቻ ይዟል። ከተሳሳቱ ፓቸች በስተጀርባ ያለው ዋናው ሀሳብ የማህደረ ትውስታ ፍሰትን ማስተካከል ሁለት ጊዜ ነፃ የተጋላጭነት ሁኔታን ይፈጥራል የሚል ነበር። ከሳምንት በኋላ መረጃ ለከርነል አልሚዎች በፕሮፖዛል ተልኳል ።

የመጀመሪያው ችግር ያለበት ፕላስተር ስህተት ከተፈጠረ መቆጣጠሪያውን ከመመለሱ በፊት ወደ kfree() ጥሪ በማከል የማህደረ ትውስታ ፍንጣቂውን አስተካክሏል፣ ነገር ግን ማህደረ ትውስታው ከተለቀቀ በኋላ ለመድረስ ሁኔታዎችን ፈጥሯል። ይህ ፕላስተር በአስተዳዳሪው (ጂሪ ስላቢ) ውድቅ ተደርጓል፣ ችግሩን በመለየት ከአንድ አመት በፊት አንድ ሰው ቀደም ሲል ተመሳሳይ ለውጥ ለማቅረብ ሞክሯል እና መጀመሪያ ላይ ተቀባይነት ያገኘ ቢሆንም የተጋላጭነት ሁኔታዎችን ካወቀ በኋላ ተጥሏል። > p2 = p1 [n] = kmalloc_array (64, sizeof (u16), GFP_KERNEL); > - ከሆነ (! p2) መመለስ -ENOMEM; > + ከሆነ (!p2) {> + kfree(p1); > + መመለስ -ENOMEM; > +}

ሁለተኛው ጠጋኝ ከጥቅም-ነጻ ለሆነ ችግር ሁኔታዎችንም ይዟል። የተገለጸው ጠጋኝ በአስተዳዳሪው (ዳን አናጺ) ተቀባይነት አላገኘም በ list_add_tail ላይ በሌላ ችግር ምክንያት ንጣፉን ውድቅ አድርጎታል፣ ነገር ግን የ"chdev" ጠቋሚው በ put_device ተግባር ውስጥ ሊለቀቅ እንደሚችል አላስተዋለም፣ በጥሪው ውስጥ ከዚህ በታች ጥቅም ላይ ይውላል። dev_err(&chdev ->dev..)። ነገር ግን, ከተጋላጭነት ጋር ባልተያያዙ ምክንያቶች, ፕላስተር ተቀባይነት አላገኘም. ከሆነ (ret <0) {+ put_device (&chdev-> dev); dev_err (&chdev-> dev, DRV_NAME ": kfifo_alloc አልተሳካም\n"); ret = -ENOMEM; ጎቶ ኤርር_ፊፎ;

ሶስተኛው ጠጋኝ እንዲሁ ከተጋላጭነት ጋር ባልተያያዘ ሌላ ስህተት (ለ pdev ድርብ ጥሪ) በጠባቂው (ሚኬል ሬይናል) ተቀባይነት አላገኘም። ከሆነ (! መስኮት->virt) { printk(KERN_ERR MOD_NAME: ioremap(%08lx, %08lx) አልተሳካም\n", window->phys, window->መጠን); + pci_dev_put(pdev); ወደ ውጭ ወጣ; } ... ከሆነ (! ካርታ) { printk (KERN_ERR MOD_NAME ": kmalloc አልተሳካም"); + pci_dev_put(pdev); ወደ ውጭ ወጣ; } ሜምሴት (ካርታ ፣ 0 ፣ የመጠን (* ካርታ)); ... ከሆነ (mtd_device_register (map-> mtd, NULL, 0)) { map_destroy (map-> mtd); ካርታ-> mtd = NULL; + pci_dev_put(pdev); ወደ ውጭ ወጣ; }

የሚገርመው ነገር፣ ከ 4 ፕላቶች 5ቱ መጀመሪያ ላይ ችግር አለባቸው ተብሎ ይታሰባል፣ ነገር ግን ተመራማሪዎቹ እራሳቸው ስህተት ሠርተዋል እናም ችግር ባለበት በአንድ ፕላስተር ላይ፣ በእነሱ አስተያየት ፣ በነጻ ከተከሰቱ በኋላ ለማስታወስ ጥቅም ላይ የሚውሉ ቅድመ ሁኔታዎች ሳይኖሩበት ትክክለኛ ማስተካከያ ቀርቧል ። err = pci_request_mem_regions(pdev፣ nitrox_driver_name); ከሆነ (ስህተት) {pci_disable_device(pdev); + dev_err (&pdev-> dev, "የሜም ክልሎችን መጠየቅ አልተሳካም!\n"); ተመለስ ስህተት; }

ምንጭ: opennet.ru

አስተያየት ያክሉ