[libvirt] [PATCHv2] virsh: avoid uninitialized memory usage

Wen Congyang wency at cn.fujitsu.com
Fri Apr 20 00:43:53 UTC 2012


At 04/20/2012 04:29 AM, Eric Blake Wrote:
> On 04/19/2012 02:56 AM, Wen Congyang wrote:
>> At 04/19/2012 04:51 PM, Alex Jia Wrote:
>>> Detected by valgrind.
>>>
>>> * tools/virsh.c (cmdBlockPull): fix uninitialized memory usage.
>>>  
> 
>>> +++ b/tools/virsh.c
>>> @@ -7634,6 +7634,7 @@ cmdBlockPull(vshControl *ctl, const vshCmd *cmd)
>>>  
>>>          intCaught = 0;
>>>          sig_action.sa_sigaction = vshCatchInt;
>>> +        sig_action.sa_flags = 0;
>>>          sigemptyset(&sig_action.sa_mask);
>>>          sigaction(SIGINT, &sig_action, &old_sig_action);
>>>  
>>
>> ACK
> 
> NACK.  vshCatchInt is a 3-arg function, and therefore
> sig_action.sa_flags must include at least SA_SIGINFO.  I inadvertently
> missed a line when copying code from vshWatchJob(); I'll push the
> obvious v3 patch shortly.
> 

Sorry, I forgot this.

I search sig_action(), and found the same problem in the function
 virNetServerNew():
====================
    memset(&sig_action, 0, sizeof(sig_action));
    sig_action.sa_handler = SIG_IGN;
    sigaction(SIGPIPE, &sig_action, NULL);

    /*
     * catch fatal errors to dump a log, also hook to USR2 for dynamic
     * debugging purposes or testing
     */
    sig_action.sa_sigaction = virNetServerFatalSignal;
    sigaction(SIGFPE, &sig_action, NULL);
    sigaction(SIGSEGV, &sig_action, NULL);
====================
We set sig_action.sa_flags to 0 here.

And in virsh.c, I found:
====================
/* Gnulib doesn't guarantee SA_SIGINFO support.  */
#ifndef SA_SIGINFO
# define SA_SIGINFO 0
#endif
====================

Is it safe to use sig_action.sa_sigaction when SA_SIGINFO is not set?
I think it is OK if we access siginfo_t if SA_SIGINFO is not 0.
But in the function virNetServerAddSignalHandler():
====================
    memset(&sig_action, 0, sizeof(sig_action));
    sig_action.sa_sigaction = virNetServerSignalHandler;
#ifdef SA_SIGINFO
    sig_action.sa_flags = SA_SIGINFO;
#endif
    sigemptyset(&sig_action.sa_mask);

    sigaction(signum, &sig_action, &sigdata->oldaction);
====================
virNetServerSignalHandler() will access siginfo_t without any check.




More information about the libvir-list mailing list