Subject: bug#13530: head: memory exhausted when printing all from stdin but last P/E bytes

From: Pádraig Brady <[email-masked]>
Date: Wed, 23 Jan 2013 13:03:55 +0000

On 01/23/2013 12:53 PM, Bernhard Voelker wrote:
> On 01/23/2013 01:34 PM, Pádraig Brady wrote:
>> There is the argument that we _should_ allocate
>> everything up front to indicate immediately
>> that the system can't (currently) support the requested operation,
>> but given the 'currently' caveat above I guess it's
>> more general to fail when we actually run out of mem?
>
> head doesn't "allocate everything up front" - instead, it only
> allocates the pointer array which would hold the actual data.

Sure. I was wondering whether that should change
to allocate everything up front so as to exit early.

> The strategy in elide_tail_lines_pipe() seems more robust:
> it allocates memory when needed.

Yes probably.

> Or another (probably martian) idea:
> what about a tmpfile()?

Not worth it I think.

>>        free_mem:
>> -      for (i = 0; i < n_bufs; i++)
>> +      for (i = 0; i < n_alloc; i++)
>>            free (b[i]);
>>          free (b);
>
> BTW: both in the old and the new version, the loop can break
> if (b[i] == 0) because the array is filled from the beginning.

The new version only frees what's allocated and so gets this benefit too.

> -      for (i = 0; i < n_bufs; i++)
> +      for (i = 0; i < n_bufs && b[i]; i++)
>
> This makes "echo 123 | head -c -T" ~40% faster here on my PC.

nice

thanks,
Pádraig