¿­Ê±K66ADLab£º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¼´¿É¡£¡£¡£


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÊÍ·Å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µÄʵÏÖ¡£¡£¡£


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


!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¸üΪÀû±ã£¬£¬£¬£¬£¬£¬´úÂëÈçÏ¡£¡£¡£


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ͨ¹ý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º¯ÊýʵÏÖÈçÏ¡£¡£¡£


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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

¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÐÐ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Óï¾äºó£¬£¬£¬£¬£¬£¬¿´ÈçÏ´úÂ룺


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


ÔÚNetlink_setsockoptº¯ÊýÖУº


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÐÐ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£¬£¬£¬£¬£¬£¬´úÂëÈçÏ£º


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


Îó²î¸´ÏÖ


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


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


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


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


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


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


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


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ŲÓÃ__wake_up_commonº¯Êý£º


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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

¿­Ê±K66¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾