1
1
/* -----------------------------------------------------------------------
2
2
* formatting.c
3
3
*
4
- * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.151 2008/12/01 17:11:18 heikki Exp $
4
+ * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.152 2008/12/15 14:55:50 tgl Exp $
5
5
*
6
6
*
7
7
* Portions Copyright (c) 1999-2008, PostgreSQL Global Development Group
@@ -1461,7 +1461,14 @@ str_tolower(const char *buff, size_t nbytes)
1461
1461
if (pg_database_encoding_max_length () > 1 && !lc_ctype_is_c ())
1462
1462
{
1463
1463
wchar_t * workspace ;
1464
- int curr_char = 0 ;
1464
+ size_t curr_char ;
1465
+ size_t result_size ;
1466
+
1467
+ /* Overflow paranoia */
1468
+ if ((nbytes + 1 ) > (INT_MAX / sizeof (wchar_t )))
1469
+ ereport (ERROR ,
1470
+ (errcode (ERRCODE_OUT_OF_MEMORY ),
1471
+ errmsg ("out of memory" )));
1465
1472
1466
1473
/* Output workspace cannot have more codes than input bytes */
1467
1474
workspace = (wchar_t * ) palloc ((nbytes + 1 ) * sizeof (wchar_t ));
@@ -1472,9 +1479,10 @@ str_tolower(const char *buff, size_t nbytes)
1472
1479
workspace [curr_char ] = towlower (workspace [curr_char ]);
1473
1480
1474
1481
/* Make result large enough; case change might change number of bytes */
1475
- result = palloc (curr_char * MB_CUR_MAX + 1 );
1482
+ result_size = curr_char * pg_database_encoding_max_length () + 1 ;
1483
+ result = palloc (result_size );
1476
1484
1477
- wchar2char (result , workspace , curr_char * MB_CUR_MAX + 1 );
1485
+ wchar2char (result , workspace , result_size );
1478
1486
pfree (workspace );
1479
1487
}
1480
1488
else
@@ -1509,7 +1517,14 @@ str_toupper(const char *buff, size_t nbytes)
1509
1517
if (pg_database_encoding_max_length () > 1 && !lc_ctype_is_c ())
1510
1518
{
1511
1519
wchar_t * workspace ;
1512
- int curr_char = 0 ;
1520
+ size_t curr_char ;
1521
+ size_t result_size ;
1522
+
1523
+ /* Overflow paranoia */
1524
+ if ((nbytes + 1 ) > (INT_MAX / sizeof (wchar_t )))
1525
+ ereport (ERROR ,
1526
+ (errcode (ERRCODE_OUT_OF_MEMORY ),
1527
+ errmsg ("out of memory" )));
1513
1528
1514
1529
/* Output workspace cannot have more codes than input bytes */
1515
1530
workspace = (wchar_t * ) palloc ((nbytes + 1 ) * sizeof (wchar_t ));
@@ -1520,9 +1535,10 @@ str_toupper(const char *buff, size_t nbytes)
1520
1535
workspace [curr_char ] = towupper (workspace [curr_char ]);
1521
1536
1522
1537
/* Make result large enough; case change might change number of bytes */
1523
- result = palloc (curr_char * MB_CUR_MAX + 1 );
1538
+ result_size = curr_char * pg_database_encoding_max_length () + 1 ;
1539
+ result = palloc (result_size );
1524
1540
1525
- wchar2char (result , workspace , curr_char * MB_CUR_MAX + 1 );
1541
+ wchar2char (result , workspace , result_size );
1526
1542
pfree (workspace );
1527
1543
}
1528
1544
else
@@ -1558,7 +1574,14 @@ str_initcap(const char *buff, size_t nbytes)
1558
1574
if (pg_database_encoding_max_length () > 1 && !lc_ctype_is_c ())
1559
1575
{
1560
1576
wchar_t * workspace ;
1561
- int curr_char = 0 ;
1577
+ size_t curr_char ;
1578
+ size_t result_size ;
1579
+
1580
+ /* Overflow paranoia */
1581
+ if ((nbytes + 1 ) > (INT_MAX / sizeof (wchar_t )))
1582
+ ereport (ERROR ,
1583
+ (errcode (ERRCODE_OUT_OF_MEMORY ),
1584
+ errmsg ("out of memory" )));
1562
1585
1563
1586
/* Output workspace cannot have more codes than input bytes */
1564
1587
workspace = (wchar_t * ) palloc ((nbytes + 1 ) * sizeof (wchar_t ));
@@ -1575,9 +1598,10 @@ str_initcap(const char *buff, size_t nbytes)
1575
1598
}
1576
1599
1577
1600
/* Make result large enough; case change might change number of bytes */
1578
- result = palloc (curr_char * MB_CUR_MAX + 1 );
1601
+ result_size = curr_char * pg_database_encoding_max_length () + 1 ;
1602
+ result = palloc (result_size );
1579
1603
1580
- wchar2char (result , workspace , curr_char * MB_CUR_MAX + 1 );
1604
+ wchar2char (result , workspace , result_size );
1581
1605
pfree (workspace );
1582
1606
}
1583
1607
else
0 commit comments