qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

linux-user: fix TARGET_NSIG and _NSIG uses

Valid signal numbers are between 1 (SIGHUP) and SIGRTMAX.

System includes define _NSIG to SIGRTMAX + 1, but
QEMU (like kernel) defines TARGET_NSIG to TARGET_SIGRTMAX.

Fix all the checks involving the signal range.

Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Taylor Simpson <tsimpson@quicinc.com>
Message-Id: <20200212125658.644558-4-laurent@vivier.eu>

+37 -15
+37 -15
linux-user/signal.c
··· 30 30 static void host_signal_handler(int host_signum, siginfo_t *info, 31 31 void *puc); 32 32 33 + 34 + /* 35 + * System includes define _NSIG as SIGRTMAX + 1, 36 + * but qemu (like the kernel) defines TARGET_NSIG as TARGET_SIGRTMAX 37 + * and the first signal is SIGHUP defined as 1 38 + * Signal number 0 is reserved for use as kill(pid, 0), to test whether 39 + * a process exists without sending it a signal. 40 + */ 41 + QEMU_BUILD_BUG_ON(__SIGRTMAX + 1 != _NSIG); 33 42 static uint8_t host_to_target_signal_table[_NSIG] = { 34 43 [SIGHUP] = TARGET_SIGHUP, 35 44 [SIGINT] = TARGET_SIGINT, ··· 67 76 [SIGSYS] = TARGET_SIGSYS, 68 77 /* next signals stay the same */ 69 78 }; 70 - static uint8_t target_to_host_signal_table[_NSIG]; 71 79 80 + static uint8_t target_to_host_signal_table[TARGET_NSIG + 1]; 81 + 82 + /* valid sig is between 1 and _NSIG - 1 */ 72 83 int host_to_target_signal(int sig) 73 84 { 74 - if (sig < 0 || sig >= _NSIG) 85 + if (sig < 1 || sig >= _NSIG) { 75 86 return sig; 87 + } 76 88 return host_to_target_signal_table[sig]; 77 89 } 78 90 91 + /* valid sig is between 1 and TARGET_NSIG */ 79 92 int target_to_host_signal(int sig) 80 93 { 81 - if (sig < 0 || sig >= _NSIG) 94 + if (sig < 1 || sig > TARGET_NSIG) { 82 95 return sig; 96 + } 83 97 return target_to_host_signal_table[sig]; 84 98 } 85 99 ··· 100 114 void host_to_target_sigset_internal(target_sigset_t *d, 101 115 const sigset_t *s) 102 116 { 103 - int i; 117 + int host_sig, target_sig; 104 118 target_sigemptyset(d); 105 - for (i = 1; i <= TARGET_NSIG; i++) { 106 - if (sigismember(s, i)) { 107 - target_sigaddset(d, host_to_target_signal(i)); 119 + for (host_sig = 1; host_sig < _NSIG; host_sig++) { 120 + target_sig = host_to_target_signal(host_sig); 121 + if (target_sig < 1 || target_sig > TARGET_NSIG) { 122 + continue; 123 + } 124 + if (sigismember(s, host_sig)) { 125 + target_sigaddset(d, target_sig); 108 126 } 109 127 } 110 128 } ··· 122 140 void target_to_host_sigset_internal(sigset_t *d, 123 141 const target_sigset_t *s) 124 142 { 125 - int i; 143 + int host_sig, target_sig; 126 144 sigemptyset(d); 127 - for (i = 1; i <= TARGET_NSIG; i++) { 128 - if (target_sigismember(s, i)) { 129 - sigaddset(d, target_to_host_signal(i)); 145 + for (target_sig = 1; target_sig <= TARGET_NSIG; target_sig++) { 146 + host_sig = target_to_host_signal(target_sig); 147 + if (host_sig < 1 || host_sig >= _NSIG) { 148 + continue; 149 + } 150 + if (target_sigismember(s, target_sig)) { 151 + sigaddset(d, host_sig); 130 152 } 131 153 } 132 154 } ··· 492 514 if (host_to_target_signal_table[host_sig] == 0) { 493 515 host_to_target_signal_table[host_sig] = host_sig; 494 516 } 495 - } 496 - for (host_sig = 1; host_sig < _NSIG; host_sig++) { 497 517 target_sig = host_to_target_signal_table[host_sig]; 498 - target_to_host_signal_table[target_sig] = host_sig; 518 + if (target_sig <= TARGET_NSIG) { 519 + target_to_host_signal_table[target_sig] = host_sig; 520 + } 499 521 } 500 522 } 501 523 ··· 518 540 act.sa_sigaction = host_signal_handler; 519 541 for(i = 1; i <= TARGET_NSIG; i++) { 520 542 #ifdef TARGET_GPROF 521 - if (i == SIGPROF) { 543 + if (i == TARGET_SIGPROF) { 522 544 continue; 523 545 } 524 546 #endif