Correct handling of MS-DOS reserved names.

This commit is contained in:
Andy McFadden 2006-02-19 01:15:42 +00:00
parent f87168ce85
commit 376b8c93d8
3 changed files with 21 additions and 7 deletions

View File

@ -683,7 +683,7 @@ BNYUnSqueeze(BNYArchive* pBny, BNYEntry* pEntry, FILE* outfp)
*/ */
Assert(kSqBufferSize > 1200); Assert(kSqBufferSize > 1200);
#ifdef FULL_SQ_HEADER #ifdef FULL_SQ_HEADER
err = USQReadShort(&usqState, &magic); err = USQReadShort(&usqState, (short*) &magic);
if (err != kNuErrNone) if (err != kNuErrNone)
goto bail; goto bail;
if (magic != kNuSQMagic) { if (magic != kNuSQMagic) {
@ -692,7 +692,7 @@ BNYUnSqueeze(BNYArchive* pBny, BNYEntry* pEntry, FILE* outfp)
goto bail; goto bail;
} }
err = USQReadShort(&usqState, &fileChecksum); err = USQReadShort(&usqState, (short*) &fileChecksum);
if (err != kNuErrNone) if (err != kNuErrNone)
goto bail; goto bail;

View File

@ -1,3 +1,9 @@
2006/02/18 ***** v2.1.1 shipped *****
2006/02/18 fadden
- Fix handling of MS-DOS reserved names. Besides handling names like
"con", we also need to handle "con.foo.txt".
2005/09/17 ***** v2.1.0 shipped ***** 2005/09/17 ***** v2.1.0 shipped *****
2004/10/11 ***** v2.0.3 shipped ***** 2004/10/11 ***** v2.0.3 shipped *****

View File

@ -115,6 +115,9 @@ UNIXNormalizeFileName(NulibState* pState, const char* srcp, long srcLen,
* a '_' (if we're not preserving filenames) or "%00" (if we are). The * a '_' (if we're not preserving filenames) or "%00" (if we are). The
* "%00" sequence gets stripped off during denormalization. * "%00" sequence gets stripped off during denormalization.
* *
* For some reason FAT is actually even more picky than that, insisting
* that files like "CON.FOO.TXT" are also illegal.
*
* The list comes from the Linux kernel's fs/msdos/namei.c. * The list comes from the Linux kernel's fs/msdos/namei.c.
*/ */
static const char* fatReservedNames3[] = { static const char* fatReservedNames3[] = {
@ -135,12 +138,14 @@ Win32NormalizeFileName(NulibState* pState, const char* srcp, long srcLen,
const char* startp = srcp; const char* startp = srcp;
static const char* kInvalid = "\\/:*?\"<>|"; static const char* kInvalid = "\\/:*?\"<>|";
/* look for an exact match */ /* look for a match on "aux" or "aux\..*" */
if (srcLen == 3) { if (srcLen >= 3) {
const char** ppcch; const char** ppcch;
for (ppcch = fatReservedNames3; *ppcch != nil; ppcch++) { for (ppcch = fatReservedNames3; *ppcch != nil; ppcch++) {
if (strncasecmp(srcp, *ppcch, srcLen) == 0) { if (strncasecmp(srcp, *ppcch, 3) == 0 &&
srcp[3] == '.' || srcLen == 3)
{
DBUG(("--- fixing '%s'\n", *ppcch)); DBUG(("--- fixing '%s'\n", *ppcch));
if (NState_GetModPreserveType(pState)) { if (NState_GetModPreserveType(pState)) {
*dstp++ = kForeignIndic; *dstp++ = kForeignIndic;
@ -151,11 +156,14 @@ Win32NormalizeFileName(NulibState* pState, const char* srcp, long srcLen,
break; break;
} }
} }
} else if (srcLen == 4) { }
if (srcLen >= 4) {
const char** ppcch; const char** ppcch;
for (ppcch = fatReservedNames4; *ppcch != nil; ppcch++) { for (ppcch = fatReservedNames4; *ppcch != nil; ppcch++) {
if (strncasecmp(srcp, *ppcch, srcLen) == 0) { if (strncasecmp(srcp, *ppcch, 4) == 0 &&
srcp[4] == '.' || srcLen == 4)
{
DBUG(("--- fixing '%s'\n", *ppcch)); DBUG(("--- fixing '%s'\n", *ppcch));
if (NState_GetModPreserveType(pState)) { if (NState_GetModPreserveType(pState)) {
*dstp++ = kForeignIndic; *dstp++ = kForeignIndic;