bin/186697: calendar(1): -A -B -t not working correctly
oliver
oliver at beefrankly.org
Sat Feb 15 23:40:01 UTC 2014
The following reply was made to PR bin/186697; it has been noted by GNATS.
From: oliver <oliver at beefrankly.org>
To: bug-followup at FreeBSD.org, kaltheat at gmail.com
Cc:
Subject: Re: bin/186697: calendar(1): -A -B -t not working correctly
Date: Sun, 16 Feb 2014 00:37:34 +0100
I checked that and the segfault is due to how the program handles the
given arguments. The segfault only happens when year and month are the
same, and only days differ. But due to the structure of the program,
this leads to other calculation problems when using bigger values...
For example:
calendar -A -20 # does not print out correct values
$ date
So 16 Feb 2014 00:30:29 CET
$ calendar -A -20
16 Feb test2
17 Feb test3
18 Feb test4
$ calendar -B 10
14 Feb testx
15 Feb test1
16 Feb test2
calendar assumes that date1 generated by (now - SECONDSOFDAY*(arg -B))
is smaller than date2 (now + SECONDSOFDAY*(arg -A)) which happens only
to be always true if you use positive integers for both. Failing that,
the corresponding date is not calculated leading to a null pointer
when month and day are the same, else wrong calculations are executed.
This is also an issue for "-W".
The man page intends that you should use positive numbers (forward,
future for -A, and backward, past for -B) for "-A" and "-B", so it could
be the easiest fix to check the command line args for negative numbers
and exit(1). (see below)
The second issue "-A 0 -B 0 not working":
That means if you only specify one argument -A or -B to be zero and the
other argument not set or both set to zero, the program uses the default
output (range from now to now+1d and on a friday from now to now+3d). If
you specify -A or -B to be greater than 0 or set -W that default
behaviour is not used anymore.
That may be an issue, but it depends on what was intended.
A possible fix for the invalid parameter issue (segfault), also fixes
-W:
--- calendar.c 2014-02-15 21:51:29.000000000 +0100
+++ /usr/src/usr.bin/calendar/calendar.c 2014-01-16
21:36:28.000000000 +0100 @@ -96,18 +96,10 @@
case 'A': /* days after current date */
f_dayAfter = atoi(optarg);
- if(f_dayAfter<0) {
- errno = EINVAL;
- err(1, NULL);
- }
break;
case 'B': /* days before current date */
f_dayBefore = atoi(optarg);
- if(f_dayBefore<0) {
- errno = EINVAL;
- err(1,NULL);
- }
break;
case 'D': /* debug output of sun and moon info */
More information about the freebsd-bugs
mailing list