| 1 | Index: fs.c
|
|---|
| 2 | ===================================================================
|
|---|
| 3 | --- fs.c (revision 3657)
|
|---|
| 4 | +++ fs.c (working copy)
|
|---|
| 5 | @@ -336,14 +336,14 @@
|
|---|
| 6 | /*
|
|---|
| 7 | * Setup the the executable path rewrite rule.
|
|---|
| 8 | */
|
|---|
| 9 | - PTIB pTib;
|
|---|
| 10 | + PTIB pTib;
|
|---|
| 11 | PPIB pPib;
|
|---|
| 12 | DosGetInfoBlocks(&pTib, &pPib);
|
|---|
| 13 | rc = DosQueryModuleName(pPib->pib_hmte, sizeof(__libc_gszExecPath), &__libc_gszExecPath[0]);
|
|---|
| 14 | - if (!rc)
|
|---|
| 15 | + if (!rc)
|
|---|
| 16 | {
|
|---|
| 17 | char *psz = strchr(&__libc_gszExecPath[0], '\0');
|
|---|
| 18 | - while ( psz > &__libc_gszExecPath[0]
|
|---|
| 19 | + while ( psz > &__libc_gszExecPath[0]
|
|---|
| 20 | && *psz != '\\'
|
|---|
| 21 | && *psz != '/'
|
|---|
| 22 | && *psz != ':')
|
|---|
| 23 | @@ -364,7 +364,7 @@
|
|---|
| 24 | ULONG ulBootDrive;
|
|---|
| 25 | if (DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof(ulBootDrive)))
|
|---|
| 26 | ulBootDrive = 'C' - 'A' - 1; /* A = 1 */
|
|---|
| 27 | - __libc_gszTmpDir[0] = __libc_gszSystemRoot[0] = __libc_gszSystemDrive[0]
|
|---|
| 28 | + __libc_gszTmpDir[0] = __libc_gszSystemRoot[0] = __libc_gszSystemDrive[0]
|
|---|
| 29 | = (char)ulBootDrive + 'A' - 1;
|
|---|
| 30 |
|
|---|
| 31 | /*
|
|---|
| 32 | @@ -1567,72 +1567,73 @@
|
|---|
| 33 | rc = -__libc_native2errno(rc);
|
|---|
| 34 | LIBCLOG_ERROR_RETURN_INT(rc);
|
|---|
| 35 | }
|
|---|
| 36 | - if (pEaOp2->fpFEA2List->cbList < LIBC_UNIX_EA_MIN)
|
|---|
| 37 | - LIBCLOG_RETURN_INT(0);
|
|---|
| 38 |
|
|---|
| 39 | /*
|
|---|
| 40 | - * Parse the result.
|
|---|
| 41 | + * Parse the result (unless there's none of the requested EAs returned at all).
|
|---|
| 42 | */
|
|---|
| 43 | - PFEA2 pFea2 = &pEaOp2->fpFEA2List->list[0];
|
|---|
| 44 | - for (;;)
|
|---|
| 45 | + if (pEaOp2->fpFEA2List->cbList > sizeof(FEA2))
|
|---|
| 46 | {
|
|---|
| 47 | - if (pFea2->cbValue > 0)
|
|---|
| 48 | + PFEA2 pFea2 = &pEaOp2->fpFEA2List->list[0];
|
|---|
| 49 | + for (;;)
|
|---|
| 50 | {
|
|---|
| 51 | + if (pFea2->cbValue > 0)
|
|---|
| 52 | + {
|
|---|
| 53 | #define COMPARE_EANAME(name) (pFea2->cbName == sizeof(name) - 1 && !memcmp(name, pFea2->szName, sizeof(name) - 1))
|
|---|
| 54 | - if (COMPARE_EANAME(__libc_gszSymlinkEA))
|
|---|
| 55 | - pStat->st_mode = (pStat->st_mode & ~S_IFMT) | S_IFLNK;
|
|---|
| 56 | - else
|
|---|
| 57 | - {
|
|---|
| 58 | - PUSHORT pusType = (PUSHORT)&pFea2->szName[pFea2->cbName + 1];
|
|---|
| 59 | - if (*pusType == EAT_BINARY)
|
|---|
| 60 | + if (COMPARE_EANAME(__libc_gszSymlinkEA))
|
|---|
| 61 | + pStat->st_mode = (pStat->st_mode & ~S_IFMT) | S_IFLNK;
|
|---|
| 62 | + else
|
|---|
| 63 | {
|
|---|
| 64 | - pusType++;
|
|---|
| 65 | - if (*pusType == sizeof(uint32_t))
|
|---|
| 66 | + PUSHORT pusType = (PUSHORT)&pFea2->szName[pFea2->cbName + 1];
|
|---|
| 67 | + if (*pusType == EAT_BINARY)
|
|---|
| 68 | {
|
|---|
| 69 | - uint32_t u32 = *(uint32_t *)++pusType;
|
|---|
| 70 | - if (COMPARE_EANAME(__libc_gszUidEA))
|
|---|
| 71 | - pStat->st_uid = u32;
|
|---|
| 72 | - else if (COMPARE_EANAME(__libc_gszGidEA))
|
|---|
| 73 | - pStat->st_gid = u32;
|
|---|
| 74 | - else if (COMPARE_EANAME(__libc_gszModeEA))
|
|---|
| 75 | + pusType++;
|
|---|
| 76 | + if (*pusType == sizeof(uint32_t))
|
|---|
| 77 | {
|
|---|
| 78 | - if ( S_ISDIR(u32) || S_ISCHR(u32) || S_ISBLK(u32) || S_ISREG(u32)
|
|---|
| 79 | - || S_ISFIFO(u32) || S_ISLNK(u32) || S_ISSOCK(u32) || S_ISWHT(u32))
|
|---|
| 80 | - pStat->st_mode = u32;
|
|---|
| 81 | + uint32_t u32 = *(uint32_t *)++pusType;
|
|---|
| 82 | + if (COMPARE_EANAME(__libc_gszUidEA))
|
|---|
| 83 | + pStat->st_uid = u32;
|
|---|
| 84 | + else if (COMPARE_EANAME(__libc_gszGidEA))
|
|---|
| 85 | + pStat->st_gid = u32;
|
|---|
| 86 | + else if (COMPARE_EANAME(__libc_gszModeEA))
|
|---|
| 87 | + {
|
|---|
| 88 | + if ( S_ISDIR(u32) || S_ISCHR(u32) || S_ISBLK(u32) || S_ISREG(u32)
|
|---|
| 89 | + || S_ISFIFO(u32) || S_ISLNK(u32) || S_ISSOCK(u32) || S_ISWHT(u32))
|
|---|
| 90 | + pStat->st_mode = u32;
|
|---|
| 91 | + else
|
|---|
| 92 | + LIBC_ASSERTM_FAILED("Invalid file mode EA: u32=0%o (st_mode=0%o)\n", u32, pStat->st_mode);
|
|---|
| 93 | + }
|
|---|
| 94 | + else if (COMPARE_EANAME(__libc_gszRDevEA))
|
|---|
| 95 | + pStat->st_rdev = u32;
|
|---|
| 96 | + else if (COMPARE_EANAME(__libc_gszGenEA))
|
|---|
| 97 | + pStat->st_gen = u32;
|
|---|
| 98 | + else if (COMPARE_EANAME(__libc_gszFlagsEA))
|
|---|
| 99 | + pStat->st_flags = u32;
|
|---|
| 100 | else
|
|---|
| 101 | - LIBC_ASSERTM_FAILED("Invalid file mode EA: u32=0%o (st_mode=0%o)\n", u32, pStat->st_mode);
|
|---|
| 102 | + LIBC_ASSERTM_FAILED("Huh?!? got an ea named '%s', namelen=%d! u32=%#x (%d)\n", pFea2->szName, pFea2->cbName, u32, u32);
|
|---|
| 103 | }
|
|---|
| 104 | - else if (COMPARE_EANAME(__libc_gszRDevEA))
|
|---|
| 105 | - pStat->st_rdev = u32;
|
|---|
| 106 | - else if (COMPARE_EANAME(__libc_gszGenEA))
|
|---|
| 107 | - pStat->st_gen = u32;
|
|---|
| 108 | - else if (COMPARE_EANAME(__libc_gszFlagsEA))
|
|---|
| 109 | - pStat->st_flags = u32;
|
|---|
| 110 | + else if (*pusType == sizeof(uint64_t))
|
|---|
| 111 | + {
|
|---|
| 112 | + uint64_t u64 = *(uint64_t *)++pusType;
|
|---|
| 113 | + if (COMPARE_EANAME(__libc_gszInoEA))
|
|---|
| 114 | + pStat->st_ino = u64;
|
|---|
| 115 | + else
|
|---|
| 116 | + LIBC_ASSERTM_FAILED("Huh?!? got an ea named '%s', namelen=%d! u64=%#llx (%lld)\n", pFea2->szName, pFea2->cbName, u64, u64);
|
|---|
| 117 | + }
|
|---|
| 118 | else
|
|---|
| 119 | - LIBC_ASSERTM_FAILED("Huh?!? got an ea named '%s', namelen=%d! u32=%#x (%d)\n", pFea2->szName, pFea2->cbName, u32, u32);
|
|---|
| 120 | + LIBC_ASSERTM_FAILED("Invalid LIBC EA! '%s' len=%#x and len=4 or 8.\n", pFea2->szName, *pusType);
|
|---|
| 121 | }
|
|---|
| 122 | - else if (*pusType == sizeof(uint64_t))
|
|---|
| 123 | - {
|
|---|
| 124 | - uint64_t u64 = *(uint64_t *)++pusType;
|
|---|
| 125 | - if (COMPARE_EANAME(__libc_gszInoEA))
|
|---|
| 126 | - pStat->st_ino = u64;
|
|---|
| 127 | - else
|
|---|
| 128 | - LIBC_ASSERTM_FAILED("Huh?!? got an ea named '%s', namelen=%d! u64=%#llx (%lld)\n", pFea2->szName, pFea2->cbName, u64, u64);
|
|---|
| 129 | - }
|
|---|
| 130 | else
|
|---|
| 131 | - LIBC_ASSERTM_FAILED("Invalid LIBC EA! '%s' len=%#x and len=4 or 8.\n", pFea2->szName, *pusType);
|
|---|
| 132 | + LIBC_ASSERTM_FAILED("Invalid LIBC EA! '%s' type=%#x len=%#x, expected type=%#x and len=4 or 8.\n",
|
|---|
| 133 | + pFea2->szName, pusType[0], pusType[1], EAT_BINARY);
|
|---|
| 134 | }
|
|---|
| 135 | - else
|
|---|
| 136 | - LIBC_ASSERTM_FAILED("Invalid LIBC EA! '%s' type=%#x len=%#x, expected type=%#x and len=4 or 8.\n",
|
|---|
| 137 | - pFea2->szName, pusType[0], pusType[1], EAT_BINARY);
|
|---|
| 138 | +#undef COMPARE_EANAME
|
|---|
| 139 | }
|
|---|
| 140 | -#undef COMPARE_EANAME
|
|---|
| 141 | +
|
|---|
| 142 | + /* next */
|
|---|
| 143 | + if (pFea2->oNextEntryOffset <= sizeof(FEA2))
|
|---|
| 144 | + break;
|
|---|
| 145 | + pFea2 = (PFEA2)((uintptr_t)pFea2 + pFea2->oNextEntryOffset);
|
|---|
| 146 | }
|
|---|
| 147 | -
|
|---|
| 148 | - /* next */
|
|---|
| 149 | - if (pFea2->oNextEntryOffset <= sizeof(FEA2))
|
|---|
| 150 | - break;
|
|---|
| 151 | - pFea2 = (PFEA2)((uintptr_t)pFea2 + pFea2->oNextEntryOffset);
|
|---|
| 152 | }
|
|---|
| 153 |
|
|---|
| 154 | /*
|
|---|