Z6×ðÁú¿­Ê±ADLab£ºLinuxÄÚºËCVE-2017-11176Îó²îÆÊÎöÓ븴ÏÖ

Ðû²¼Ê±¼ä 2019-01-04
Îó²îÅä¾°

LinuxÄÚºËÖеÄPOSIX ÐÂÎÅÐÐÁÐʵÏÖÖб£´æÒ»¸öUAFÎó²îCVE-2017-11176¡£¡£¡£¡£¹¥»÷Õß¿ÉÒÔʹÓøÃÎó²îµ¼Ö¾ܾøÐ§ÀÍ»òÖ´ÐÐí§Òâ´úÂë¡£¡£¡£¡£±¾ÎĽ«´ÓÎó²î³ÉÒò¡¢²¹¶¡ÆÊÎöÒÔ¼°Îó²î¸´Ïֵȶà¸ö½Ç¶È¶Ô¸ÃÎó²î¾ÙÐÐÏêϸÆÊÎö¡£¡£¡£¡£

Îó²îÆÊÎö


PosixÐÂÎÅÐÐÁÐÔÊÐíÒì²½ÊÂÎñ֪ͨ£¬ £¬£¬£¬µ±ÍùÒ»¸ö¿ÕÐÐÁа²ÅÅÒ»¸öÐÂÎÅʱ£¬ £¬£¬£¬PosixÐÂÎÅÐÐÁÐÔÊÐí±¬·¢Ò»¸öÐźŻòÆô¶¯Ò»¸öÏ̡߳£¡£¡£¡£ÕâÖÖÒì²½ÊÂÎñ֪ͨŲÓÃmq_notifyº¯ÊýʵÏÖ£¬ £¬£¬£¬mq_notifyΪָ¶¨ÐÐÁн¨Éè»òɾ³ýÒ첽֪ͨ¡£¡£¡£¡£ÓÉÓÚmq_notifyº¯ÊýÔÚ½øÈëretryÁ÷³ÌʱûÓн«sockÖ¸ÕëÉèÖÃΪNULL£¬ £¬£¬£¬¿ÉÄܵ¼ÖÂUAFÎó²î¡£¡£¡£¡£


´Ó²¹¶¡´úÂë¿ÉÖª£¬ £¬£¬£¬½«sockÉèÖÃΪNULL¼´¿É¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


½ÓÏÂÀ´¿´¿´Îó²îÒòÓÉ£¬ £¬£¬£¬ÕâÀïÒÔ4.1.0°æ±¾Ô´ÂëΪÀý¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÔÚmq_notifyº¯ÊýÖУ¬ £¬£¬£¬ u_notificationÊÇ´ÓÓû§²ã´«½øÀ´µÄ£¬ £¬£¬£¬1193ÐÐÅжÏu_notificationÊÇ·ñΪ¿Õ£¬ £¬£¬£¬ÈôÊǷǿգ¬ £¬£¬£¬Í¨¹ýcopy_from_user½«u_notificationÖеÄÊý¾Ý¿½±´µ½notificationÖУ¬ £¬£¬£¬ÕâÀォÊý¾Ý´ÓÓû§²ã¿½±´µ½ÁËÄں˲㡣¡£¡£¡£ÈôÊÇ¿½±´Ê§°Ü£¬ £¬£¬£¬Ö±½ÓÍ˳ö¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


½ÓÏÂÀ´£¬ £¬£¬£¬ncºÍsock»®·ÖÖÿա£¡£¡£¡£ÐÐ1203£¬ £¬£¬£¬ÈôÊÇu_notification²»Îª¿Õ£¬ £¬£¬£¬Ê×ÏÈÒÀ´ÎÅжÏnotification.sigev_notify±ØÐèΪSIGEV_NONE»òSIGEV_SIGNAL»òSIGEV_THREAD¡£¡£¡£¡£ÈôÊÇnotification.sigev_notifyΪSIGEV_SIGNAL£¬ £¬£¬£¬¾ÍÅжϸÃÐźÅÊÇ·ñÕýµ±¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ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º¯Êý¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ŲÓÃfile_inodeͨ¹ýfilpÕÒµ½¶ÔÓ¦µÄinode½Úµã£¬ £¬£¬£¬È»ºóͨ¹ýSOCK_Iº¯Êý´¦Öóͷ£inode½Úµã¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÕâÀïͨ¹ýºêcontainer_ofÔÚsocket_alloc½á¹¹ÌåÖÐÕÒ³ösocket³ÉÔ±¡£¡£¡£¡£ÕâÀïÚ¹ÊÍһϣ¬ £¬£¬£¬SOCKET_I·µ»ØÖµÊÇsocket½á¹¹Ìå¡£¡£¡£¡£×Åʵsock½á¹¹ÌåÖеÚÒ»¸ö³ÉÔ±sock_commonÒ²ÊÇsocketÀàÐÍ£¬ £¬£¬£¬ÊÇÒ»¸öÃÔÄã°æsocket¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÏÂÃæ¿´Ò»ÏÂsock_common½á¹¹Ìå¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ1609£¬ £¬£¬£¬»ñÈ¡µ½sockºó£¬ £¬£¬£¬È»ºóÅжÏsock->sk_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£¡£¡£¡£ÐÐ1613£¬ £¬£¬£¬½Ó×ÅŲÓÃsock_holdÔöÌíÒýÓüÆÊý¡£¡£¡£¡£sock_holdº¯ÊýÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÕâÀïatomic_inc¾ÙÐÐsk_refcnt¼Ó1¡£¡£¡£¡£netlink_getsockbyfilpº¯Êý·µ»Øsock£¬ £¬£¬£¬ÕâʱsockµÄÒýÓüÆÊý¼Ó1¡£¡£¡£¡£½ÓÏÂÀ´£¬ £¬£¬£¬ÐÐ1246£¬ £¬£¬£¬Å²ÓÃnetlink_attachskb¡£¡£¡£¡£ÕâÊǸöÒªº¦º¯Êý£¬ £¬£¬£¬¸Ãº¯Êý¹¦Ð§Êǽ«skb°ó¶¨µ½netlink socketÉÏ£¬ £¬£¬£¬ÏêϸҪº¦´úÂëÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ1683£¬ £¬£¬£¬Å²ÓÃsock_putïÔÌ­ÒýÓüÆÊýÒ»´Î£¬ £¬£¬£¬×îºóreturn 1£¬ £¬£¬£¬º¯Êý·µ»Ø£¬ £¬£¬£¬Ö±½Ógotoµ½retry±êÇ©µØ·½¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÕâÀïÐÐ1237ºÍÐÐ1246£¬ £¬£¬£¬ÕâÁ½´¦Å²ÓÃÕýºÃ¾ÙÐÐÁËÒýÓüÆÊýµÖÏû¡£¡£¡£¡£ÐÐ1247µÄifÓï¾äÖв¢Ã»Óн«sockÖÿÕ£¬ £¬£¬£¬ÔÙ¿´ÐÐ1233£¬ £¬£¬£¬ÈôÊÇf.fileΪ¿Õ£¬ £¬£¬£¬ÄǾÍÖ±½Ógotoµ½out±êÇ©¡£¡£¡£¡£out±êÇ©´úÂëÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ1306£¬ £¬£¬£¬ÅжÏsockÊÇ·ñΪ¿Õ£¬ £¬£¬£¬ÈôÊDz»Îª¿Õ£¬ £¬£¬£¬Å²ÓÃnetlink_detachskbº¯Êý¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÊÍ·Åskb£¬ £¬£¬£¬²¢ïÔÌ­skÒýÓüÆÊý£¬ £¬£¬£¬¾ÙÐÐÊÍ·Å¡£¡£¡£¡£ ÄÇô¾ÍÓÐÎÊÌâÁË£¬ £¬£¬£¬ÈôÊÇÎÒÃǽ¨ÉèAÏ̼߳á³Önetlink_attachskb·µ»Ø1£¬ £¬£¬£¬²¢Öظ´retryÂß¼­£¬ £¬£¬£¬Õâ¸öʱ¼äsockµÄÒýÓüÆÊýÊǼá³ÖƽºâµÄ£¬ £¬£¬£¬Ò»¼ÓÒ»¼õ£¬ £¬£¬£¬¿ÉÊÇsock²¢²»ÊÇΪ¿Õ¡£¡£¡£¡£Í¬Ê±ÔÙ½¨ÉèBÏß³ÌÈ¥¹Ø±Õnetlink socket¶ÔÓ¦µÄÎļþÐÎò·û¡£¡£¡£¡£ÓÉÓÚBÏ̹߳رÕÁËnetlink socketµÄÎļþÐÎò·û£¬ £¬£¬£¬ÄÇAÏß³ÌÔÚretryÂß¼­ÖУ¬ £¬£¬£¬ÐÐ1232£¬ £¬£¬£¬Å²ÓÃfdgetʱ»áʧ°Ü£¬ £¬£¬£¬È»ºóÖ±½Ógotoµ½out±êÇ©£¬ £¬£¬£¬¾ÙÐÐÊÍ·Å£¬ £¬£¬£¬¾ÙÐÐÁ˶þ´ÎÊÍ·Å£¬ £¬£¬£¬µ¼ÖÂÎó²î¡£¡£¡£¡£Õâ¸öÎó²îÊÇÊôÓÚÌõ¼þ¾ºÕùÐ͵Ķþ´ÎÊÍ·ÅÎó²î£¬ £¬£¬£¬Ö»ÔÚÒ»¸öÏß³ÌÖУ¬ £¬£¬£¬ÊÇÎÞ·¨´¥·¢Îó²î¡£¡£¡£¡£


Õâ¸öÎó²îÔ­Àí½ÏÁ¿¼òÆÓ£¬ £¬£¬£¬¿ÉÊÇÔõÑù´¥·¢Õâ¸öÎó²îÕվɽÏÁ¿Öش󡣡£¡£¡£Ê×ÏÈ£¬ £¬£¬£¬ÔõÑùÈÃnetlink_attachskb·µ»Ø1£¬ £¬£¬£¬´Ó¶øË³Ëì½øÈëretryÂß¼­¡£¡£¡£¡£Ôٴλؿ´netlink_attachskbµÄʵÏÖ¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ1657£¬ £¬£¬£¬Í¨¹ýnlk_skº¯Êýͨ¹ýsk»ñÈ¡netlink_sock¡£¡£¡£¡£ÕâÀïµÄnlk_skÈçÏ¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ͨ¹ýŲÓúêcontainer_of»ñÈ¡netlink_sock¡£¡£¡£¡£netlink_sock½á¹¹ÌåÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


netlink_sock½á¹¹ÌåµÚÒ»¸ö³ÉÔ±ÊÇsockÀàÐÍ£¬ £¬£¬£¬¶øsock½á¹¹ÌåµÄµÚÒ»¸ö³ÉÔ±ÊÇsocket¡£¡£¡£¡£ÐÐ1660£¬ £¬£¬£¬µÚÒ»¸öifÅжϱØÐèµÃ½øÈë¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


!netlink_skb_is_mmaped(skb)¿Ï¶¨·µ»Øtrue£¬ £¬£¬£¬Òªº¦ÊÇsk->sk_rmem_alloc>sk->sk_rcvbuf || test_bit(NETLINK_CONGESTED, &nlk->state)Ч¹û±ØÐèÊÇtrue¡£¡£¡£¡£


ÕâÀïͨ¹ýÉèÖÃsk->sk_rmem_allocµÄ¾ÞÏ¸ÈÆ¹ýcheck¸üΪÀû±ã£¬ £¬£¬£¬´úÂëÈçÏ¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÈôÊÇifÅжÏÇ·ºà¹ý£¬ £¬£¬£¬½Ó×ÅŲÓÃnetlink_skb_set_owner_rº¯Êý£¬ £¬£¬£¬ÈçÏÂËùʾ¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ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µÄÖµ£¿£¿£¿ÀíÂÛÉÏÊÇÍêÈ«¿ÉÒԵģ¬ £¬£¬£¬¿´¿´ÔõÑù´ÓÓû§²ãµÖ´ïÕâ¸öº¯Êý¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ͨ¹ýunderstand¹¤¾ß¿ÉÒÔ¿ìËÙÕÒµ½netlink_skb_set_owner_rµÄŲÓÃÁ´£ºnetlink_sendmsg->netlink_unicast->netlink_attachskb->netlink_skb_set_owner_r¡£¡£¡£¡£


ÔõÑù˳ËìµÄͨ¹ýº¯ÊýŲÓ÷¾¶£¿£¿£¿ÕâÀïÐèÒªÆÊÎöÔõÑù´Ónetlink_sendmsgµÖ´ïnetlink_skb_set_owner_r¡£¡£¡£¡£netlink_sendmsgº¯ÊýʵÏÖÈçÏ¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ2285£¬ £¬£¬£¬Ê×ÏÈÅжÏmsg->msg_flag²»¿ÉΪMSG_OOB£¬ £¬£¬£¬¼ÌÐøÍùÏ¿´¡£¡£¡£¡£

Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ2292£¬ £¬£¬£¬ÅжÏmsg->msg_namelenµÄ³¤¶È£¬ £¬£¬£¬ÕâÀï±ØÐ費Ϊ¿Õ£¬ £¬£¬£¬ËäȻҲ²»»áΪ¿Õ¡£¡£¡£¡£½øÈëifºó£¬ £¬£¬£¬ÅжÏaddr->nl_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£¡£¡£¡£ÐÐ2299£¬ £¬£¬£¬ÅжÏdst_group»òdst_portid²»Îª¿Õ£¬ £¬£¬£¬dst_groupÌåÏֶಥģʽ£¬ £¬£¬£¬dst_portidÀ´×ÔÓÚaddr->nl_pid£¬ £¬£¬£¬Òò´Ë°ü¹Üdst_portid²»Îª¿Õ½ÏÁ¿ÈÝÒס£¡£¡£¡£½ÓÏÂÀ´£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ2320£¬ £¬£¬£¬ÅжÏÁËmsg->msg_iter.iov->iov_base²»¿ÉΪ¿Õ¡£¡£¡£¡£²¢ÇÒlen²»¿ÉÒÔ´óÓÚsk->sk_sndbuf-32¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


×ÅʵÕû¸öº¯ÊýÖУ¬ £¬£¬£¬Óû§²ã¿É¿ØµÄÖ»ÓÐÕâô¶à¡£¡£¡£¡£Ö±½Ó¿´netlink_unicastµÄŲÓᣡ£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


netlink_unicastº¯ÊýʵÏÖÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


Õû¸öº¯ÊýÖУ¬ £¬£¬£¬Óû§ÄÜ¿ØÖƵÄδ¼¸¡£¡£¡£¡£ÐÐ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¡£¡£¡£¡£


ÄÇôÔõÑù¼õСsk->sk_rcvbuf£¿£¿£¿ÔÚsetsockoptº¯ÊýÖУ¬ £¬£¬£¬ÕÒµ½sock_setsockoptº¯ÊýÖжÔsk->sk_rcvbufµÄ²Ù×÷¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ773£¬ £¬£¬£¬sk->sk_rcvbufÈ¡val*2ºÍSOCK_MIN_RCVBUFÖ®¼äµÄ×î´óÖµ¡£¡£¡£¡£ÐÐ755£¬ £¬£¬£¬valÈ¡valºÍsysctl_rmem_maxÖ®¼äµÄ×îСֵ¡£¡£¡£¡£ÐÐ749£¬ £¬£¬£¬Õâ¸öcaseΪSO_RCVBUF¡£¡£¡£¡£¼ÌÐøÍùÉÏ¿´¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ693£¬ £¬£¬£¬Òª°ü¹Üoptlen²»Ð¡ÓÚsizeof(int)¡£¡£¡£¡£ÐÐ696£¬ £¬£¬£¬½«optval¸³Öµµ½valÖУ¬ £¬£¬£¬ÕâÀïoptvalÊÇÓû§¿É¿ØµÄ¡£¡£¡£¡£ÐÐ703£¬ £¬£¬£¬switch·Ö·¢optname£¬ £¬£¬£¬ÒÔÊÇÒª°ü¹ÜoptnameΪSO_RCVBUF¡£¡£¡£¡£ÕâÑù¾Í¿ÉÒÔ°ü¹Ü˳ËìµÖ´ïÐÞ¸Äsk->rcvbufµÄ´úÂë´¦¡£¡£¡£¡£

µ½ÕâÀ £¬£¬£¬ÎÒÃÇͨ¹ýÁ½ÖÖ·½·¨¾ÙÐÐÈÆ¹ýnetlink_attachskbº¯ÊýÖеĵÚÒ»¸öcheck¡£¡£¡£¡£


£¨1£©Í¨¹ýnetlink_sendmsgÔöÌísk->sk_rmem_allocµÄÖµ.

£¨2£©Í¨¹ýsock_setsockopt¾¡¿ÉÄܵؼõСsk->rcvbufµÄÖµ¡£¡£¡£¡£


½øÈëifÓï¾äºó£¬ £¬£¬£¬¿´ÈçÏ´úÂ룺


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


Õâ¶Î´úÂë»áÈÃÄ¿½ñÏ߳̽øÈëÆÚ´ý״̬£¬ £¬£¬£¬Ö±½Óblock¡£¡£¡£¡£ÈôÊDz»Ïë½øÈëÆÚ´ý״̬£¬ £¬£¬£¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD¡£¡£¡£¡£¿ÉÊÇÈôÊǰÑsock_flagÉèÖóÉSOCK_DEAD£¬ £¬£¬£¬ÄǺóÃæÒ²Ã»ÓÐÐëÒª¾ÙÐУ¬ £¬£¬£¬Òò´ËÕâÀïÊDZض¨Òª½øÈëÆÚ´ý״̬µÄ¡£¡£¡£¡£Ò»ÖÖÇÉÃîµÄÒªÁìÊÇÖ±½ÓŲÓÃwake_up_interruptibleÇ¿ÐнÐÐÑÏ̡߳£¡£¡£¡£ÄÇÔõÑùŲÓÃwake_up_interruptibleÄØ£¿£¿£¿º¯ÊýŲÓÃÁ´ºÜÊǼò¶Ì£ºnetlink_setsockopt->wake_up_interruptible¡£¡£¡£¡£


ÔÚNetlink_setsockoptº¯ÊýÖУº


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ2182£¬ £¬£¬£¬Å²ÓÃwake_up_interruptible½ÐÐÑÏ̡߳£¡£¡£¡£ÐÐ2178£¬ £¬£¬£¬caseΪNETLINK_NO_ENOBUFS¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ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¡£¡£¡£¡£


°ü¹Ü½øÈëretryÑ­»·ºó£¬ £¬£¬£¬Õâ¸öʱ¼äsockÒѾ­²»Îª¿Õ¡£¡£¡£¡£½ÓÏÂÀ´ÒªÊ¹retryÑ­»·ÖÐÍÉ»¯£¬ £¬£¬£¬Ö±½ÓÌø×ªµ½out£¬ £¬£¬£¬´úÂëÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÐÐ1232£¬ £¬£¬£¬Í¨¹ýfdget»ñÈ¡notification.sigev_signoµÄfd¡£¡£¡£¡£Notification.sigev_signoÊÇÓû§Ì¬´«½øÀ´µÄ£¬ £¬£¬£¬Òò´ËÍêÈ«¿ÉÒÔÔÚÓû§²ãÖ±½ÓcloseÕâ¸ösocket¡£¡£¡£¡£ÔÚÓû§²ãcloseÕâ¸ösocketºó£¬ £¬£¬£¬ÐÐ1233£¬ £¬£¬£¬½øÈëifÂß¼­£¬ £¬£¬£¬È»ºóÌøµ½out±êÇ©¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


Õâ¸öʱ¼äsockÊǷǿյÄ£¬ £¬£¬£¬ifÅжÏÎªÕæ£¬ £¬£¬£¬½øÈënetlink_destachskb£¬ £¬£¬£¬½ÓמÍÊÇfreeÍ߽⡣¡£¡£¡£


Îó²î¸´ÏÖ


¹ØÓÚUAFÀàÐ͵ÄÎó²î£¬ £¬£¬£¬Í¨ÓÃÒªÁì¾ÍÊÇʹÓöÑÅçÉäռλ¡£¡£¡£¡£±¾´ÎÎó²îÖб»¶à´ÎÊͷŵŤ¾ßÊÇnetlink_sock¹¤¾ß¡£¡£¡£¡£netlink_sock¹¤¾ß¾ÞϸΪ0x3f0×Ö½Ú£¬ £¬£¬£¬¼´ÊÇ1008byte¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ƾ֤Äں˹¤¾ßÄÚ´æ·ÖÅɹæÔò£¬ £¬£¬£¬ netlink_sock¹¤¾ßÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖоÙÐзÖÅÉ¡£¡£¡£¡£
slab·ÖÅÉÆ÷ÔÚ·ÖÅɹ¤¾ßʱ£¬ £¬£¬£¬×ñÊØºó½øÏȳöµÄ¹æÔò¡£¡£¡£¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷ÊÍϰà¾ßµÄÀú³Ì¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÒªÊͷŵŤ¾ßobjp·ÅÔÚÁËac->entry[]µÄ×îºó¡£¡£¡£¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷·ÖÅɹ¤¾ßµÄÀú³Ì£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


·ÖÅɹ¤¾ßÖ±½Ó´Óac->entry[]×îºóµ¯³öÒ»¸ö¹¤¾ß¡£¡£¡£¡£


ÒÔÊÇÒ»¸ö¸Õ¸Õ±»ÊͷŵŤ¾ßÊÇÅÅÔÚÁ´±íÄ©¶Î£¬ £¬£¬£¬ÈôÊÇ´ËʱǡÐÒ¿÷ͳһ»º´æÖоÙÐй¤¾ß·ÖÅÉ£¬ £¬£¬£¬ÄǸոÕÊͷŵŤ¾ß¾Í»á±»ÖØÐ·ÖÅɳöÈ¥£¬ £¬£¬£¬Õâ¾Í·ºÆðÁ½¸öÖ¸ÕëÖ¸Ïòͳһ¿éÄÚ´æµØµã¡£¡£¡£¡£ÒªÏë°ü¹ÜÉêÇëµÄÄÚ´æÕýºÃÂäÔÚÎó²î¹¤¾ßµÄÄÚ´æÎ»ÖÃÖУ¬ £¬£¬£¬ÐèÒªÕÆÎÕס¼¸µã£º


¶ÑÅ繤¾ßʹÓõÄÄں˻º´æÓ¦¸ÃºÍÎó²î¹¤¾ßÄÚ±£´æÍ³Ò»¸ö»º´æÖС£¡£¡£¡£¼´¾Þϸ±ØÐèÂäÔÚͳһ¸ökmalloc-XÖС£¡£¡£¡£


ac×Ô¼ºÊÇarray_chche½á¹¹Ì壬 £¬£¬£¬¸Ã½á¹¹ÌåÊÇÍâµØ¸ßËÙ»º´æ£¬ £¬£¬£¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö£¬ £¬£¬£¬ÒÔÊÇ»¹Òª°ü¹Ü¶ÑÅçÉêÇëµÄ¹¤¾ßºÍÎó²î¹¤¾ßÔÚͳһ¸öCPUÍâµØ¸ßËÙ»º´æÖС£¡£¡£¡£


ÈôÊǶÑÅçÉêÇëµÄ¹¤¾ßÖ»ÊǶÌÔÝפÁô£¬ £¬£¬£¬µ±¸Ãº¯Êý·µ»ØÊ±½«ÉêÇëµÄ¹¤¾ß¾ÙÐÐÁËÊÍ·Å£¬ £¬£¬£¬µ¼ÖÂÎÞ·¨×¼È·Õ¼Î»¡£¡£¡£¡£ÒÔÊÇÒªÄܰü¹ÜÉêÇëµÄ¹¤¾ß²»±»ÊÍ·Å£¬ £¬£¬£¬ÖÁÉÙ°ü¹ÜÔÚʹÓÃÎó²î¹¤¾ßʱ²»±»ÊÍ·Å£¬ £¬£¬£¬ÕâÀïÒª½ÓÄÉפÁôʽÄÚ´æÕ¼Î»£¬ £¬£¬£¬¿ÉÒÔ½ÓÄÉÈÃijЩϵͳŲÓÃÀú³ÌÛÕ±Õ¡£¡£¡£¡£


slab»º´æË鯬»¯ÎÊÌ⣬ £¬£¬£¬ÕâÀïҪռλµÄ¹¤¾ß¾ÞϸΪ1008£¬ £¬£¬£¬¹¤¾ß³ß´ç½ÏÁ¿´ó£¬ £¬£¬£¬Õ¼ÓÐËÄ·ÖÖ®Ò»Ò³£¬ £¬£¬£¬½ÏÁ¿ÕûÆë£¬ £¬£¬£¬Ó¦¸ÃûÓÐË鯬»¯ÎÊÌâ¡£¡£¡£¡£


ÄÇôÔõÑùÅж϶ÑÅçÊÇ·ñÀÖ³ÉÄØ£¿£¿£¿


ͨÓÃÇéÐÎÏ£¬ £¬£¬£¬ÔÚ¾ÙÐжÑÅçʱ¼ä£¬ £¬£¬£¬½á¹¹¶ÑÅ繤¾ßʱ£¬ £¬£¬£¬ÓÐÐëÒªÔÚ¶ÔÓ¦Îó²î¹¤¾ßµÄÒ»Ð©ÌØÊâ³ÉÔ±ÓòµÄÄÚ´æÆ«ÒÆ´¦ÉèÖÃmagic value£¬ £¬£¬£¬È»ºó¿ÉÒÔ½ÓÄÉϵͳŲÓÃÈ¥»ñÈ¡Îó²î¹¤¾ßÖÐÏà¹ØÊý¾Ý¾ÙÐÐÅжϡ£¡£¡£¡£netlink_sock½á¹¹Ì弸¸öÒªº¦µÄ³ÉÔ±ÈçÏ¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


½ÓÄÉgetsocknameϵͳŲÓûñÈ¡Êý¾Ý£¬ £¬£¬£¬getsockname»áŲÓÃnetlink_getname¡£¡£¡£¡£Ïêϸ¿´Ò»ÏÂnetlink_getnameº¯Êý£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


´úÂë1576ÐУ¬ £¬£¬£¬½«netlink_sock¹¤¾ßÖеÄportid¸´ÖƸønladdr->nl_pid¡£¡£¡£¡£´úÂë1577ÐУ¬ £¬£¬£¬ÈôÊÇnlk->groupΪ0£¬ £¬£¬£¬½«nladdr->nl_groups¸³ÖµÎªNULL£¬ £¬£¬£¬ÕâÀï×èÖ¹½âÒýÓÃnlk->groupsÖ¸Õ룬 £¬£¬£¬Ö±½Ó¿ÉÒÔÔڽṹ¶ÑÅ繤¾ßʱ½«groupsÓòÌîÁã¡£¡£¡£¡£¶ønladdrÊÇ´Óaddrת»»¹ýÀ´µÄ£¬ £¬£¬£¬addr¾ÍÊÇ´ÓÓû§²ã´«ÈëµÄ»º³åÇø¡£¡£¡£¡£


¶ÑÅçÀÖ³ÉÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ͨ³£ÇéÐÎÊÇÁýÕֽṹÌåÖеĺ¯ÊýÖ¸Õë»òÕß°üÀ¨º¯ÊýÖ¸ÕëµÄ½á¹¹Ìå³ÉÔ±£¬ £¬£¬£¬ÕâÊÓÇéÐζø¶¨¡£¡£¡£¡£ÕâÀïÑ¡ÔñÁýÕÖwaitÆÚ´ýÐÐÁС£¡£¡£¡£netlink_sock½á¹¹ÌåÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


wait_queue_haed_t½á¹¹ÌåÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


task_list³ÉÔ±ÊÇÒ»¸öË«ÏòÑ­»·Á´±íÍ·£¬ £¬£¬£¬task_listÖÐÁ´½ÓµÄÿһ¸ö³ÉÔ±¶¼ÊÇÐèÒª´¦Öóͷ£µÄÆÚ´ýÀý³ÌÔªËØ¡£¡£¡£¡£ÄǸÃÔõÑùʹÓÃÕâ¸ö³ÉÔ±£¿£¿£¿¿´ÈçÏ´úÂë¡£¡£¡£¡£


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ÕâÊÇnetlink_setsockoptº¯ÊýÖеĴúÂëÆ¬¶Ï£¬ £¬£¬£¬Ç°Ãæ»Ö¸´Ï̸߳´ÉúÆÊÎö¹ý£¬ £¬£¬£¬ÕâÀォ»áŲÓÃnetlink_sock¹¤¾ßÖÐµÄÆÚ´ýÀý³Ì£¬ £¬£¬£¬Ö±½ÓʹÓòÎÊýnlk->wait¡£¡£¡£¡£¼ÌÐøÉîÈëÆÊÎö£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


ŲÓÃ__wake_up_commonº¯Êý£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


´úÂë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½á¹¹ÌåÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


wait_queue_t½á¹¹ÌåÖÐÓÐÒ»¸öº¯ÊýÖ¸Õëfunc¡£¡£¡£¡£ÔÙ¿´__wake_up_commonº¯ÊýÖУ¬ £¬£¬£¬´úÂë73ÐУ¬ £¬£¬£¬Ö±½ÓÖ´ÐÐcurr>funcº¯Êý£¬ £¬£¬£¬¿ÉÒÔͨ¹ý½á¹¹__wait_queueµÄfunc²ÎÊý¿ØÖÆRIP¡£¡£¡£¡£ÔٻعýÍ·¿´list_for_each_entry_safeºê£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


posÊÇ__wait_queueÔªËØ£¬ £¬£¬£¬´úÂë62ÐУ¬ £¬£¬£¬¶Ôpos->member.next¾ÙÐÐÏàʶÒýÓ㬠£¬£¬£¬ÕâÀïµÄpos->member¾ÍÊÇ__wait_queueÖеÄtask_list¡£¡£¡£¡£__wait_queueÖеÄtask_listÒ²ÊÇÒ»¸öÁ´±íÍ·£¬ £¬£¬£¬ÐèÒªÖ¸ÏòÒ»¸ölist_head£¬ £¬£¬£¬ÒÔÊÇ»¹±ØÐèÒª½á¹¹Ò»¸ö¼ÙµÄlist_headÒÔ±ãÓڸúê¾ÙÐнâÒýÓᣡ£¡£¡£²âÊÔÈçÏ£º


Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾


½ÓÏÂÀ´¾ÍÊÇͨ¹ýROPÁ´ÈƹýSMEPÖ´ÐÐÌáȨ´úÂë¡£¡£¡£¡£ÀÖ³ÉÌáȨºóÈçÏÂËùʾ£º

Z6¡¤×ðÁú¿­Ê±¡¸ÖйúÇø¡¹¹Ù·½ÍøÕ¾