±¦ÔËÀ³¹Ù·½ÍøÕ¾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¼´¿É ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


½ÓÏÂÀ´¿´¿´·ì϶ÆðÒò£¬ÕâÀïÒÔ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±êÇ©£¬½øÐпªÊÍ£¬½øÐÐÁ˶þ´Î¿ªÊÍ£¬µ¼Ö·ì϶ ¡£Õâ¸ö·ì϶ÊÇÊôÓÚǰÌᾺÕùÐ͵Ķþ´Î¿ªÊÍ·ì϶£¬Ö»ÔÚÒ»¸öÏß³ÌÖУ¬ÊÇÎÞ·¨´¥·¢·ì϶ ¡£


Õâ¸ö·ì϶µÀÀí±ÈÁ¦µ¥Ò»£¬µ«ÊÇÈôºÎ´¥·¢Õâ¸ö·ì϶»¹ÊDZÈÁ¦¸´ÔÓ ¡£Ê×ÏÈ£¬ÈôºÎÈÃnetlink_attachskb·µ»Ø1£¬´Ó¶øË³Àû½øÈëretryÂß¼­ ¡£Ôٴλؿ´netlink_attachskbµÄʵÏÖ ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


Èç¹û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 ¡£


ÈôºÎ˳ÀûµÄͨ¹ýº¯ÊýŲÓÃõè¾¶ £¿ÕâÀï±ØÒª·ÖÎöÈôºÎ´Ónetlink_sendmsg´ïµ½netlink_skb_set_owner_r ¡£netlink_sendmsgº¯ÊýʵÏÖÈçÏ ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


ÄÇôÈôºÎ¼õÓ×sk->sk_rcvbuf £¿ÔÚsetsockoptº¯ÊýÖУ¬ÕÒµ½sock_setsockoptº¯ÊýÖжÔ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 ¡£


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

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


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


Õâ¶Î´úÂë»áÈõ±Ç°Áг̽øÈëÆÚ´ý״̬£¬Ö±½Óblock ¡£ÈôÊDz»Ïë½øÈëÆÚ´ý״̬£¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD ¡£µ«ÊÇÈôÊǰÑsock_flagÉèÖóÉSOCK_DEAD£¬ÄǺóÃæÒ²Ã»ÓбØÒª½øÐУ¬Òò¶øÕâÀïÊDZØÈ»Òª½øÈëÆÚ´ý״̬µÄ ¡£Ò»ÖÖÆæÃîµÄ²½ÖèÊÇÖ±½ÓŲÓÃwake_up_interruptibleÇ¿Ðл½ÐÑÏß³Ì ¡£ÄÇÈôºÎŲÓÃwake_up_interruptibleÄØ £¿º¯ÊýŲÓÃÁ´¼«¶È¼ò¶Ì£ºnetlink_setsockopt->wake_up_interruptible ¡£


ÔÚNetlink_setsockoptº¯ÊýÖУº


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±£ÕϽøÈëretryÑ­»·ºó£¬Õâ¸öʱ³½sockÒѾ­²»Îª¿Õ ¡£½ÓÏÂÀ´ÒªÊ¹retryÑ­»·Öз¸´í£¬Ö±½ÓÌø×ªµ½out£¬´úÂëÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


Õâ¸öʱ³½sock³¤¶Ì¿ÕµÄ£¬ifÅжÏÎªÕæ£¬½øÈënetlink_destachskb£¬½ÓמÍÊÇfree±ÀÀ£ ¡£


·ì϶¸´ÏÖ


¶ÔÓÚUAFÀàÐ͵ķì϶£¬Í¨Óò½Öè¾ÍÊÇʹÓöÑÅçÉäռλ ¡£±¾´Î·ì϶Öб»ÂŴοªÊ͵ĶÔÏóÊÇnetlink_sock¶ÔÏó ¡£netlink_sock¶ÔÏó´óÓ×Ϊ0x3f0×Ö½Ú£¬¼´ÊÇ1008byte ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ƾ¾ÝÄÚ²é¶ÔÏóÄÚ´æ·ÖÅ乿¶¨£¬ netlink_sock¶ÔÏóÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖнøÐзÖÅä ¡£
slab·ÖÅäÆ÷ÔÚ·ÖÅä¶ÔÏóʱ£¬×ñÊØºó½øÏȳöµÄ¹æ¶¨ ¡£ÏÂÃæÊÇslab·ÖÅäÆ÷¿ªÊͶÔÏóµÄ¹ý³Ì ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


Òª¿ªÊ͵ĶÔÏóobjp·ÅÔÚÁËac->entry[]µÄ½áβ ¡£ÏÂÃæÊÇslab·ÖÅäÆ÷·ÖÅä¶ÔÏóµÄ¹ý³Ì£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


·ÖÅä¶ÔÏóÖ±½Ó´Óac->entry[]½áβµ¯³öÒ»¸ö¶ÔÏó ¡£


ËùÒÔÒ»¸ö¸Õ¸Õ±»¿ªÊ͵ĶÔÏóÊÇÅÅÔÚÁ´±íÄ©¶Î£¬ÈôÊÇ´Ëʱ¸ÕºÃÔÚͳһ»º´æÖнøÐжÔÏó·ÖÅ䣬ÄǸոտªÊ͵ĶÔÏó¾Í»á±»³ÁзÖÅä³öÈ¥£¬Õâ¾Í³öÏÖÁ½¸öÖ¸ÕëÖ¸Ïòͳһ¿éÄÚ´æµØÖ· ¡£ÒªÏë±£ÕÏÉêÇëµÄÄÚ´æÕýºÃÂäÔÚ·ì϶¶ÔÏóµÄÄÚ´æµØÎ»ÖУ¬±ØÒª°ÑÎÕס¼¸µã£º


¶ÑÅç¶ÔÏóʹÓõÄÄں˻º´æÓ¦¸ÃºÍ·ì϶¶ÔÏóÄÚ´æÔÚͳһ¸ö»º´æÖÐ ¡£¼´´óÓ×±ØÐëÂäÔÚͳһ¸ökmalloc-XÖÐ ¡£


ac×ÔÉíÊÇarray_chche½á¹¹Ì壬¸Ã½á¹¹ÌåÊDZ¾µØ¸ßËÙ»º´æ£¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö£¬ËùÒÔ»¹Òª±£Õ϶ÑÅçÉêÇëµÄ¶ÔÏóºÍ·ì϶¶ÔÏóÔÚͳһ¸öCPU±¾µØ¸ßËÙ»º´æÖÐ ¡£


ÈôÊǶÑÅçÉêÇëµÄ¶ÔÏóÖ»ÊǶÌÔÝפÁô£¬µ±¸Ãº¯Êý·µ»ØÊ±½«ÉêÇëµÄ¶ÔÏó½øÐÐÁË¿ªÊÍ£¬µ¼ÖÂÎÞ·¨Õýȷռλ ¡£ËùÒÔÒªÄܱ£ÕÏÉêÇëµÄ¶ÔÏó²»±»¿ªÊÍ£¬ÖÁÉÙ±£ÕÏÔÚʹÓ÷ì϶¶ÔÏóʱ²»±»¿ªÊÍ£¬ÕâÀïҪѡȡפÁôʽÄÚ´æÕ¼Î»£¬Äܹ»²ÉÈ¡ÈÃijЩϵͳŲÓùý³Ì×èÈû ¡£


slab»º´æË鯬»¯ÎÊÌ⣬ÕâÀïҪռλµÄ¶ÔÏó´óÓ×Ϊ1008£¬¶ÔÏó³ß´ç±ÈÁ¦´ó£¬Õ¼¾ÝËÄ·ÖÖ®Ò»Ò³£¬±ÈÁ¦ÕûÆë£¬Ó¦¸ÃûÓÐË鯬»¯ÎÊÌâ ¡£


ÄÇôÈôºÎÅж϶ÑÅçÊÇ·ñ³É¹¦ÄØ £¿


ͨÓÃÇé¿öÏ£¬ÔÚ½øÐжÑÅçʱ³½£¬»ú¹Ø¶ÑÅç¶ÔÏóʱ£¬ÓбØÒªÔÚ¶ÔÓ¦·ì϶¶ÔÏóµÄÒ»Ð©ÌØÊâ³ÉÔ±ÓòµÄÄÚ´æÆ«ÒÆ´¦ÉèÖÃmagic value£¬¶øºóÄܹ»Ñ¡È¡ÏµÍ³Å²ÓÃÈ¥»ñÈ¡·ì϶¶ÔÏóÖÐÓйØÊý¾Ý½øÐÐÅÐ¶Ï ¡£netlink_sock½á¹¹Ì弸¸ö¹Ø¼üµÄ³ÉÔ±ÈçÏ ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ѡȡ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ÖÐÁ´½ÓµÄÿһ¸ö³ÉÔ±¶¼ÊDZØÒª´¦ÖÃµÄÆÚ´ýÀý³ÌÔªËØ ¡£ÄǸÃÈôºÎʹÓÃÕâ¸ö³ÉÔ± £¿¿´ÈçÏ´úÂë ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÕâÊÇ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Ö´ÐÐÌáȨ´úÂë ¡£³É¹¦ÌáȨºóÈçÏÂËùʾ£º

±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾