Skip to content

cast to unsigned char before isdigit in ar member parsing - #504

Open
fr-manvi wants to merge 1 commit into
google:mainfrom
fr-manvi:ar-isdigit-unsigned-char
Open

cast to unsigned char before isdigit in ar member parsing#504
fr-manvi wants to merge 1 commit into
google:mainfrom
fr-manvi:ar-isdigit-unsigned-char

Conversation

@fr-manvi

Copy link
Copy Markdown

Bloaty can open static .a archives, and ArFile::MemberReader::ReadMember reads the 16-byte member name straight out of the file. When a name begins with '/' the code calls isdigit(file_id[1]) to distinguish a long-filename reference from the symbol table and the long-name table. file_id[1] is a plain char, so on a platform where char is signed a name byte with the high bit set reaches isdigit as a negative int, and the ctype functions are only defined for arguments representable as unsigned char or EOF. I ran into it building a small .a by hand whose member name was "/\x80"; glibc happens to fold that to the correct answer, but a stricter CRT indexes its ctype table with the negative value and reads outside it. Casting to unsigned char before the call keeps the argument in range. This is the only ctype call in the tree, so nothing else needs the same fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant