On Wed, 16 Nov 2022 07:03:12 GMT, Xue-Lei Andrew Fan <xue...@openjdk.org> wrote:

>> Hi,
>> 
>> May I have this update reviewed?
>> 
>> The sprintf is deprecated in Xcode 14 because of security concerns, and the 
>> use of it causing building failure.  The build could pass if warnings are 
>> disabled for codes that use sprintf method.  For the long run, the sprintf 
>> could be replaced with snprintf.  This patch is trying to check if snprintf 
>> could be used.
>> 
>> Thanks,
>> Xuelei
>
> Xue-Lei Andrew Fan has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   address review comments

src/hotspot/os/bsd/attachListener_bsd.cpp line 295:

> 293:             char msg[32];
> 294:             int msg_len = os::snprintf(msg, sizeof(msg), "%d\n", 
> ATTACH_ERROR_BADVERSION);
> 295:             write_fully(s, msg, msg_len);

Assuming C99 behavior: safe but only because the buffer is large enough ("%d\n" 
needs at most 12 bytes, buffer is 32). Were it to overflow, msg_len would be 
larger than sizeof(msg) and we would probably end up reading beyond the message 
end in write_fully. So not really better than using sprintf+strlen.

src/hotspot/os/bsd/attachListener_bsd.cpp line 415:

> 413:   char msg[32];
> 414:   int msg_len = os::snprintf(msg, sizeof(msg), "%d\n", result);
> 415:   int rc = BsdAttachListener::write_fully(this->socket(), msg, msg_len);

same

src/hotspot/share/adlc/output_c.cpp line 217:

> 215:     const PipeClassOperandForm *tmppipeopnd =
> 216:         (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
> 217:     templen += snprintf(&operand_stages[templen], operand_stages_size - 
> templen, "  stage_%s%c\n",

C99 Behavior: all these are probably safe but only because we never overstepped 
the buffer in the first place, the buffer size is pre-calculated. If it is 
incorrect and we have a truncation, subsequent writes will write beyond the 
buffer.

src/hotspot/share/classfile/javaClasses.cpp line 2527:

> 2525: 
> 2526:   // Print stack trace line in buffer
> 2527:   size_t buf_off = os::snprintf(buf, buf_size, "\tat %s.%s(", 
> klass_name, method_name);

Here, and in subsequent uses: assuming C99 behavior of snprintf, if we 
truncated in snprintf, buf_off will be > buffer size, (buf + buf_off) point 
beyond the buffer, (buf_size - buf_off) will overflow and become very large.

-------------

PR: https://git.openjdk.org/jdk/pull/11115

Reply via email to