918²©ÌìÌÃ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¼´¿É¡£ ¡£ ¡£¡£


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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

918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


ÔÚNetlink_setsockoptº¯ÊýÖУº


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


Îó²î¸´ÏÖ


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


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


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


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


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


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


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


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


ŲÓÃ__wake_up_commonº¯Êý£º


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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


918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾


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

918²©ÌìÌÃ(ÖйúÓÎ)×îйٷ½ÍøÕ¾