RFR JDK-8007609 (original) (raw)

Chris Hegarty chris.hegarty at oracle.com
Thu Feb 7 12:54:26 UTC 2013


On 02/07/2013 11:54 AM, David Holmes wrote:

....

AFAICS setting len=0 means len==0 will be true and so we will free(result). And if len != 0 then we will have already freed result, so avoiding a double-free.

Here's the code as it stands today.

113 result = (WCHAR*)malloc(MAX_PATH * sizeof(WCHAR)); 114 if (result != NULL) { 115 DWORD len = (GetFinalPathNameByHandle_func)(h, result, MAX_PATH, 0); 116 if (len >= MAX_PATH) { 117 / retry with a buffer of the right size / 118 result = (WCHAR)realloc(result, (len+1) * sizeof(WCHAR)); 119 if (result != NULL) { 120 len = (GetFinalPathNameByHandle_func)(h, result, len, 0); 121 } else { 122 len = 0; 123 } 124 } 125 if (len > 0) { 126 /* 127 * Strip prefix (should be \?\ or \?\UNC) 128 / 129 if (result[0] == L'\' && result[1] == L'\' && 130 result[2] == L'?' && result[3] == L'\') 131 { 132 int isUnc = (result[4] == L'U' && 133 result[5] == L'N' && 134 result[6] == L'C'); 135 int prefixLen = (isUnc) ? 7 : 4; 136 / actual result length (includes terminator) / 137 int resultLen = len - prefixLen + (isUnc ? 1 : 0) + 1; 138 139 / copy result without prefix into new buffer */ 140 WCHAR tmp = (WCHAR)malloc(resultLen * sizeof(WCHAR)); 141 if (tmp == NULL) { 142 len = 0; <<<<<<<<<<<<<<<<<<< HERE 143 } else { 144 WCHAR *p = result; 145 p += prefixLen; 146 if (isUnc) { 147 WCHAR p2 = tmp; 148 p2[0] = L'\'; 149 p2++; 150 wcscpy(p2, p); 151 } else { 152 wcscpy(tmp, p); 153 } 154 free(result); 155 result = tmp; 156 } 157 } 158 } 159 160 / unable to get final path */ 161 if (len == 0 && result != NULL) { 162 free(result); 163 result = NULL; 164 } 165 }

-Chris.



More information about the core-libs-dev mailing list