OG¶«·½Ìü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£¬£¬£¬ÄǺóÃæÒ²Ã»ÓбØÒª½øÐУ¬£¬£¬Òò¶øÕâÀïÊDZØÈ»Òª½øÈëÆÚ´ý״̬µÄ¡£Ò»ÖÖÆæÃîµÄ²½ÖèÊÇÖ±½ÓŲÓÃ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½á¹¹Ì壬£¬£¬¸Ã½á¹¹ÌåÊDZ¾µØ¸ßËÙ»º´æ£¬£¬£¬Ã¿¸ö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ÖÐÁ´½ÓµÄÿһ¸ö³ÉÔ±¶¼ÊDZØÒª´¦ÖÃµÄÆÚ´ýÀý³ÌÔªËØ¡£ÄǸÃÈôºÎʹÓÃÕâ¸ö³ÉÔ±£¿£¿£¿¿´ÈçÏ´úÂë¡£
ÕâÊÇ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Ö´ÐÐÌáȨ´úÂë¡£³É¹¦ÌáȨºóÈçÏÂËùʾ£º£º


¾©¹«Íø°²±¸11010802024551ºÅ