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 | /*
|
---|