Skip to content

Commit 25b0750

Browse files
committed
Fix problems arising from incorrect use of various size types
E.g., * `ssize_t` was used where `lit_utf8_size_t` or `jerry_api_size_t` would have been correct, * `lit_utf8_size_t` was used where `ecma_length_t` would have been correct. Note, the patch also includes internal and public API changes: * `ecma_string_to_utf8_string` does not return negative value if output buffer is not large enough to contain the string; the buffer is expected to be large enough. (`ecma_string_get_size` can be used to retrieve the required size.) * `jerry_api_string_to_char_buffer` adapts the same logic (and `jerry_api_get_string_size` can be used to determine the required size of the buffer). Related issue: #942 JerryScript-DCO-1.0-Signed-off-by: Akos Kiss [email protected]
1 parent ce2fc3c commit 25b0750

24 files changed

+228
-331
lines changed

docs/API-EXAMPLE.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,17 +192,14 @@ print_value (const jerry_api_value_t * value_p)
192192
// String value
193193
case JERRY_API_DATA_TYPE_STRING:
194194
{
195-
ssize_t neg_req_sz, sz;
195+
jerry_api_size_t req_sz, sz;
196196
// determining required buffer size
197-
neg_req_sz = jerry_api_string_to_char_buffer (value_p->v_string,
198-
NULL,
199-
0);
200-
assert (neg_req_sz < 0);
201-
char * str_buf_p = (char*) malloc (-neg_req_sz);
197+
req_sz = jerry_api_get_string_size (value_p->v_string);
198+
char * str_buf_p = (char*) malloc (req_sz);
202199
sz = jerry_api_string_to_char_buffer (value_p->v_string,
203200
str_buf_p,
204-
-neg_req_sz);
205-
assert (sz == -neg_req_sz);
201+
req_sz);
202+
assert (sz == req_sz);
206203
207204
printf ("%s", str_buf_p);
208205

docs/API-REFERENCE.md

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ Copy string characters to specified buffer, append zero character at end of the
290290
**Prototype**
291291

292292
```c
293-
ssize_t
293+
jerry_api_size_t
294294
jerry_api_string_to_char_buffer (const jerry_api_string_t * string_p,
295295
char * buffer_p,
296-
ssize_t buffer_size);
296+
jerry_api_size_t buffer_size);
297297
```
298298
299299
- `string_p` - pointer to a string;
@@ -319,15 +319,13 @@ jerry_api_string_to_char_buffer (const jerry_api_string_t * string_p,
319319
320320
if (is_string) {
321321
// neg_req_sz would be negative, as zero-size buffer is insufficient for any string
322-
ssize_t neg_req_sz = jerry_api_string_to_char_buffer (val.string_p,
323-
NULL,
324-
0);
325-
char * str_buf_p = (char*) malloc (-neg_req_sz);
322+
jerry_api_size_t req_sz = jerry_api_get_string_size (val.string_p);
323+
char * str_buf_p = (char*) malloc (req_sz);
326324
327325
// sz would be -neg_req_sz
328-
size_t sz = jerry_api_string_to_char_buffer (val.string_p,
329-
str_buf_p,
330-
-neg_req_sz);
326+
jerry_api_size_t sz = jerry_api_string_to_char_buffer (val.string_p,
327+
str_buf_p,
328+
req_sz);
331329
332330
printf ("%s", str_buf_p);
333331

jerry-core/ecma/base/ecma-helpers-conversion.c

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,7 @@ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
394394
return ECMA_NUMBER_ZERO;
395395
}
396396

397-
const ssize_t literal_len = end_p - begin_p + 1;
398-
399-
if (literal_len > 2
397+
if ((end_p >= begin_p + 2)
400398
&& begin_p[0] == dec_digits_range[0]
401399
&& (begin_p[1] == hex_x_chars[0]
402400
|| begin_p[1] == hex_x_chars[1]))
@@ -779,15 +777,15 @@ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
779777
*
780778
* @return number of bytes copied to buffer
781779
*/
782-
ssize_t
780+
lit_utf8_size_t
783781
ecma_uint32_to_utf8_string (uint32_t value, /**< value to convert */
784782
lit_utf8_byte_t *out_buffer_p, /**< buffer for string */
785-
ssize_t buffer_size) /**< size of buffer */
783+
lit_utf8_size_t buffer_size) /**< size of buffer */
786784
{
787785
const lit_utf8_byte_t digits[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
788786

789787
lit_utf8_byte_t *p = out_buffer_p + buffer_size - 1;
790-
size_t bytes_copied = 0;
788+
lit_utf8_size_t bytes_copied = 0;
791789

792790
do
793791
{
@@ -806,11 +804,10 @@ ecma_uint32_to_utf8_string (uint32_t value, /**< value to convert */
806804

807805
if (likely (p != out_buffer_p))
808806
{
809-
ssize_t bytes_to_move = out_buffer_p + buffer_size - p;
810-
memmove (out_buffer_p, p, (size_t) bytes_to_move);
807+
memmove (out_buffer_p, p, bytes_copied);
811808
}
812809

813-
return (ssize_t) bytes_copied;
810+
return bytes_copied;
814811
} /* ecma_uint32_to_utf8_string */
815812

816813
/**
@@ -1299,7 +1296,7 @@ ecma_number_to_decimal (ecma_number_t num, /**< ecma-number */
12991296
lit_utf8_size_t
13001297
ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
13011298
lit_utf8_byte_t *buffer_p, /**< buffer for utf-8 string */
1302-
ssize_t buffer_size) /**< size of buffer */
1299+
lit_utf8_size_t buffer_size) /**< size of buffer */
13031300
{
13041301
const lit_utf8_byte_t digits[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
13051302
const lit_utf8_byte_t e_chars[2] = { 'e', 'E' };
@@ -1323,14 +1320,14 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
13231320
// 2.
13241321
*dst_p++ = digits[0];
13251322

1326-
JERRY_ASSERT (dst_p - buffer_p <= (ssize_t) buffer_size);
1323+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
13271324
size = (lit_utf8_size_t) (dst_p - buffer_p);
13281325
}
13291326
else if (ecma_number_is_negative (num))
13301327
{
13311328
// 3.
13321329
*dst_p++ = minus_char;
1333-
ssize_t new_buffer_size = (buffer_size - (dst_p - buffer_p));
1330+
lit_utf8_size_t new_buffer_size = (lit_utf8_size_t) ((buffer_p + buffer_size) - dst_p);
13341331
size = 1 + ecma_number_to_utf8_string (ecma_number_negate (num), dst_p, new_buffer_size);
13351332
}
13361333
else if (ecma_number_is_infinity (num))
@@ -1349,7 +1346,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
13491346
uint32_t num_uint32 = ecma_number_to_uint32 (num);
13501347
if (ecma_uint32_to_number (num_uint32) == num)
13511348
{
1352-
size = (lit_utf8_size_t) ecma_uint32_to_utf8_string (num_uint32, dst_p, buffer_size);
1349+
size = ecma_uint32_to_utf8_string (num_uint32, dst_p, buffer_size);
13531350
}
13541351
else
13551352
{
@@ -1366,7 +1363,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
13661363
if (k <= n && n <= 21)
13671364
{
13681365
dst_p += n;
1369-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p) <= buffer_size);
1366+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
13701367

13711368
size = (lit_utf8_size_t) (dst_p - buffer_p);
13721369

@@ -1385,7 +1382,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
13851382
{
13861383
// 7.
13871384
dst_p += k + 1;
1388-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p) <= buffer_size);
1385+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
13891386

13901387
size = (lit_utf8_size_t) (dst_p - buffer_p);
13911388

@@ -1407,7 +1404,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
14071404
{
14081405
// 8.
14091406
dst_p += k - n + 1 + 1;
1410-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p) <= buffer_size);
1407+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
14111408

14121409
size = (lit_utf8_size_t) (dst_p - buffer_p);
14131410

@@ -1441,7 +1438,7 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
14411438
{
14421439
// 10.
14431440
dst_p += k + 1;
1444-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p) <= buffer_size);
1441+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
14451442

14461443
for (int32_t i = 0; i < k - 1; i++)
14471444
{
@@ -1457,14 +1454,14 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
14571454
}
14581455

14591456
// 9., 10.
1460-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p + 2) <= buffer_size);
1457+
JERRY_ASSERT (dst_p + 2 <= buffer_p + buffer_size);
14611458
*dst_p++ = e_chars[0];
14621459
*dst_p++ = (n >= 1) ? plus_char : minus_char;
14631460
int32_t t = (n >= 1) ? (n - 1) : -(n - 1);
14641461

14651462
if (t == 0)
14661463
{
1467-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p) <= buffer_size);
1464+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
14681465
*dst_p++ = digits[0];
14691466
}
14701467
else
@@ -1480,15 +1477,15 @@ ecma_number_to_utf8_string (ecma_number_t num, /**< ecma-number */
14801477

14811478
while (t_mod != 0)
14821479
{
1483-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p + 1) <= buffer_size);
1480+
JERRY_ASSERT (dst_p + 1 <= buffer_p + buffer_size);
14841481
*dst_p++ = digits[t / t_mod];
14851482

14861483
t -= (t / t_mod) * t_mod;
14871484
t_mod /= 10;
14881485
}
14891486
}
14901487

1491-
JERRY_ASSERT ((ssize_t) (dst_p - buffer_p) <= buffer_size);
1488+
JERRY_ASSERT (dst_p <= buffer_p + buffer_size);
14921489
size = (lit_utf8_size_t) (dst_p - buffer_p);
14931490
}
14941491

0 commit comments

Comments
 (0)