On Wed, Oct 29, 2025, at 8:06 AM, Pádraig Brady wrote:
> On 29/10/2025 11:35, Bruno Haible wrote:
>> Hi Collin,
>> 
>>> 'date' doesn't diagnose write errors immediately. That
>>> behavior should be changed, in my opinion.
>>>
>>> If you allowed it to run for however long it takes (hours?) to generate
>>> output, you would see a write error:
>>>
>>>      $ strace date +`python -c 'print("%2147483648c" * 10000)'` 2>&1 \
>>>          > /dev/full | head -n 100
>>>      [...]
>>>      write(1, "                                "..., 4096) = -1 ENOSPC (No 
>>> space left on device)
>>>      write(1, "                                "..., 4096) = -1 ENOSPC (No 
>>> space left on device)
>>>      write(1, "                                "..., 4096) = -1 ENOSPC (No 
>>> space left on device)
>>>      write(1, "                                "..., 4096) = -1 ENOSPC (No 
>>> space left on device)
>>>      write(1, "                                "..., 4096) = -1 ENOSPC (No 
>>> space left on device)
>>>
>>> This patch checks for an error on the stream and returns early if there
>>> is one:
>>>
>>>      $ time ./src/date +`python -c 'print("%2147483648c" * 10000)'` > 
>>> /dev/full
>>>      date: write error: No space left on device
>>>      
>>>      real   0m0.019s
>>>      user   0m0.012s
>>>      sys    0m0.007s
>> 
>> Two considerations:
>> 
>> 1) The proposed patch changes the return value of fprintftime(). Where
>>     previously the return value (number of bytes output to the stream)
>>     was independent of exterior conditions, now it depends on such 
>> conditions.
>> 
>>     Thus, coding patterns like the following are not valid any more:
>>       1. Calling fprintftime with some arguments, writing to a log file.
>>       2. Allocate RETVALUE + 1 bytes of memory.
>>       3. Calling fprintftime with the same arguments, writing to an in-memory
>>          stream with that bounded memory instead.
>> 
>>     I'm not saying that this is a likely coding pattern. But it's a possible
>>     one, and that sends a red flag.
>
> I agree large outputs from fprintftime are an extreme edge case,
> but also the above cases are an extremely unlikely.
> Note the following does show one unconditional use of the fprintftime 
> return in tar:
> https://codesearch.debian.net/search?q=%3D+*fprintftime+*%5C%28&literal=0
> So it might be plausible to change that and also change fprintftime()
> to return -1 on error (like fprintf).
>

The return type of fprintftime is `size_t`. But 4GiB+ of output can be 
generated. If GNU still supports ILP32 platforms, the return value is already 
unreliable for determining the number of bytes written.

> cheers,
> Padraig

Reply via email to