src/share/vm/utilities/ostream.cpp

changeset 9920
3a3803a0c789
parent 9906
0df63a32f7bb
child 9931
fd44df5e3bc3
equal deleted inserted replaced
9919:e8a0af9fc1cb 9920:3a3803a0c789
342 } 342 }
343 char* oldbuf = buffer; 343 char* oldbuf = buffer;
344 assert(rm == NULL || Thread::current()->current_resource_mark() == rm, 344 assert(rm == NULL || Thread::current()->current_resource_mark() == rm,
345 "stringStream is re-allocated with a different ResourceMark"); 345 "stringStream is re-allocated with a different ResourceMark");
346 buffer = NEW_RESOURCE_ARRAY(char, end); 346 buffer = NEW_RESOURCE_ARRAY(char, end);
347 strncpy(buffer, oldbuf, buffer_pos); 347 if (buffer_pos > 0) {
348 memcpy(buffer, oldbuf, buffer_pos);
349 }
348 buffer_length = end; 350 buffer_length = end;
349 } 351 }
350 } 352 }
351 // invariant: buffer is always null-terminated 353 // invariant: buffer is always null-terminated
352 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob"); 354 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
353 buffer[buffer_pos + write_len] = 0; 355 if (write_len > 0) {
354 strncpy(buffer + buffer_pos, s, write_len); 356 buffer[buffer_pos + write_len] = 0;
355 buffer_pos += write_len; 357 memcpy(buffer + buffer_pos, s, write_len);
358 buffer_pos += write_len;
359 }
356 360
357 // Note that the following does not depend on write_len. 361 // Note that the following does not depend on write_len.
358 // This means that position and count get updated 362 // This means that position and count get updated
359 // even when overflow occurs. 363 // even when overflow occurs.
360 update_position(s, len); 364 update_position(s, len);

mercurial