Fix buffer allocations in encoding conversion routines so that they won't
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 28 Feb 2009 18:49:42 +0000 (18:49 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 28 Feb 2009 18:49:42 +0000 (18:49 +0000)
fail on zero-length inputs.  This isn't an issue in normal use because the
conversion infrastructure skips calling the converters for empty strings.
However a problem was created by yesterday's patch to check whether the
right conversion function is supplied in CREATE CONVERSION.  The most
future-proof fix seems to be to make the converters safe for this corner case.

src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c
src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c
src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c

index 11612701d11aeb88d057b0645de36d121a7b2f8b..83ba417770b50d2909849b72ffb1927d2d241017 100644 (file)
@@ -203,7 +203,7 @@ koi8r_to_win1251(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN1251);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        koi8r2mic(src, buf, len);
        mic2win1251(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -221,7 +221,7 @@ win1251_to_koi8r(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_KOI8R);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win12512mic(src, buf, len);
        mic2koi8r(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -239,7 +239,7 @@ koi8r_to_win866(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN866);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        koi8r2mic(src, buf, len);
        mic2win866(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -257,7 +257,7 @@ win866_to_koi8r(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_KOI8R);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win8662mic(src, buf, len);
        mic2koi8r(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -281,7 +281,7 @@ win866_to_win1251(PG_FUNCTION_ARGS)
         * not in KOI8R. As we use MULE_INTERNAL/KOI8R as an intermediary, we
         * will fail to convert those characters.
         */
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win8662mic(src, buf, len);
        mic2win1251(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -300,7 +300,7 @@ win1251_to_win866(PG_FUNCTION_ARGS)
        CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_WIN866);
 
        /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win12512mic(src, buf, len);
        mic2win866(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -318,7 +318,7 @@ iso_to_koi8r(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_KOI8R);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        iso2mic(src, buf, len);
        mic2koi8r(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -336,7 +336,7 @@ koi8r_to_iso(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_ISO_8859_5);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        koi8r2mic(src, buf, len);
        mic2iso(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -355,7 +355,7 @@ iso_to_win1251(PG_FUNCTION_ARGS)
        CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN1251);
 
        /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        iso2mic(src, buf, len);
        mic2win1251(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -374,7 +374,7 @@ win1251_to_iso(PG_FUNCTION_ARGS)
        CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_ISO_8859_5);
 
        /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win12512mic(src, buf, len);
        mic2iso(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -393,7 +393,7 @@ iso_to_win866(PG_FUNCTION_ARGS)
        CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN866);
 
        /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        iso2mic(src, buf, len);
        mic2win866(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -412,7 +412,7 @@ win866_to_iso(PG_FUNCTION_ARGS)
        CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_ISO_8859_5);
 
        /* Use mic/KOI8R as intermediary, see comment in win866_to_win1251() */
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win8662mic(src, buf, len);
        mic2iso(buf, dest, strlen((char *) buf));
        pfree(buf);
index b2267ab16702963f46e3e70c34aa6fd0e33fcaee..8129db3b9063d35f7923ad143b38426c295b2c64 100644 (file)
@@ -27,8 +27,6 @@
  */
 #include "sjis.map"
 
-#define ENCODING_GROWTH_RATE 4
-
 PG_MODULE_MAGIC;
 
 PG_FUNCTION_INFO_V1(euc_jp_to_sjis);
index 396c4fabe5da1d43834b60c8ccd04fb4a78833b5..b42e447566c278c5b4581944dac96ae48e9c12c9 100644 (file)
@@ -59,7 +59,7 @@ euc_tw_to_big5(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_BIG5);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        euc_tw2mic(src, buf, len);
        mic2big5(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -77,7 +77,7 @@ big5_to_euc_tw(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_EUC_TW);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        big52mic(src, buf, len);
        mic2euc_tw(buf, dest, strlen((char *) buf));
        pfree(buf);
index f3ebfb76abd478cd93ef4c4083c28fea6f098029..83e2d4194d28badf42ede78c33bdacc78e94d0b8 100644 (file)
@@ -115,7 +115,7 @@ latin2_to_win1250(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN2, PG_WIN1250);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        latin22mic(src, buf, len);
        mic2win1250(buf, dest, strlen((char *) buf));
        pfree(buf);
@@ -133,7 +133,7 @@ win1250_to_latin2(PG_FUNCTION_ARGS)
 
        CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1250, PG_LATIN2);
 
-       buf = palloc(len * ENCODING_GROWTH_RATE);
+       buf = palloc(len * ENCODING_GROWTH_RATE + 1);
        win12502mic(src, buf, len);
        mic2latin2(buf, dest, strlen((char *) buf));
        pfree(buf);