libexpat before 2.8.3 has an out-of-bounds read and resultant infinite loop because low surrogates are treated the same as high surrogates during Unicode processing in the *_toUtf16 functions.
https://github.com/libexpat/libexpat/pull/1296
https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-54990