On 03/06/2013 10:23 PM, KY Srinivasan wrote: > >> -----Original Message----- >> From: vaughan [mailto:vaughan.cao@xxxxxxxxxx] >> Sent: Tuesday, March 05, 2013 9:09 PM >> To: KY Srinivasan >> Cc: Xitao Cao; devel@xxxxxxxxxxxxxxxxxxxxxx; Haiyang Zhang >> Subject: Re: hyperv: is register a mandatory phase by hypervkvpd? >> >> 于 2013年03月06日 01:02, Xitao Cao 写道: >>> On Tue, Mar 5, 2013 at 11:42 PM, KY Srinivasan <kys@xxxxxxxxxxxxx> wrote: >>>> >>>>> -----Original Message----- >>>>> From: vaughan [mailto:vaughan.cao@xxxxxxxxxx] >>>>> Sent: Tuesday, March 05, 2013 7:48 AM >>>>> To: KY Srinivasan >>>>> Cc: devel@xxxxxxxxxxxxxxxxxxxxxx; Haiyang Zhang; xitao.cao@xxxxxxxxx >>>>> Subject: hyperv: is register a mandatory phase by hypervkvpd? >>>>> >>>>> I guess I found a bug -- hypervkvpd running alone without hv_utils >>>>> loaded encounters segfault when service cgred start on RHEL6.4. It >>>>> occurs with both 0.8 and 0.9, regardless of i686 or x86_64. >>>>> >>>>> I read in hv_kvp_daemon.c that the user mode componet should first >>>>> registers with the kernel component. >>>>> But in my test, the hand shake phase has been ignored. >>>>> Things happens like this: >>>>> hv_utils.ko and hv_vmbus.ko is not loaded, start hypervkvpd is fine. >>>>> Then, I start cgred with the default configuration. cgroup also use >>>>> NETLINK_CONNECTOR protocol and send messages with cb_id{1,1}. >> Hypervkvpd >>>>> receive messages without checking their source. Some messages with >>>>> cb_id{1,1} were receviced and blindly interpreted as hv_kvp_msg. Since >>>>> the hand_shake check is as below: > Jason, > There appears to be a connector related issue here. Could you > check to see if the connector code is current. CC Tomas and ShengNan Reproduce this issue, will have a look at it (though not familiar with connector). Maybe Tomas has idea about this. Thanks > Regards, > > K. Y > > There is some connector related issue here. Jason, could you check >>>>> if ((in_hand_shake) && (op == KVP_OP_REGISTER1)) { >>>>> ... >>>>> continue; >>>>> } >>>>> //handle kvp messages >>>>> switch (op) { ... } >>>>> Register phase is also skipped. >>>>> Everytime the KVP_OP_SET opcode is reached, kvp_key_add_or_modify() is >>>>> invoked with an very large key_size. After several iterations, segfault >>>>> occurs in memcpy(record[i].key, key, key_size) (key_size is negative now). >>>>> >>>>> I'm not very familiar with connector. But I ran the sample in >>>>> Documentation/connector/ and found that a NETLINK_CONNECTOR socket >>>>> would >>>>> always some messages with cb_id{1,1}. So blindly suppose all messages >>>>> are kvp_msg is not correct. hypervkvpd should check the source of >>>>> messages and perhaps even check nlmsg_type in the nlmsghdr. >>>>> >>>> The current code does use recvfrom() and checks the sending PID to see if it is >> trusted. >>>> What version of the code are you testing with. >>> Tested both 0.8.0.1 and 0.9.0.1 (redhat version) on 2.6.32-343 on RHEL6.4. >>> I confirm PID is zero, but I think it only means it is sent by kernel. >>> I have no idea whether it is correct for a NETLINK_CONNECTOR >>> implementation that a socket with id {9,1} is able to receive messages >>> with id {1,1}. >> I'm sorry it should be 0-0.9 and 0-0.8 RHEL version. .spec is as below: >> >> # HyperV KVP daemon name >> %global hv_kvp_daemon hv_kvp_daemon >> >> Name: hypervkvpd >> Version: 0 >> Release: 0.9%{?dist} >> Summary: HyperV key value pair (KVP) daemon >> >> Group: System Environment/Daemons >> License: GPLv2 >> URL: http://www.kernel.org >> # Source file obtained from kernel upstream. >> # git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git >> # The daemon and scripts are located in "master branch - /tools/hv" >> Source0: %{hv_kvp_daemon}.c >> Source1: hv_get_dhcp_info.sh >> Source2: hv_get_dns_info.sh >> Source3: hv_set_ifconfig.sh >> Source4: hypervkvpd >> >> # Correct paths to external scripts ("/usr/libexec/hypervkvpd"). >> Patch0: hypervkvpd-0-corrected_paths_to_external_scripts.patch >> # rhbz#872593 >> Patch1: hypervkvpd-0-Netlink-source-address-validation-allows-DoS.patch >> # rhbz#872566 >> Patch2: hypervkvpd-0-long_file_names_from_readdir.patch >> # rhbz#872584 >> Patch3: hypervkvpd-0-var_subdirectory.patch >> Patch4: hypervkvpd-0-string_types.patch >> Patch5: hypervkvpd-0-permissions_of_created_directory_and_files.patch >> # rhbz#890301 >> Patch6: hypervkvpd-0-fix_a_typo_in_hv_set_ifconfig_sh.patch >> Patch7: hypervkvpd-0-Fix-how-ifcfg-file-is-created.patch >> Patch8: hypervkvpd-0-Use-CLOEXEC-when-opening-kvp_pool-files.patch >> >> BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) >> # this package is supposed to run on RHEL when it's a guest under Hyper-V >> ExclusiveArch: x86_64 i686 >> BuildRequires: kernel-devel >= 2.6.32-336 >> Requires(post): chkconfig >> Requires(preun): chkconfig >> # This is for /sbin/service >> Requires(preun): initscripts >> Requires(postun): initscripts >> >> %description >> Hypervkvpd is an implementation of HyperV key value pair (KVP) >> functionality for Linux. >> >> >> %prep >> %setup -Tc >> cp -pvL %{SOURCE0} %{hv_kvp_daemon}.c >> cp -pvL %{SOURCE1} hv_get_dhcp_info.sh >> cp -pvL %{SOURCE2} hv_get_dns_info.sh >> cp -pvL %{SOURCE3} hv_set_ifconfig.sh >> cp -pvL %{SOURCE4} hypervkvpd >> >> %patch0 -p1 -b .external_scripts >> %patch1 -p1 -b .netlink_DoS >> %patch2 -p1 -b .long_names >> %patch3 -p1 -b .var_subdir >> %patch4 -p1 -b .string_types >> %patch5 -p1 -b .permissions >> %patch6 -p1 >> %patch7 -p3 -b .ifcfg_fix >> %patch8 -p3 -b .use_CLOEXEC >> >> >> %build >> # kernel-devel version >> %{!?kversion: %global kversion `ls %{_usrsrc}/kernels | sort -dr | head >> -n 1`} >> >> gcc \ >> %{optflags} \ >> -I%{_usrsrc}/kernels/%{kversion}/include \ >> %{hv_kvp_daemon}.c \ >> -o %{hv_kvp_daemon} >> >> >> %install >> rm -rf %{buildroot} >> >> mkdir -p %{buildroot}%{_sbindir} >> install -p -m 0755 %{hv_kvp_daemon} %{buildroot}%{_sbindir} >> mkdir -p %{buildroot}%{_initrddir} >> # SysV init script >> install -p -m 0755 %{SOURCE4} %{buildroot}%{_initrddir} >> # Shell scripts for the daemon >> mkdir -p %{buildroot}%{_libexecdir}/%{name} >> install -p -m 0755 hv_get_dhcp_info.sh >> %{buildroot}%{_libexecdir}/%{name}/hv_get_dhcp_info >> install -p -m 0755 hv_get_dns_info.sh >> %{buildroot}%{_libexecdir}/%{name}/hv_get_dns_info >> install -p -m 0755 hv_set_ifconfig.sh >> %{buildroot}%{_libexecdir}/%{name}/hv_set_ifconfig >> # Directory for pool files >> mkdir -p %{buildroot}%{_sharedstatedir}/hyperv >> >> >> %post >> # This adds the proper /etc/rc*.d links for the script >> /sbin/chkconfig --add hypervkvpd >> >> >> %preun >> # Removing package >> if [ $1 -eq 0 ] ; then >> /sbin/service hypervkvpd stop >/dev/null 2>&1 >> /sbin/chkconfig --del hypervkvpd >> fi >> >> >> %postun >> # Updating package >> if [ "$1" -ge "1" ] ; then >> /sbin/service hypervkvpd condrestart >/dev/null 2>&1 || : >> fi >> # If removing the package, delete %%{_sharedstatedir}/hyperv directory >> if [ "$1" -eq "0" ] ; then >> rm -rf %{_sharedstatedir}/hyperv || : >> fi >> >> >> %clean >> rm -rf %{buildroot} >> >> >> %files >> %defattr(-,root,root,-) >> %doc >> %{_sbindir}/%{hv_kvp_daemon} >> %{_initrddir}/hypervkvpd >> %dir %{_libexecdir}/%{name} >> %{_libexecdir}/%{name}/hv_get_dhcp_info >> %{_libexecdir}/%{name}/hv_get_dns_info >> %{_libexecdir}/%{name}/hv_set_ifconfig >> %dir %{_sharedstatedir}/hyperv >> >> >> %changelog >> * Mon Jan 14 2013 Tomas Hozza <thozza@xxxxxxxxxx> - 0-0.9 >> - Fix a typo in hv_set_ifconfig.sh script >> - Fix creation process of ifcfg-* files when doing IP injection >> - Use CLOEXEC when opening pool files to prevent FD leaking >> - Changes in SPEC file: >> - remove/create %%{_sharedstatedir}/hyperv if removing/installing package >> - install scripts without ".sh" extension >> >> * Mon Nov 12 2012 Tomas Hozza <thozza@xxxxxxxxxx> - 0-0.8 >> - Bumping release to 0.8 to avoid update path from RHEL5 >> - changing the way how Netlink source address is validated (#872593) >> - fix for long names from readdir (#872566) >> - applied reasonable Debian/Ubuntu patches (#872584) >> >> * Thu Nov 08 2012 Tomas Hozza <thozza@xxxxxxxxxx> - 0-0.2 >> - Changing ExclusiveArch just to x86_64 i686 (#870288) >> >> * Tue Sep 25 2012 Tomas Hozza <thozza@xxxxxxxxxx> - 0-0.1 >> - Initial spec file >> >> >>>> Regards, >>>> >>>> K. Y >>>>> -- >>>>> Regards, >>>>> Vaughan >>>>> >>>>> >> _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel