¼øºÚµ£±£Íø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ºÅ