ÓÅ·¢¹ú¼ÊÍøÕ¾¹ÙÍøADLab£ºLinuxÄÚºËCVE-2017-11176Îó²îÆÊÎöÓ븴ÏÖ
Ðû²¼Ê±¼ä 2019-01-04LinuxÄÚºËÖеÄPOSIX ÐÂÎÅÐÐÁÐʵÏÖÖб£´æÒ»¸öUAFÎó²îCVE-2017-11176¡£¹¥»÷Õß¿ÉÒÔʹÓøÃÎó²îµ¼Ö¾ܾø·þÎñ»òÖ´ÐÐí§Òâ´úÂë¡£±¾ÎĽ«´ÓÎó²î³ÉÒò¡¢²¹¶¡ÆÊÎöÒÔ¼°Îó²î¸´Ïֵȶà¸ö½Ç¶È¶Ô¸ÃÎó²î¾ÙÐÐÏêϸÆÊÎö¡£
Îó²îÆÊÎö
PosixÐÂÎÅÐÐÁÐÔÊÐíÒì²½ÊÂÎñ֪ͨ£¬µ±ÍùÒ»¸ö¿ÕÐÐÁа²ÅÅÒ»¸öÐÂÎÅʱ£¬PosixÐÂÎÅÐÐÁÐÔÊÐí±¬·¢Ò»¸öÐźŻòÆô¶¯Ò»¸öÏ̡߳£ÕâÖÖÒì²½ÊÂÎñ֪ͨŲÓÃmq_notifyº¯ÊýʵÏÖ£¬mq_notifyΪָ¶¨ÐÐÁн¨Éè»òɾ³ýÒ첽֪ͨ¡£ÓÉÓÚmq_notifyº¯ÊýÔÚ½øÈëretryÁ÷³ÌʱûÓн«sockÖ¸ÕëÉèÖÃΪNULL£¬¿ÉÄܵ¼ÖÂUAFÎó²î¡£
½ÓÏÂÀ´¿´¿´Îó²îÒòÓÉ£¬ÕâÀïÒÔ4.1.0°æ±¾Ô´ÂëΪÀý¡£
ÔÚmq_notifyº¯ÊýÖУ¬ u_notificationÊÇ´ÓÓû§²ã´«½øÀ´µÄ£¬1193ÐÐÅжÏu_notificationÊÇ·ñΪ¿Õ£¬ÈôÊÇ·Ç¿Õ£¬Í¨¹ýcopy_from_user½«u_notificationÖеÄÊý¾Ý¿½±´µ½notificationÖУ¬ÕâÀォÊý¾Ý´ÓÓû§²ã¿½±´µ½ÁËÄں˲㡣ÈôÊÇ¿½±´Ê§°Ü£¬Ö±½ÓÍ˳ö¡£
½ÓÏÂÀ´£¬ncºÍsock»®·ÖÖÿա£ÐÐ1203£¬ÈôÊÇu_notification²»Îª¿Õ£¬Ê×ÏÈÒÀ´ÎÅжÏnotification.sigev_notify±ØÐèΪSIGEV_NONE»òSIGEV_SIGNAL»òSIGEV_THREAD¡£ÈôÊÇnotification.sigev_notifyΪSIGEV_SIGNAL£¬¾ÍÅжϸÃÐźÅÊÇ·ñÕýµ±¡£
ÐÐ1212£¬ÈôÊÇnotification.sigev_notifyΪSIGEV_THREAD£¬½øÈëÒªº¦´úÂë¿é¡£ÐÐ1216£¬Í¨¹ýalloc_skb½¨ÉèÒ»¸önotify_skb£¬ÓÃÓÚÎüÊÕÊý¾Ý¡£ÐÐ1221£¬Í¨¹ýcopy_from_user½«notification.sigev_value.sival_ptrÖ¸ÏòµÄÊý¾Ý¿½±´µ½nc->dataÖС£ÕâÀï±ØÐèÀֳɣ¬²»È»Ö±½ÓÍ˳ö£»ÐÐ1229£¬Å²ÓÃskb_putÉèÖÃÐÂÎÅÊý¾ÝÍ·²¿¡£ÐÐ1231µ½ÐÐ1248ÊÇretryÑ»·Ìå¡£ÐÐ1232£¬Å²ÓÃfdgetº¯Êý»ñÈ¡ÎļþÐÎò·û¡£ÐÐ1237£¬Å²ÓÃnetlink_getsockbyfilpº¯Êýͨ¹ýÎļþÐÎò·û»ñÈ¡netlink_sock£¬Ïêϸ¿´Ò»ÏÂnetlink_getsockbyfilpº¯Êý¡£
ŲÓÃfile_inodeͨ¹ýfilpÕÒµ½¶ÔÓ¦µÄinode½Úµã£¬È»ºóͨ¹ýSOCK_Iº¯Êý´¦Öóͷ£inode½Úµã¡£
ÕâÀïͨ¹ýºêcontainer_ofÔÚsocket_alloc½á¹¹ÌåÖÐÕÒ³ösocket³ÉÔ±¡£ÕâÀïÚ¹ÊÍһϣ¬SOCKET_I·µ»ØÖµÊÇsocket½á¹¹Ìå¡£×Åʵsock½á¹¹ÌåÖеÚÒ»¸ö³ÉÔ±sock_commonÒ²ÊÇsocketÀàÐÍ£¬ÊÇÒ»¸öÃÔÄã°æsocket¡£
ÏÂÃæ¿´Ò»ÏÂsock_common½á¹¹Ìå¡£
ÐÐ1609£¬»ñÈ¡µ½sockºó£¬È»ºóÅжÏsock->sk_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£ÐÐ1613£¬½Ó×ÅŲÓÃsock_holdÔöÌíÒýÓüÆÊý¡£sock_holdº¯ÊýÈçÏ£º
ÕâÀïatomic_inc¾ÙÐÐsk_refcnt¼Ó1¡£netlink_getsockbyfilpº¯Êý·µ»Øsock£¬ÕâʱsockµÄÒýÓüÆÊý¼Ó1¡£½ÓÏÂÀ´£¬ÐÐ1246£¬Å²ÓÃnetlink_attachskb¡£ÕâÊǸöÒªº¦º¯Êý£¬¸Ãº¯Êý¹¦Ð§Êǽ«skb°ó¶¨µ½netlink socketÉÏ£¬ÏêϸҪº¦´úÂëÈçÏ£º
ÐÐ1683£¬Å²ÓÃsock_putïÔÌÒýÓüÆÊýÒ»´Î£¬×îºóreturn 1£¬º¯Êý·µ»Ø£¬Ö±½Ógotoµ½retry±êÇ©µØ·½¡£
ÕâÀïÐÐ1237ºÍÐÐ1246£¬ÕâÁ½´¦Å²ÓÃÕýºÃ¾ÙÐÐÁËÒýÓüÆÊýµÖÏû¡£ÐÐ1247µÄifÓï¾äÖв¢Ã»Óн«sockÖÿգ¬ÔÙ¿´ÐÐ1233£¬ÈôÊÇf.fileΪ¿Õ£¬ÄǾÍÖ±½Ógotoµ½out±êÇ©¡£out±êÇ©´úÂëÈçÏ£º
ÐÐ1306£¬ÅжÏsockÊÇ·ñΪ¿Õ£¬ÈôÊDz»Îª¿Õ£¬Å²ÓÃnetlink_detachskbº¯Êý¡£
ÊÍ·Åskb£¬²¢ïÔÌskÒýÓüÆÊý£¬¾ÙÐÐÊÍ·Å¡£ ÄÇô¾ÍÓÐÎÊÌâÁË£¬ÈôÊÇÎÒÃǽ¨ÉèAÏ̼߳á³Önetlink_attachskb·µ»Ø1£¬²¢Öظ´retryÂß¼£¬Õâ¸öʱ¼äsockµÄÒýÓüÆÊýÊǼá³ÖƽºâµÄ£¬Ò»¼ÓÒ»¼õ£¬¿ÉÊÇsock²¢²»ÊÇΪ¿Õ¡£Í¬Ê±ÔÙ½¨ÉèBÏß³ÌÈ¥¹Ø±Õnetlink socket¶ÔÓ¦µÄÎļþÐÎò·û¡£ÓÉÓÚBÏ̹߳رÕÁËnetlink socketµÄÎļþÐÎò·û£¬ÄÇAÏß³ÌÔÚretryÂß¼ÖУ¬ÐÐ1232£¬Å²ÓÃfdgetʱ»áʧ°Ü£¬È»ºóÖ±½Ógotoµ½out±êÇ©£¬¾ÙÐÐÊÍ·Å£¬¾ÙÐÐÁ˶þ´ÎÊÍ·Å£¬µ¼ÖÂÎó²î¡£Õâ¸öÎó²îÊÇÊôÓÚÌõ¼þ¾ºÕùÐ͵Ķþ´ÎÊÍ·ÅÎó²î£¬Ö»ÔÚÒ»¸öÏß³ÌÖУ¬ÊÇÎÞ·¨´¥·¢Îó²î¡£
ÐÐ1657£¬Í¨¹ýnlk_skº¯Êýͨ¹ýsk»ñÈ¡netlink_sock¡£ÕâÀïµÄnlk_skÈçÏ¡£
ͨ¹ýŲÓúêcontainer_of»ñÈ¡netlink_sock¡£netlink_sock½á¹¹ÌåÈçÏ£º
netlink_sock½á¹¹ÌåµÚÒ»¸ö³ÉÔ±ÊÇsockÀàÐÍ£¬¶øsock½á¹¹ÌåµÄµÚÒ»¸ö³ÉÔ±ÊÇsocket¡£ÐÐ1660£¬µÚÒ»¸öifÅжϱØÐèµÃ½øÈë¡£
!netlink_skb_is_mmaped(skb)Ò»¶¨·µ»Øtrue£¬Òªº¦ÊÇsk->sk_rmem_alloc>sk->sk_rcvbuf || test_bit(NETLINK_CONGESTED, &nlk->state)Ч¹û±ØÐèÊÇtrue¡£
ÈôÊÇifÅжÏÇ·ºà¹ý£¬½Ó×ÅŲÓÃnetlink_skb_set_owner_rº¯Êý£¬ÈçÏÂËùʾ¡£
ÐÐ878£¬Å²Óúêatomic_add£¬¸ÃºêÖ´ÐÐÔ×Ó¼Ó²Ù×÷¡£ÕâÐдúÂëµÄ¼ÄÒåÊÇ£ºÔÚsk->sk_rmem_allocµÄ»ù´¡ÉϼÓÉÏskb->truesize¡£µÈͬÓÚsk->sk_rmem_alloc += skb->truesize¡£¼ÈÈ»¸Ãº¯ÊýÀïÕâÐдúÂë¿ÉÒÔÖ±½ÓÔöÌísk->sk_rmem_allocµÄ¾Þϸ£¬ÄÇô¿É²»¿ÉÒÔ¶à´ÎŲÓÃnetlink_skb_set_owner_rº¯ÊýÔöÌísk->rmem_allocµÄÖµ£¿ÀíÂÛÉÏÊÇÍêÈ«¿ÉÒԵģ¬¿´¿´ÔõÑù´ÓÓû§²ãµÖ´ïÕâ¸öº¯Êý¡£
ͨ¹ýunderstand¹¤¾ß¿ÉÒÔ¿ìËÙÕÒµ½netlink_skb_set_owner_rµÄŲÓÃÁ´£ºnetlink_sendmsg->netlink_unicast->netlink_attachskb->netlink_skb_set_owner_r¡£
ÐÐ2285£¬Ê×ÏÈÅжÏmsg->msg_flag²»¿ÉΪMSG_OOB£¬¼ÌÐøÍùÏ¿´¡£
ÐÐ2292£¬ÅжÏmsg->msg_namelenµÄ³¤¶È£¬ÕâÀï±ØÐ費Ϊ¿Õ£¬ËäȻҲ²»»áΪ¿Õ¡£½øÈëifºó£¬ÅжÏaddr->nl_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£ÐÐ2299£¬ÅжÏdst_group»òdst_portid²»Îª¿Õ£¬dst_groupÌåÏֶಥģʽ£¬dst_portidÀ´×ÔÓÚaddr->nl_pid£¬Òò´Ë°ü¹Üdst_portid²»Îª¿Õ½ÏÁ¿ÈÝÒס£½ÓÏÂÀ´£º
ÐÐ2320£¬ÅжÏÁËmsg->msg_iter.iov->iov_base²»¿ÉΪ¿Õ¡£²¢ÇÒlen²»¿ÉÒÔ´óÓÚsk->sk_sndbuf-32¡£
×ÅʵÕû¸öº¯ÊýÖУ¬Óû§²ã¿É¿ØµÄÖ»ÓÐÕâô¶à¡£Ö±½Ó¿´netlink_unicastµÄŲÓá£
netlink_unicastº¯ÊýʵÏÖÈçÏ£º
Õû¸öº¯ÊýÖУ¬Óû§ÄÜ¿ØÖƵÄδ¼¸¡£ÐÐ1783£¬ÉèÖÃÁËtimeo£¬ÕâÀïÒª°ü¹ÜnonblockΪmsg->msg_flags&MSG_DONTWAIT£¬ÕâÑùÏ̲߳Ų»»á±»block¡£ÐÐ1790£¬ÅжÏskÊÇ·ñΪÄں˰æµÄsk£¬ÔÚÓû§²ã½¨ÉèsocketʱӦʹÓÃNETLINK_USERSOCK¡£ÐÐ1793£¬ÅжÏÊÇ·ñÓÐsk_filter£¬ÕâÀï°ü¹Ü²»½øÈë¸ÃifÓï¾ä£¬²»ÒªÉèÖùýÂËÆ÷¡£ÐÐ1800£¬Ö±½ÓŲÓÃnetlink_attachskb£¬Àֳɵִïnetlink_skb_set_owner_rº¯Êý¡£ÕâËãÊÇͨ¹ýŲÓÃnetlink_sendmsgÀ´ÔöÌísk->sk_rmem_allocµÄÀú³Ì¡£×ÅʵÎÒÃDz»µ«¿ÉÒÔÔöÌísk->sk_rmem_alloc£¬»¹¿ÉÒÔ¼õСsk->sk_rcvbuf¡£
ÐÐ773£¬sk->sk_rcvbufÈ¡val*2ºÍSOCK_MIN_RCVBUFÖ®¼äµÄ×î´óÖµ¡£ÐÐ755£¬valÈ¡valºÍsysctl_rmem_maxÖ®¼äµÄ×îСֵ¡£ÐÐ749£¬Õâ¸öcaseΪSO_RCVBUF¡£¼ÌÐøÍùÉÏ¿´¡£
ÐÐ693£¬Òª°ü¹Üoptlen²»Ð¡ÓÚsizeof(int)¡£ÐÐ696£¬½«optval¸³Öµµ½valÖУ¬ÕâÀïoptvalÊÇÓû§¿É¿ØµÄ¡£ÐÐ703£¬switch·Ö·¢optname£¬ÒÔÊÇÒª°ü¹ÜoptnameΪSO_RCVBUF¡£ÕâÑù¾Í¿ÉÒÔ°ü¹Ü˳ËìµÖ´ïÐÞ¸Äsk->rcvbufµÄ´úÂë´¦¡£
µ½ÕâÀÎÒÃÇͨ¹ýÁ½ÖÖ·½·¨¾ÙÐÐÈƹýnetlink_attachskbº¯ÊýÖеĵÚÒ»¸öcheck¡£
£¨2£©Í¨¹ýsock_setsockopt¾¡¿ÉÄܵؼõСsk->rcvbufµÄÖµ¡£
Õâ¶Î´úÂë»áÈÃÄ¿½ñÏ߳̽øÈëÆÚ´ý״̬£¬Ö±½Óblock¡£ÈôÊDz»Ïë½øÈëÆÚ´ý״̬£¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD¡£¿ÉÊÇÈôÊÇ°Ñsock_flagÉèÖóÉSOCK_DEAD£¬ÄǺóÃæҲûÓÐÐëÒª¾ÙÐУ¬Òò´ËÕâÀïÊÇÒ»¶¨Òª½øÈëÆÚ´ý״̬µÄ¡£Ò»ÖÖÇÉÃîµÄÒªÁìÊÇÖ±½ÓŲÓÃwake_up_interruptibleÇ¿ÐнÐÐÑÏ̡߳£ÄÇÔõÑùŲÓÃwake_up_interruptibleÄØ£¿º¯ÊýŲÓÃÁ´ºÜÊǼò¶Ì£ºnetlink_setsockopt->wake_up_interruptible¡£
ÐÐ2182£¬Å²ÓÃwake_up_interruptible½ÐÐÑÏ̡߳£ÐÐ2178£¬caseΪNETLINK_NO_ENOBUFS¡£
ÐÐ2131£¬ÅжÏlevel±ØÐèΪSOL_NETLINK£¬ÐÐ2134£¬ÅжÏoptname²»¿ÉΪNETLINK_RX_RINGºÍNETLINK_TX_RING£¬Í¬Ê±°ü¹Üoptlen´óÓÚ¼´ÊÇsizeof(int)¡£ÐÐ2139£¬switch·Ö·¢optname£¬ÕâÀïÒª°ü¹ÜoptnameΪNETLINK_NO_ENOBUFS¡£µ½ÕâÀ»ù±¾ÉϾͿÉÒÔ°ü¹Ünetlink_attachskb·µ»Ø1¡£
ÐÐ1232£¬Í¨¹ýfdget»ñÈ¡notification.sigev_signoµÄfd¡£Notification.sigev_signoÊÇÓû§Ì¬´«½øÀ´µÄ£¬Òò´ËÍêÈ«¿ÉÒÔÔÚÓû§²ãÖ±½ÓcloseÕâ¸ösocket¡£ÔÚÓû§²ãcloseÕâ¸ösocketºó£¬ÐÐ1233£¬½øÈëifÂß¼£¬È»ºóÌøµ½out±êÇ©¡£
Õâ¸öʱ¼äsockÊǷǿյģ¬ifÅжÏΪÕ棬½øÈënetlink_destachskb£¬½ÓמÍÊÇfreeÍ߽⡣
Îó²î¸´ÏÖ
ƾ֤Äں˹¤¾ßÄÚ´æ·ÖÅɹæÔò£¬ netlink_sock¹¤¾ßÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖоÙÐзÖÅÉ¡£
slab·ÖÅÉÆ÷ÔÚ·ÖÅɹ¤¾ßʱ£¬×ñÊغó½øÏȳöµÄ¹æÔò¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷ÊÍÏ°à¾ßµÄÀú³Ì¡£
ÒªÊͷŵŤ¾ßobjp·ÅÔÚÁËac->entry[]µÄ×îºó¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷·ÖÅɹ¤¾ßµÄÀú³Ì£º
·ÖÅɹ¤¾ßÖ±½Ó´Óac->entry[]×îºóµ¯³öÒ»¸ö¹¤¾ß¡£
ÒÔÊÇÒ»¸ö¸Õ¸Õ±»ÊͷŵŤ¾ßÊÇÅÅÔÚÁ´±íÄ©¶Î£¬ÈôÊÇ´ËʱǡÐÒ¿÷ͳһ»º´æÖоÙÐй¤¾ß·ÖÅÉ£¬ÄǸոÕÊͷŵŤ¾ß¾Í»á±»ÖØзÖÅɳöÈ¥£¬Õâ¾Í·ºÆðÁ½¸öÖ¸ÕëÖ¸Ïòͳһ¿éÄÚ´æµØµã¡£ÒªÏë°ü¹ÜÉêÇëµÄÄÚ´æÕýºÃÂäÔÚÎó²î¹¤¾ßµÄÄÚ´æλÖÃÖУ¬ÐèÒªÕÆÎÕס¼¸µã£º
¶ÑÅ繤¾ßʹÓõÄÄں˻º´æÓ¦¸ÃºÍÎó²î¹¤¾ßÄÚ±£´æͳһ¸ö»º´æÖС£¼´¾Þϸ±ØÐèÂäÔÚͳһ¸ökmalloc-XÖС£
ac×Ô¼ºÊÇarray_chche½á¹¹Ì壬¸Ã½á¹¹ÌåÊÇÍâµØ¸ßËÙ»º´æ£¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö£¬ÒÔÊÇ»¹Òª°ü¹Ü¶ÑÅçÉêÇëµÄ¹¤¾ßºÍÎó²î¹¤¾ßÔÚͳһ¸öCPUÍâµØ¸ßËÙ»º´æÖС£
ÈôÊǶÑÅçÉêÇëµÄ¹¤¾ßÖ»ÊǶÌÔÝפÁô£¬µ±¸Ãº¯Êý·µ»Øʱ½«ÉêÇëµÄ¹¤¾ß¾ÙÐÐÁËÊÍ·Å£¬µ¼ÖÂÎÞ·¨×¼È·Õ¼Î»¡£ÒÔÊÇÒªÄÜ°ü¹ÜÉêÇëµÄ¹¤¾ß²»±»ÊÍ·Å£¬ÖÁÉÙ°ü¹ÜÔÚʹÓÃÎó²î¹¤¾ßʱ²»±»ÊÍ·Å£¬ÕâÀïÒª½ÓÄÉפÁôʽÄÚ´æռ룬¿ÉÒÔ½ÓÄÉÈÃijЩϵͳŲÓÃÀú³ÌÛÕ±Õ¡£
slab»º´æËéƬ»¯ÎÊÌ⣬ÕâÀïҪռλµÄ¹¤¾ß¾ÞϸΪ1008£¬¹¤¾ß³ß´ç½ÏÁ¿´ó£¬Õ¼ÓÐËÄ·ÖÖ®Ò»Ò³£¬½ÏÁ¿ÕûÆ룬Ӧ¸ÃûÓÐËéƬ»¯ÎÊÌâ¡£
ÄÇôÔõÑùÅж϶ÑÅçÊÇ·ñÀÖ³ÉÄØ£¿
½ÓÄÉgetsocknameϵͳŲÓûñÈ¡Êý¾Ý£¬getsockname»áŲÓÃnetlink_getname¡£Ïêϸ¿´Ò»ÏÂnetlink_getnameº¯Êý£º
´úÂë1576ÐУ¬½«netlink_sock¹¤¾ßÖеÄportid¸´ÖƸønladdr->nl_pid¡£´úÂë1577ÐУ¬ÈôÊÇnlk->groupΪ0£¬½«nladdr->nl_groups¸³ÖµÎªNULL£¬ÕâÀï×èÖ¹½âÒýÓÃnlk->groupsÖ¸Õ룬ֱ½Ó¿ÉÒÔÔڽṹ¶ÑÅ繤¾ßʱ½«groupsÓòÌîÁã¡£¶ønladdrÊÇ´Óaddrת»»¹ýÀ´µÄ£¬addr¾ÍÊÇ´ÓÓû§²ã´«ÈëµÄ»º³åÇø¡£
ͨ³£ÇéÐÎÊÇÁýÕֽṹÌåÖеĺ¯ÊýÖ¸Õë»òÕß°üÀ¨º¯ÊýÖ¸ÕëµÄ½á¹¹Ìå³ÉÔ±£¬ÕâÊÓÇéÐζø¶¨¡£ÕâÀïÑ¡ÔñÁýÕÖwaitÆÚ´ýÐÐÁС£netlink_sock½á¹¹ÌåÈçÏ£º
wait_queue_haed_t½á¹¹ÌåÈçÏ£º
task_list³ÉÔ±ÊÇÒ»¸öË«ÏòÑ»·Á´±íÍ·£¬task_listÖÐÁ´½ÓµÄÿһ¸ö³ÉÔ±¶¼ÊÇÐèÒª´¦Öóͷ£µÄÆÚ´ýÀý³ÌÔªËØ¡£ÄǸÃÔõÑùʹÓÃÕâ¸ö³ÉÔ±£¿¿´ÈçÏ´úÂë¡£
ÕâÊÇnetlink_setsockoptº¯ÊýÖеĴúÂëƬ¶Ï£¬Ç°Ãæ»Ö¸´Ï̸߳´ÉúÆÊÎö¹ý£¬ÕâÀォ»áŲÓÃnetlink_sock¹¤¾ßÖеÄÆÚ´ýÀý³Ì£¬Ö±½ÓʹÓòÎÊýnlk->wait¡£¼ÌÐøÉîÈëÆÊÎö£º
ŲÓÃ__wake_up_commonº¯Êý£º
´úÂë70ÐУ¬ºêlist_for_each_entry_safe±éÀúq->task_listÖеijÉÔ±£¬·µ»Øµ½curr¡£´úÂë68ÐУ¬currΪwait_queue_tÖ¸Õ룬˵Ã÷q->task_listÁ´±íÖдæµÄÊÇwait_queue_tÀàÐ͵ÄÔªËØ£¬wait_queue_t½á¹¹ÌåÈçÏ£º
wait_queue_t½á¹¹ÌåÖÐÓÐÒ»¸öº¯ÊýÖ¸Õëfunc¡£ÔÙ¿´__wake_up_commonº¯ÊýÖУ¬´úÂë73ÐУ¬Ö±½ÓÖ´ÐÐcurr>funcº¯Êý£¬¿ÉÒÔͨ¹ý½á¹¹__wait_queueµÄfunc²ÎÊý¿ØÖÆRIP¡£ÔٻعýÍ·¿´list_for_each_entry_safeºê£º
posÊÇ__wait_queueÔªËØ£¬´úÂë62ÐУ¬¶Ôpos->member.next¾ÙÐÐÏàʶÒýÓã¬ÕâÀïµÄpos->member¾ÍÊÇ__wait_queueÖеÄtask_list¡£__wait_queueÖеÄtask_listÒ²ÊÇÒ»¸öÁ´±íÍ·£¬ÐèÒªÖ¸ÏòÒ»¸ölist_head£¬ÒÔÊÇ»¹±ØÐèÒª½á¹¹Ò»¸ö¼ÙµÄlist_headÒÔ±ãÓڸúê¾ÙÐнâÒýÓᣲâÊÔÈçÏ£º
½ÓÏÂÀ´¾ÍÊÇͨ¹ýROPÁ´ÈƹýSMEPÖ´ÐÐÌáȨ´úÂë¡£ÀÖ³ÉÌáȨºóÈçÏÂËùʾ£º
