ÄϹ¬NGÓéÀÖ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½á¹¹Ì壬£¬¸Ã½á¹¹ÌåÊÇÍâµØ¸ßËÙ»º´æ£¬£¬Ã¿¸ö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Ö´ÐÐÌáȨ´úÂë¡£¡£¡£¡£ÀÖ³ÉÌáȨºóÈçÏÂËùʾ£º


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