On 03/06/2013 10:23 PM, KY Srinivasan wrote:
>
>> -----Original Message-----
>> From: vaughan [mailto:[email protected]]
>> Sent: Tuesday, March 05, 2013 9:09 PM
>> To: KY Srinivasan
>> Cc: Xitao Cao; [email protected]; 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 <[email protected]> wrote:
>>>>
>>>>> -----Original Message-----
>>>>> From: vaughan [mailto:[email protected]]
>>>>> Sent: Tuesday, March 05, 2013 7:48 AM
>>>>> To: KY Srinivasan
>>>>> Cc: [email protected]; Haiyang Zhang; [email protected]
>>>>> 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 <[email protected]> - 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 <[email protected]> - 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 <[email protected]> - 0-0.2
>> - Changing ExclusiveArch just to x86_64 i686 (#870288)
>>
>> * Tue Sep 25 2012 Tomas Hozza <[email protected]> - 0-0.1
>> - Initial spec file
>>
>>
>>>> Regards,
>>>>
>>>> K. Y
>>>>> --
>>>>> Regards,
>>>>> Vaughan
>>>>>
>>>>>
>>
_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel