Skip to content

NSCFString: fix lengthOfBytesUsingEncoding recursion and getCString encoding direction#60

Open
DTW-Thalion wants to merge 1 commit into
gnustep:masterfrom
DTW-Thalion:fix/nscfstring-encoding
Open

NSCFString: fix lengthOfBytesUsingEncoding recursion and getCString encoding direction#60
DTW-Thalion wants to merge 1 commit into
gnustep:masterfrom
DTW-Thalion:fix/nscfstring-encoding

Conversation

@DTW-Thalion

Copy link
Copy Markdown
Contributor

Summary

Two bugs in the bridged-CFString (NSCFString) encoding methods:

  1. lengthOfBytesUsingEncoding: called itself unconditionally:

    - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding) encoding
    {
      return [self lengthOfBytesUsingEncoding: encoding];   // infinite recursion
    }

    This recurses until the stack overflows. Implemented by converting the
    string with CFStringGetBytes and returning the number of bytes used.

  2. getCString:maxLength:encoding: converted its NSStringEncoding
    argument with CFStringConvertEncodingToNSStringEncoding (the CF→NS
    direction) before passing it to CFStringGetCString, which expects a
    CFStringEncoding. Use CFStringConvertNSStringEncodingToEncoding, the same
    direction the neighbouring methods (initWithBytes:,
    maximumLengthOfBytesUsingEncoding:, …) already use.

Test

Tests/CFString/bridge_encoding.m builds a bridged CFString and checks
lengthOfBytesUsingEncoding: (which previously crashed) and
getCString:maxLength:encoding:.

Note

dataUsingEncoding:allowLossyConversion: has the same reversed conversion, but
it cannot currently be exercised end-to-end because
CFStringCreateExternalRepresentation returns NULL for these encodings — a
separate issue, so it is left out of this change.

…ncoding

- lengthOfBytesUsingEncoding: called itself unconditionally, recursing
  until the stack overflowed.  Implement it by converting the string with
  CFStringGetBytes and returning the number of bytes used.
- getCString:maxLength:encoding: converted its NSStringEncoding argument
  with CFStringConvertEncodingToNSStringEncoding (the CF-to-NS direction)
  before passing it to CFStringGetCString, which expects a
  CFStringEncoding.  Use CFStringConvertNSStringEncodingToEncoding, as the
  neighbouring methods do.

Add Tests/CFString/bridge_encoding.m.
@DTW-Thalion DTW-Thalion force-pushed the fix/nscfstring-encoding branch from 5e062c0 to 95b6f5a Compare July 3, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant