RFR JDK-8007609
David Holmes
david.holmes at oracle.com
Tue Feb 12 01:33:16 UTC 2013
John,
I think the functional fix is okay but you have obscured it in so much
"cleanup" that it is hard to say with 100% certainty. Please leave
extensive cleanups to separate bugs - in this case I'm not seeing
improvements in readability in a number of places (indentation is odd)
and in at least one case you have made a change that violates the coding
guidelines you cite eg:
126 } else
127 len = 0;
The else should have been left as a block.
121 } else {
122 len = 0;
123 }
David
-----
On 9/02/2013 3:03 AM, John Zavgren wrote:
> Greetings:
> I posted a new webrev image:
> http://cr.openjdk.java.net/~jzavgren/8007609/webrev.03/
> <http://cr.openjdk.java.net/%7Ejzavgren/8007609/webrev.03/>
>
> The sole "functional" revision is contained in the following small code
> snippet:
>
> - /* retry with a buffer of the right size */
> - result = (WCHAR*)realloc(result, (len+1) * sizeof(WCHAR));
> - if (result != NULL) {
> - len = (*GetFinalPathNameByHandle_func)(h, result,
> len, 0);
> - } else {
> + /* retry the procedure with a buffer of the right size. */
> + WCHAR * newResult = (WCHAR*)realloc(result, (len+1) *
> sizeof(WCHAR));
> + if (newResult != NULL) {
> + result = newResult;
> + len = (*GetFinalPathNameByHandle_func)(h,
> newResult, len, 0);
> + } else
>
> and, the innovation is the use of a local variable to hold the attempted
> memory reallocation. This makes the code simpler and easier to understand.
>
> I introduced a huge number of additional changes in the file that are my
> attempt to make the file consistent with our style guidelines.
>
> Changes include:
> 1.) elimination of tab characters.
> 2.) spelling, punctuation, and grammar corrections in the comments.
> 3.) truncation of lines that exceed 80 characters
> 4.) correction of indentation, line wrapping, etc.
>
> I hope I haven't missed anything.
> http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html
>
>
> On 02/08/2013 05:45 AM, Chris Hegarty wrote:
>> Apologies, you are correct. I'll book an appointment with the optician!
>>
>> -Chris.
>>
>> On 08/02/2013 00:15, David Holmes wrote:
>>> On 7/02/2013 10:54 PM, Chris Hegarty wrote:
>>>> 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.
>>>
>>> Yes .... I don't see the problem
>>>
>>>>
>>>> 113 result = (WCHAR*)malloc(MAX_PATH * sizeof(WCHAR));
>>>> 114 if (result != NULL) {
>>>
>>> we've entered this block so we must free result evetually.
>>>
>>>> 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) {
>>>
>>> len was good so we've gone this path
>>>
>>>> 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
>>>
>>> malloc failed so we need to bail out. We will now skip to line 161
>>>
>>>> 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) {
>>>
>>> We reach here because len==0 and result != NULL
>>>
>>>> 162 free(result);
>>>> 163 result = NULL;
>>>> 164 }
>>>> 165 }
>>>
>>> Looks fine to me.
>>> David
>>>
>>>> -Chris.
>
>
More information about the core-libs-dev
mailing list