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