Fix memory handling in strxfrm_l [BZ #16009]
authorLeonhard Holz <leonhard.holz@web.de>
Tue, 13 Jan 2015 06:03:56 +0000 (11:33 +0530)
committerDongkyun, Son <dongkyun.s@samsung.com>
Sun, 22 May 2016 13:26:59 +0000 (22:26 +0900)
commit3b0df84015836d4c1123231d447afb8076e31b13
tree87ec52e7a403d4632387e7cd9c9d0fd340b7f1d2
parent3d386f135dbb905d7e64309421609c6dc277ba3b
Fix memory handling in strxfrm_l [BZ #16009]

[Modified from the original email by Siddhesh Poyarekar]

This patch solves bug #16009 by implementing an additional path in
strxfrm that does not depend on caching the weight and rule indices.

In detail the following changed:

* The old main loop was factored out of strxfrm_l into the function
do_xfrm_cached to be able to alternativly use the non-caching version
do_xfrm.

* strxfrm_l allocates a a fixed size array on the stack. If this is not
sufficiant to store the weight and rule indices, the non-caching path is
taken. As the cache size is not dependent on the input there can be no
problems with integer overflows or stack allocations greater than
__MAX_ALLOCA_CUTOFF. Note that malloc-ing is not possible because the
definition of strxfrm does not allow an oom errorhandling.

* The uncached path determines the weight and rule index for every char
and for every pass again.

* Passing all the locale data array by array resulted in very long
parameter lists, so I introduced a structure that holds them.

* Checking for zero src string has been moved a bit upwards, it is
before the locale data initialization now.

* To verify that the non-caching path works correct I added a test run
to localedata/sort-test.sh & localedata/xfrm-test.c where all strings
are patched up with spaces so that they are too large for the caching path.

(cherry picked from commit 0f9e585480edcdf1e30dc3d79e24b84aeee516fa)

Conflicts:
ChangeLog
NEWS
ChangeLog
NEWS
localedata/sort-test.sh
localedata/xfrm-test.c
string/strxfrm_l.c