Good that you tracked this down, but as you say, we still have the rumored issue with binary data we need to sort out.
Regarding Microsoft (by analogy): https://www.youtube.com/watch?v=CHgUN_95UAw Power to the monopolies! -Greg > From: Georg Mischler <schor...@schorsch.com> > Subject: Re: [Radiance-dev] Pipe problems on Windows - BUG in Universal CRT > Date: March 27, 2016 6:21:27 AM PDT > > Keep talking to myself... > > The MS feedback site has those entries > https://connect.microsoft.com/VisualStudio/Feedback/Details/1902345 > https://connect.microsoft.com/VisualStudio/Feedback/Details/2419638 > both of which seem to describe incarnations of our problem. > > In the first one, a MS person added a comment saying: > We have fixed this bug; the fix will be present in an upcoming > update to the Universal CRT. > > So all hope is not lost. > > -schorsch > > > Am 2016-03-27 14:31, schrieb Georg Mischler: >> I've sent feedback to Microsoft, we'll see what happens. >> For anyone who wants to check the weirdness on their own: >> sender.c >> ----------------------------------------------------- >> #include <stdio.h> >> #define MAX_TESTLINES 20000 >> int main(void) >> { >> int i; >> for (i = 0; i < MAX_TESTLINES; i++) { >> fprintf_s(stdout, "x\n"); >> } >> return 0; >> } >> ----------------------------------------------------- >> receiver.c >> ----------------------------------------------------- >> #include <stdio.h> >> #define MAX_BUF 10 >> int main(void) >> { >> int i = 0; >> char inbuf[MAX_BUF]; >> while (fgets((char*)&inbuf, MAX_BUF, stdin)) { >> if (inbuf[1] != '\n') { >> fprintf_s(stdout, "Line ending omitted from stream on line %d: >> \"%s\"\n", i++, &inbuf); >> } >> i++; >> } >> return 0; >> } >> ----------------------------------------------------- >> Invoke the two programs in a console as: >> $ sender | receiver >> With bug present, the output will be something similar to: >> Line ending omitted from stream on line 2730: "xx >> " >> Line ending omitted from stream on line 5461: "xx >> " >> Line ending omitted from stream on line 8192: "xx >> " >> Line ending omitted from stream on line 10923: "xx >> " >> Line ending omitted from stream on line 13654: "xx >> " >> Line ending omitted from stream on line 16385: "xx >> " >> Have fun! >> -schorsch >> Am 2016-03-27 10:38, schrieb Georg Mischler: >>> Good thing I tested with fgetline() before starting to roll my own >>> fgets(). The suspicion I had from stepping through fgets() was >>> confirmed, and it's actually the underlying stream that's broken. >>> Plugging our own buffering text stream might be theoretically >>> possible, but is probably not worth the effort. >>> So pending a fix from Microsoft, we need to consider Visual Studio >>> 2015 in default settings as unsuitable for production use. >>> Microsoft seems to be quite proud of having massively refactored their >>> C/C++ runtime libraries for Windows 10 into what they call the >>> "universal crt". And that new version of the CRT is now included in VS >>> 2015. >>> I'll try and see if (and how) I can link to an older CRT instead, but >>> I'm not very optimistic there. >>> The bug is slightly obscure. It only happens very intermittinlgy and >>> at seemingly random intervals. You need to pass a largish number of >>> very short text lines through a pipe to trigger it, and even then >>> you may only notice the problem if you happen to count the lines. >>> Sending a sequence of numerals simplifies that... >>> Of course that's not really an excuse for a multi-billion-dollar >>> corporation breaking one of the most basic building blocks of >>> eventually all of their software products. I'm actually wondering if >>> such a possibility to "manipulate" the contents of an interprocess >>> data stream (eg. by changing the default buffer length) has any >>> security implications. >>> This drastically shows the value of having an extremely complete and >>> thorough battery of test cases before you start with any major >>> refactoring. >>> -schorsch >>> Am 2016-03-27 00:28, schrieb Gregory J. Ward: >>>> I agree this is probably not the error we have seen before, though it >>>> is an important one. We might think about writing an fgets() >>>> replacement for Windows, rather than using fgetline(), which has >>>> slightly different semantics. We should replace it at the library >>>> level, so it will propagate to all potentially affected tools. It's >>>> hard to believe that such a simple, basic function call would be >>>> broken in this way.... >>>> Good sleuthing, Schorsch! >>>> -G >>>>> From: Georg Mischler <schor...@schorsch.com> >>>>> Subject: Re: [Radiance-dev] Pipe problems on Windows >>>>> Date: March 26, 2016 3:20:09 PM PDT >>>>> It looks like we're dealing with a broken fgets() included >>>>> with Visual Studio 2015 Community edition. >>>>> When a newline character falls exactly to the end of the >>>>> pipe buffer, it will be ignored. This means that instead of >>>>> "\t1328\n" the received string will be "\t1328\t1329\n". >>>>> Any time that happens, nrecs is only incremented once for >>>>> two actual input values, which accounts for the lower nuber >>>>> of output values in the end. >>>>> Guess I'll have to try if our own fgetline() has better success. >>>>> But again, this is probably not the "garbage date from binary >>>>> pipe" problem that we were previously discussing. We should still >>>>> look for test cases to identify that one. >>>>> Cheers >>>>> -schorsch >>>>> Am 2016-03-25 15:35, schrieb Georg Mischler: >>>>>> Moving this to a seperate thread. >>>>>> The sequence below consistently gives me 703 on Vista, with the only >>>>>> difference that the DOS box asks for double quotes. >>>>>> But... >>>>>> turning up n to values beyond 2000, the MSC binary of rcalc begins to >>>>>> write(!) some bytes less(!) to stdout. Which obviously falsifies the >>>>>> result of the chain. >>>>>> Interesingly, the NREL binary doesn't do that. >>>>>> Rob mentioned using gcc, so there seems to be a disagreement between >>>>>> the two compilers as to the semantics of writing to stdout on program >>>>>> termination. >>>>>> Going to have some discussion with the debugger on this one. >>>>>> I'd only be too happy if a simple flush() would solve the problem... >>>>>> Ah, and first I should probably create a few test cases to cover this >>>>>> kind of bug. >>>>>> Cheers >>>>>> -schorsch >>>>>>>> I've searched for similar complaints online. In the few instances I've >>>>>>>> found, it usually was because a terminating null byte wasn't written >>>>>>>> to the receiving buffer for some reason. The purportedly received >>>>>>>> garbage data was then simply the previous random contents of that >>>>>>>> buffer. That may or may not be the cause here as well. >>>>>>>> If there really was an inherent problem with using pipes on Windows, >>>>>>>> then I'm sure I would have found a lot more information about it. >>>>>>> Well, in our case, it's not about null bytes not being sent -- it's >>>>>>> about knowing exactly when we've reached end-of-data, which we expect >>>>>>> the system to tell us in some cases. Radiance's binary formats for >>>>>>> octrees, ambient files, pictures, etc., we know when we've reached EOD >>>>>>> regardless because the file header tells us how much to expect. >>>>>>> However, when we're sending binary streams of floats to rcalc, which >>>>>>> is simply operating on them and counting on the OS to stop sending >>>>>>> data when it's out of data, we run into trouble if the OS doesn't tell >>>>>>> us exactly when the party is over. >>>>>>> I suppose a simple test would be something like: >>>>>>> cnt 37 | rcalc -of -e '$1=recno' | total -if >>>>>>> This should give us a value of 703, or n*(n+1)/2 for any n (i.e., >>>>>>> 37*(37+1)/2==703). We could try running the above on a Windows box >>>>>>> with a FAT or ExFAT filesystem to determine if this is a problem or >>>>>>> not. We should probably try it with some large numbers as well, being >>>>>>> aware that we end on a 128-byte boundary when n is a multiple of 32. >>>>>>> We can also try it while writing with an intermediate file between >>>>>>> rcalc and total, to see if that makes any difference. _______________________________________________ Radiance-dev mailing list Radiance-dev@radiance-online.org http://www.radiance-online.org/mailman/listinfo/radiance-dev