o From the submitter: dos2unixchr will convert to lower case if

LCASE_BASE or LCASE_EXT or both are set.  But dos2unixfn uses
dos2unixchr separately for the basename and the extension.  So if
either LCASE_BASE or LCASE_EXT is set, dos2unixfn will convert both
the basename and extension to lowercase because it is blindly
passing in the state of both flags to dos2unixchr.  The bit masks I
used ensure that only the state of LCASE_BASE gets passed to
dos2unixchr when the basename is converted, and only the state of
LCASE_EXT is passed in when the extension is converted.

PR:		kern/86655
Submitted by:	Micah Lieske
MFC after:	3 weeks
This commit is contained in:
Maxim Konovalov 2006-11-26 18:49:44 +00:00
parent 071fff62be
commit cc005bb92c

View File

@ -270,7 +270,8 @@ dos2unixfn(dn, un, lower, pmp)
* Copy the name portion into the unix filename string.
*/
for (i = 8; i > 0 && *dn != ' ';) {
c = dos2unixchr((const u_char **)&dn, &i, lower, pmp);
c = dos2unixchr((const u_char **)&dn, &i, lower & LCASE_BASE,
pmp);
if (c & 0xff00) {
*un++ = c >> 8;
thislong++;
@ -288,7 +289,8 @@ dos2unixfn(dn, un, lower, pmp)
*un++ = '.';
thislong++;
for (i = 3; i > 0 && *dn != ' ';) {
c = dos2unixchr((const u_char **)&dn, &i, lower, pmp);
c = dos2unixchr((const u_char **)&dn, &i,
lower & LCASE_EXT, pmp);
if (c & 0xff00) {
*un++ = c >> 8;
thislong++;