Package: unixcw
Severity: important
Version: 2.3-3
Tags: patch


Hi,

the current version fails to build on GNU/kFreeBSD.

It incorrectly assumes that number of signals
is given by macro SIGRTMAX.

Moreover there is "off by one" bug even on Linux,
as signal numbers starts with 1,
see also /usr/include/bits/signum.h.

Current code reject perfectly valid signal 64 in cw_register_signal_handler() and cw_unregister_signal_handler()
with EINVAL.

Please find attached patch to fix all of that.

There may be still problem with cw_register_signal_handler()
and cw_unregister_signal_handler() for signal number 0.
IMHO, it should be rejected directly with EINVAL.

It would also be nice if you can inform upstream
about this issues.

Thanks in advance

                        Petr
--- unixcw-2.3.orig/src/cwlib/cwlib.c
+++ unixcw-2.3/src/cwlib/cwlib.c
@@ -3008,7 +3008,18 @@
  * initialized dynamically to SIG_DFL (if SIG_DFL is not NULL, which it
  * seems that it is in most cases).
  */
-static void (*cw_signal_callbacks[RTSIG_MAX]) (int);
+ 
+#if defined(NSIG)
+#define SIG_MAX (NSIG) 
+#elif defined(_NSIG)
+#define SIG_MAX (_NSIG) 
+#elif defined(RTSIG_MAX)
+#define SIG_MAX ((RTSIG_MAX)+1)
+#else
+#error unknown number of signals
+#endif
+  
+static void (*cw_signal_callbacks[SIG_MAX]) (int);
 
 
 /**
@@ -3194,14 +3205,14 @@
     {
       int index;
 
-      for (index = 0; index < RTSIG_MAX; index++)
+      for (index = 0; index < SIG_MAX; index++)
         cw_signal_callbacks[index] = SIG_DFL;
 
       is_initialized = TRUE;
     }
 
   /* Reject invalid signal numbers, and SIGALRM, which we use internally. */
-  if (signal_number < 0 || signal_number >= RTSIG_MAX
+  if (signal_number < 0 || signal_number >= SIG_MAX
       || signal_number == SIGALRM)
     {
       errno = EINVAL;
@@ -3256,7 +3267,7 @@
   int status;
 
   /* As above, reject unacceptable signal numbers. */
-  if (signal_number < 0 || signal_number >= RTSIG_MAX
+  if (signal_number < 0 || signal_number >= SIG_MAX
       || signal_number == SIGALRM)
     {
       errno = EINVAL;

Reply via email to