On Thu, Nov 10 2022, Mikhail <mp39...@gmail.com> wrote:
> On Thu, Nov 10, 2022 at 06:21:52PM +0100, Jeremie Courreges-Anglas wrote:
>> On Thu, Nov 10 2022, Mikhail <mp39...@gmail.com> wrote:
>> > On Thu, Nov 10, 2022 at 09:35:18AM +0100, Jeremie Courreges-Anglas wrote:
>> >> On Thu, Nov 10 2022, Ross L Richardson <open...@rlr.id.au> wrote:
>> >> > Reported upstream (by me) as
>> >> >         https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=267684
>> >> >
>> >> > math/ministat has a silly bug in which the code assumes that "-" will be
>> >> > specified no more than once at invocation:
>> >> >
>> >> > $ jot 3 | ministat - - 
>> >> > Segmentation fault (core dumped) 
>> >> >
>> >> > The problem is in the port-patched code at:
>> >> >    643                  if (argc > (MAX_DS - 1))
>> >> >    644                          usage("Too many datasets.");
>> >> >    645                  nds = argc;
>> >> >    646                  for (i = 0; i < nds; i++) {
>> >> >    647                          setfilenames[i] = argv[i];
>> >> >    648                          if (!strcmp(argv[i], "-"))
>> >> >    649                                  setfiles[0] = stdin;
>> >> >    650                          else
>> >> >    651                                  setfiles[i] = fopen(argv[i], 
>> >> > "r");
>> >> >    652                          if (setfiles[i] == NULL)
>> >> >    653                                  err(2, "Cannot open %s", 
>> >> > argv[i]);
>> >> >    654                  }
>> >> >
>> >> > On line 649, the index is fixed at 0, eventually leading to fgets()
>> >> > attempting to read from an uninitialised stream.
>> >> >
>> >> > The simplest fix is change the index:
>> >> >    649                                  setfiles[i] = stdin;
>> >> 
>> >> Indeed.
>> >> 
>> >> > That way, ministat will error out complaining that, on the second 
>> >> > reading,
>> >> > stdin has fewer than 3 data points.
>> >> > (A more logical fix would be to check explicitly for more than 1
>> >> > occurrence of "-".)
>> >> 
>> >> A lot of tools that can use stdin don't explicitely check for it being
>> >> specified twice.  As far as this port is concerned, I think it's fine.
>> >> 
>> >> Thanks for your report.  Do you want to take it to upstream FreeBSD?
>> >> 
>> >> Here's the diff for our ports tree.
>> >
>> > FreeBSD version doesn't crash:
>> >
>> > [freefall ~] ministat - -
>> > ministat: Cannot open -: No error: 0
>> >
>> > It's because on line 652 (see code snippet above) we check if array
>> > element is set to NULL, and before that we either use 0 index for stdin
>> > or don't set any element if we see any more -), so, I'd suggest to fail
>> > the same way as FreeBSD does, for this we need to explicitly set all
>> > array elements to NULL.
>> >
>> > So, how about such approach?
>> 
>> Setting the array to NULL prevents the crash - FreeBSD sems to be more
>> forgiving here - but IMO the intended semantics are really to set
>> setfiles[i].  I think that the proposal from Ross should be preferred,
>> for the ports tree but also for an upstream fix.
>
> I created differential revision for Ross' patch:
> https://reviews.freebsd.org/D37346

Thanks!

> If it won't be handled by FreeBSD in reasonable time, I think we can
> proceed with your patch without upstream then.

I see it has already received positive feedback.  I suggest we wait
until it gets committed, or at most one week.

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to