¼øºÚµ£±£Íø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¼´¿É ¡£¡£ ¡£¡£¡£¡£¡£


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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

¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


ÔÚNetlink_setsockoptº¯ÊýÖУº


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


ÐÐ2182£¬£¬£¬Å²ÓÃwake_up_interruptible½ÐÐÑÏß³Ì ¡£¡£ ¡£¡£¡£¡£¡£ÐÐ2178£¬£¬£¬caseΪNETLINK_NO_ENOBUFS ¡£¡£ ¡£¡£¡£¡£¡£


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


Îó²î¸´ÏÖ


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


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


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


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


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


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


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


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


ŲÓÃ__wake_up_commonº¯Êý£º


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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


¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨


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

¼øºÚµ£±£Íø(jhdbw)¡¤×î¾ßȨÍþΨһάȨµ£±£Æ½Ì¨