Skip to content

Commit 26f67ec

Browse files
committed
Fixes ecma_uint32_to_utf8_string that fill \0 at the end of string
Closes: jerryscript-project#5194 JerryScript-DCO-1.0-Signed-off-by: Yonggang Luo [email protected]
1 parent b7ce246 commit 26f67ec

26 files changed

+326
-367
lines changed

Diff for: jerry-core/api/jerry-snapshot.c

+18-16
Original file line numberDiff line numberDiff line change
@@ -187,21 +187,21 @@ snapshot_add_compiled_code (const ecma_compiled_code_t *compiled_code_p, /**< co
187187

188188
lit_utf8_size_t pattern_size = 0;
189189

190-
ECMA_STRING_TO_UTF8_STRING (pattern_string_p, buffer_p, buffer_size);
190+
ECMA_STRING_TO_UTF8_STRING (pattern_string_p, buffer);
191191

192-
pattern_size = buffer_size;
192+
pattern_size = buffer.size;
193193

194194
if (!snapshot_write_to_buffer_by_offset (snapshot_buffer_p,
195195
snapshot_buffer_size,
196196
&globals_p->snapshot_buffer_write_offset,
197-
buffer_p,
198-
buffer_size))
197+
buffer.ptr,
198+
buffer.size))
199199
{
200200
globals_p->snapshot_error = jerry_throw_sz (JERRY_ERROR_RANGE, jerry_string_sz (error_buffer_too_small_p));
201201
/* cannot return inside ECMA_FINALIZE_UTF8_STRING */
202202
}
203203

204-
ECMA_FINALIZE_UTF8_STRING (buffer_p, buffer_size);
204+
ECMA_FINALIZE_UTF8_STRING (buffer);
205205

206206
if (!ecma_is_value_empty (globals_p->snapshot_error))
207207
{
@@ -1481,15 +1481,15 @@ jerry_append_ecma_string_to_buffer (uint8_t *buffer_p, /**< buffer */
14811481
uint8_t *buffer_end_p, /**< the end of the buffer */
14821482
ecma_string_t *string_p) /**< ecma-string */
14831483
{
1484-
ECMA_STRING_TO_UTF8_STRING (string_p, str_buffer_p, str_buffer_size);
1484+
ECMA_STRING_TO_UTF8_STRING (string_p, str_buffer);
14851485

14861486
/* Append the string to the buffer. */
14871487
uint8_t *new_buffer_p = jerry_append_chars_to_buffer (buffer_p,
14881488
buffer_end_p,
1489-
(const jerry_char_t *) str_buffer_p,
1490-
(jerry_size_t) str_buffer_size);
1489+
(const jerry_char_t *) str_buffer.ptr,
1490+
(jerry_size_t) str_buffer.size);
14911491

1492-
ECMA_FINALIZE_UTF8_STRING (str_buffer_p, str_buffer_size);
1492+
ECMA_FINALIZE_UTF8_STRING (str_buffer);
14931493

14941494
return new_buffer_p;
14951495
} /* jerry_append_ecma_string_to_buffer */
@@ -1504,11 +1504,13 @@ jerry_append_number_to_buffer (uint8_t *buffer_p, /**< buffer */
15041504
uint8_t *buffer_end_p, /**< the end of the buffer */
15051505
lit_utf8_size_t number) /**< number */
15061506
{
1507-
lit_utf8_byte_t uint32_to_str_buffer[ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32];
1507+
lit_utf8_byte_t uint32_to_str_buffer[ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32_WITH_ZERO_TERMINATED];
15081508
lit_utf8_size_t utf8_str_size =
1509-
ecma_uint32_to_utf8_string (number, uint32_to_str_buffer, ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32);
1509+
ecma_uint32_to_utf8_string (number,
1510+
uint32_to_str_buffer,
1511+
ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32_WITH_ZERO_TERMINATED);
15101512

1511-
JERRY_ASSERT (utf8_str_size <= ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32);
1513+
JERRY_ASSERT (utf8_str_size < ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32_WITH_ZERO_TERMINATED);
15121514

15131515
return jerry_append_chars_to_buffer (buffer_p,
15141516
buffer_end_p,
@@ -1620,10 +1622,10 @@ jerry_get_literals_from_snapshot (const uint32_t *snapshot_p, /**< input snapsho
16201622
for (lit_utf8_size_t i = 0; i < literal_count; i++)
16211623
{
16221624
lit_buf_p = jerry_append_chars_to_buffer (lit_buf_p, buffer_end_p, JERRY_ZSTR_ARG (" \""));
1623-
ECMA_STRING_TO_UTF8_STRING (literal_array[i], str_buffer_p, str_buffer_size);
1624-
for (lit_utf8_size_t j = 0; j < str_buffer_size; j++)
1625+
ECMA_STRING_TO_UTF8_STRING (literal_array[i], str_buffer);
1626+
for (lit_utf8_size_t j = 0; j < str_buffer.size; j++)
16251627
{
1626-
uint8_t byte = str_buffer_p[j];
1628+
uint8_t byte = str_buffer.ptr[j];
16271629
if (byte < 32 || byte > 127)
16281630
{
16291631
lit_buf_p = jerry_append_chars_to_buffer (lit_buf_p, buffer_end_p, JERRY_ZSTR_ARG ("\\x"));
@@ -1642,7 +1644,7 @@ jerry_get_literals_from_snapshot (const uint32_t *snapshot_p, /**< input snapsho
16421644
}
16431645
}
16441646

1645-
ECMA_FINALIZE_UTF8_STRING (str_buffer_p, str_buffer_size);
1647+
ECMA_FINALIZE_UTF8_STRING (str_buffer);
16461648
lit_buf_p = jerry_append_chars_to_buffer (lit_buf_p, buffer_end_p, JERRY_ZSTR_ARG ("\""));
16471649

16481650
if (i < literal_count - 1)

Diff for: jerry-core/api/jerryscript.c

+16-30
Original file line numberDiff line numberDiff line change
@@ -384,14 +384,12 @@ jerry_parse_common (void *source_p, /**< script source */
384384
if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED) && options_p != NULL
385385
&& (options_p->options & JERRY_PARSE_HAS_SOURCE_NAME) && ecma_is_value_string (options_p->source_name))
386386
{
387-
ECMA_STRING_TO_UTF8_STRING (ecma_get_string_from_value (options_p->source_name),
388-
source_name_start_p,
389-
source_name_size);
387+
ECMA_STRING_TO_UTF8_STRING (ecma_get_string_from_value (options_p->source_name), source_name_start);
390388
jerry_debugger_send_string (JERRY_DEBUGGER_SOURCE_CODE_NAME,
391389
JERRY_DEBUGGER_NO_SUBTYPE,
392-
source_name_start_p,
393-
source_name_size);
394-
ECMA_FINALIZE_UTF8_STRING (source_name_start_p, source_name_size);
390+
source_name_start.ptr,
391+
source_name_start.size);
392+
ECMA_FINALIZE_UTF8_STRING (source_name_start);
395393
}
396394
#endif /* JERRY_DEBUGGER */
397395

@@ -892,12 +890,12 @@ jerry_native_module (jerry_native_module_evaluate_cb_t callback, /**< evaluation
892890

893891
bool valid_identifier = false;
894892

895-
ECMA_STRING_TO_UTF8_STRING (name_str_p, name_start_p, name_size);
893+
ECMA_STRING_TO_UTF8_STRING (name_str_p, name_start);
896894

897-
if (name_size > 0)
895+
if (name_start.size > 0)
898896
{
899-
const lit_utf8_byte_t *name_p = name_start_p;
900-
const lit_utf8_byte_t *name_end_p = name_start_p + name_size;
897+
const lit_utf8_byte_t *name_p = name_start.ptr;
898+
const lit_utf8_byte_t *name_end_p = name_start.ptr + name_start.size;
901899
lit_code_point_t code_point;
902900

903901
lit_utf8_size_t size = lit_read_code_point_from_cesu8 (name_p, name_end_p, &code_point);
@@ -923,7 +921,7 @@ jerry_native_module (jerry_native_module_evaluate_cb_t callback, /**< evaluation
923921
}
924922
}
925923

926-
ECMA_FINALIZE_UTF8_STRING (name_start_p, name_size);
924+
ECMA_FINALIZE_UTF8_STRING (name_start);
927925

928926
if (!valid_identifier)
929927
{
@@ -3035,10 +3033,10 @@ jerry_string_iterate (const jerry_value_t value,
30353033
}
30363034

30373035
ecma_string_t *str_p = ecma_get_string_from_value (value);
3038-
ECMA_STRING_TO_UTF8_STRING (str_p, buffer_p, buffer_size);
3036+
ECMA_STRING_TO_UTF8_STRING (str_p, buffer);
30393037

3040-
const lit_utf8_byte_t *current_p = buffer_p;
3041-
const lit_utf8_byte_t *end_p = buffer_p + buffer_size;
3038+
const lit_utf8_byte_t *current_p = buffer.ptr;
3039+
const lit_utf8_byte_t *end_p = buffer.ptr + buffer.size;
30423040

30433041
switch (encoding)
30443042
{
@@ -3082,7 +3080,7 @@ jerry_string_iterate (const jerry_value_t value,
30823080
break;
30833081
}
30843082
}
3085-
ECMA_FINALIZE_UTF8_STRING (buffer_p, buffer_size);
3083+
ECMA_FINALIZE_UTF8_STRING (buffer);
30863084
} /* jerry_string_iterate */
30873085

30883086
/**
@@ -5316,22 +5314,10 @@ jerry_log (jerry_log_level_t level, const char *format_p, ...)
53165314
case 'S':
53175315
{
53185316
jerry_value_t str = va_arg (vl, jerry_value_t);
5317+
53195318
ecma_string_t *string2_p = ecma_op_to_string (str);
5320-
lit_utf8_size_t cesu8_string2_size;
5321-
lit_utf8_size_t cesu8_string2_length;
5322-
lit_utf8_byte_t uint32_to_string_buffer[ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32];
5323-
uint8_t flags = ECMA_STRING_FLAG_EMPTY;
5324-
5325-
const lit_utf8_byte_t *cesu8_string2_p = ecma_string_get_chars (string2_p,
5326-
&cesu8_string2_size,
5327-
&cesu8_string2_length,
5328-
uint32_to_string_buffer,
5329-
&flags);
5330-
jerry_log_string (cesu8_string2_p, cesu8_string2_size);
5331-
if (flags & ECMA_STRING_FLAG_MUST_BE_FREED)
5332-
{
5333-
jmem_heap_free_block ((void *) cesu8_string2_p, cesu8_string2_size);
5334-
}
5319+
ECMA_STRING_TO_UTF8_STRING_FLAG_EMPTY (string2_p, cesu8_string2);
5320+
jerry_log_string (cesu8_string2.ptr, cesu8_string2.size);
53355321

53365322
ecma_deref_ecma_string (string2_p);
53375323
break;

Diff for: jerry-core/debugger/debugger.c

+13-11
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ jerry_debugger_copy_variables_to_string_message (uint8_t variable_type, /**< typ
335335
const size_t max_byte_count = JERRY_DEBUGGER_SEND_MAX (uint8_t);
336336
const size_t max_message_size = JERRY_DEBUGGER_SEND_SIZE (max_byte_count, uint8_t);
337337

338-
ECMA_STRING_TO_UTF8_STRING (value_str, str_buff, str_buff_size);
338+
ECMA_STRING_TO_UTF8_STRING (value_str, str_buff);
339339

340340
size_t str_size = 0;
341341
size_t str_limit = 255;
@@ -373,7 +373,7 @@ jerry_debugger_copy_variables_to_string_message (uint8_t variable_type, /**< typ
373373
}
374374
else
375375
{
376-
str_size = (str_buff_size > str_limit) ? str_limit : str_buff_size;
376+
str_size = (str_buff.size > str_limit) ? str_limit : str_buff.size;
377377
}
378378

379379
message_string_p->string[*buffer_pos] = (uint8_t) str_size;
@@ -384,7 +384,7 @@ jerry_debugger_copy_variables_to_string_message (uint8_t variable_type, /**< typ
384384
if (result)
385385
{
386386
size_t free_bytes = max_byte_count - *buffer_pos;
387-
const uint8_t *string_p = str_buff;
387+
const uint8_t *string_p = str_buff.ptr;
388388

389389
while (str_size > free_bytes)
390390
{
@@ -409,7 +409,7 @@ jerry_debugger_copy_variables_to_string_message (uint8_t variable_type, /**< typ
409409
}
410410
}
411411

412-
ECMA_FINALIZE_UTF8_STRING (str_buff, str_buff_size);
412+
ECMA_FINALIZE_UTF8_STRING (str_buff);
413413

414414
return result;
415415
} /* jerry_debugger_copy_variables_to_string_message */
@@ -614,9 +614,9 @@ jerry_debugger_send_eval (const lit_utf8_byte_t *eval_string_p, /**< evaluated s
614614

615615
ecma_string_t *string_p = ecma_get_string_from_value (message);
616616

617-
ECMA_STRING_TO_UTF8_STRING (string_p, buffer_p, buffer_size);
618-
jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_RESULT, type, buffer_p, buffer_size);
619-
ECMA_FINALIZE_UTF8_STRING (buffer_p, buffer_size);
617+
ECMA_STRING_TO_UTF8_STRING (string_p, buffer);
618+
jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_RESULT, type, buffer.ptr, buffer.size);
619+
ECMA_FINALIZE_UTF8_STRING (buffer);
620620

621621
ecma_free_value (message);
622622

@@ -1527,12 +1527,14 @@ jerry_debugger_send_exception_string (ecma_value_t exception_value)
15271527
string_p = ecma_op_to_string (exception_value);
15281528
}
15291529

1530-
ECMA_STRING_TO_UTF8_STRING (string_p, string_data_p, string_size);
1530+
ECMA_STRING_TO_UTF8_STRING (string_p, string_data);
15311531

1532-
bool result =
1533-
jerry_debugger_send_string (JERRY_DEBUGGER_EXCEPTION_STR, JERRY_DEBUGGER_NO_SUBTYPE, string_data_p, string_size);
1532+
bool result = jerry_debugger_send_string (JERRY_DEBUGGER_EXCEPTION_STR,
1533+
JERRY_DEBUGGER_NO_SUBTYPE,
1534+
string_data.ptr,
1535+
string_data.size);
15341536

1535-
ECMA_FINALIZE_UTF8_STRING (string_data_p, string_size);
1537+
ECMA_FINALIZE_UTF8_STRING (string_data);
15361538

15371539
ecma_deref_ecma_string (string_p);
15381540
return result;

Diff for: jerry-core/ecma/base/ecma-globals.h

+6
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,12 @@ typedef double ecma_number_t;
15011501
*/
15021502
#define ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32 10
15031503

1504+
/**
1505+
* Maximum number of characters in string representation of ecma-uint32 plus one.
1506+
* That is the '\0' terminator
1507+
*/
1508+
#define ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32_WITH_ZERO_TERMINATED (ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32 + 1)
1509+
15041510
/**
15051511
* String is not a valid array index.
15061512
*/

Diff for: jerry-core/ecma/base/ecma-helpers-conversion.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,8 @@ ecma_uint32_to_utf8_string (uint32_t value, /**< value to convert */
618618
lit_utf8_byte_t *out_buffer_p, /**< buffer for string */
619619
lit_utf8_size_t buffer_size) /**< size of buffer */
620620
{
621-
lit_utf8_byte_t *buf_p = out_buffer_p + buffer_size;
621+
lit_utf8_byte_t *buf_p_tail = out_buffer_p + buffer_size - 1;
622+
lit_utf8_byte_t *buf_p = buf_p_tail;
622623

623624
do
624625
{
@@ -631,12 +632,13 @@ ecma_uint32_to_utf8_string (uint32_t value, /**< value to convert */
631632

632633
JERRY_ASSERT (buf_p >= out_buffer_p);
633634

634-
lit_utf8_size_t bytes_copied = (lit_utf8_size_t) (out_buffer_p + buffer_size - buf_p);
635+
lit_utf8_size_t bytes_copied = (lit_utf8_size_t) (buf_p_tail - buf_p);
635636

636637
if (JERRY_LIKELY (buf_p != out_buffer_p))
637638
{
638639
memmove (out_buffer_p, buf_p, bytes_copied);
639640
}
641+
buf_p[bytes_copied] = '\0';
640642

641643
return bytes_copied;
642644
} /* ecma_uint32_to_utf8_string */
@@ -824,7 +826,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
824826
if (((ecma_number_t) num_uint32) == num)
825827
{
826828
dst_p += ecma_uint32_to_utf8_string (num_uint32, dst_p, (lit_utf8_size_t) (buffer_p + buffer_size - dst_p));
827-
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
829+
JERRY_ASSERT (dst_p < buffer_p + buffer_size);
828830
return (lit_utf8_size_t) (dst_p - buffer_p);
829831
}
830832

@@ -891,7 +893,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
891893

892894
dst_p += ecma_uint32_to_utf8_string (t, dst_p, (lit_utf8_size_t) (buffer_p + buffer_size - dst_p));
893895

894-
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
896+
JERRY_ASSERT (dst_p < buffer_p + buffer_size);
895897

896898
return (lit_utf8_size_t) (dst_p - buffer_p);
897899
} /* ecma_number_to_utf8_string */

0 commit comments

Comments
 (0)