]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Change tsearch2 to not use the unsafe practice of creating functions
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 3 May 2005 16:51:22 +0000 (16:51 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 3 May 2005 16:51:22 +0000 (16:51 +0000)
that return INTERNAL without also having INTERNAL arguments.  Since the
functions in question aren't meant to be called by hand anyway, I just
redeclared them to take 'internal' instead of 'text'.  Also add code
to ProcedureCreate() to enforce the restriction, as I should have done
to start with :-(

contrib/tsearch2/gendict/sql.IN
contrib/tsearch2/tsearch.sql.in
contrib/tsearch2/untsearch.sql.in
src/backend/catalog/pg_proc.c

index ff0d8423999f4810d69816baa9225daee7345fb2..044230b4173f8689953450454512cee85d3a251d 100644 (file)
@@ -1,7 +1,7 @@
 SET search_path = public;
 BEGIN;
 
-HASINIT create function dinit_CFG_MODNAME(text)
+HASINIT create function dinit_CFG_MODNAME(internal)
 HASINIT         returns internal
 HASINIT         as 'MODULE_PATHNAME'
 HASINIT         language 'C';
index 35f96cd5cdb625243c3172c018772bf4b3538f3e..b51b049b9a865457311926431f3ff316ceef507f 100644 (file)
@@ -44,7 +44,7 @@ CREATE FUNCTION set_curdict(text)
        with (isstrict);
 
 --built-in dictionaries
-CREATE FUNCTION dex_init(text)
+CREATE FUNCTION dex_init(internal)
        returns internal
        as 'MODULE_PATHNAME' 
        language 'C';
@@ -57,13 +57,13 @@ CREATE FUNCTION dex_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
        'simple', 
-       'dex_init(text)',
+       'dex_init(internal)',
        null,
        'dex_lexize(internal,internal,int4)',
        'Simple example of dictionary.'
 ;
         
-CREATE FUNCTION snb_en_init(text)
+CREATE FUNCTION snb_en_init(internal)
        returns internal
        as 'MODULE_PATHNAME' 
        language 'C';
@@ -76,26 +76,26 @@ CREATE FUNCTION snb_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
        'en_stem', 
-       'snb_en_init(text)',
+       'snb_en_init(internal)',
        'contrib/english.stop',
        'snb_lexize(internal,internal,int4)',
        'English Stemmer. Snowball.'
 ;
 
-CREATE FUNCTION snb_ru_init(text)
+CREATE FUNCTION snb_ru_init(internal)
        returns internal
        as 'MODULE_PATHNAME' 
        language 'C';
 
 insert into pg_ts_dict select 
        'ru_stem', 
-       'snb_ru_init(text)',
+       'snb_ru_init(internal)',
        'contrib/russian.stop',
        'snb_lexize(internal,internal,int4)',
        'Russian Stemmer. Snowball.'
 ;
         
-CREATE FUNCTION spell_init(text)
+CREATE FUNCTION spell_init(internal)
        returns internal
        as 'MODULE_PATHNAME' 
        language 'C';
@@ -108,13 +108,13 @@ CREATE FUNCTION spell_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
        'ispell_template', 
-       'spell_init(text)',
+       'spell_init(internal)',
        null,
        'spell_lexize(internal,internal,int4)',
        'ISpell interface. Must have .dict and .aff files'
 ;
 
-CREATE FUNCTION syn_init(text)
+CREATE FUNCTION syn_init(internal)
        returns internal
        as 'MODULE_PATHNAME' 
        language 'C';
@@ -127,7 +127,7 @@ CREATE FUNCTION syn_lexize(internal,internal,int4)
 
 insert into pg_ts_dict select 
        'synonym', 
-       'syn_init(text)',
+       'syn_init(internal)',
        null,
        'syn_lexize(internal,internal,int4)',
        'Example of synonym dictionary'
index b1883d5fbdf083ced54b93bab60659d7c0b95890..2a658dfd933caac5e5d74f0329918c9db8d7fea1 100644 (file)
@@ -34,14 +34,14 @@ DROP FUNCTION lexize(text, text);
 DROP FUNCTION lexize(text);
 DROP FUNCTION set_curdict(int);
 DROP FUNCTION set_curdict(text);
-DROP FUNCTION dex_init(text);
+DROP FUNCTION dex_init(internal);
 DROP FUNCTION dex_lexize(internal,internal,int4);
-DROP FUNCTION snb_en_init(text);
+DROP FUNCTION snb_en_init(internal);
 DROP FUNCTION snb_lexize(internal,internal,int4);
-DROP FUNCTION snb_ru_init(text);
-DROP FUNCTION spell_init(text);
+DROP FUNCTION snb_ru_init(internal);
+DROP FUNCTION spell_init(internal);
 DROP FUNCTION spell_lexize(internal,internal,int4);
-DROP FUNCTION syn_init(text);
+DROP FUNCTION syn_init(internal);
 DROP FUNCTION syn_lexize(internal,internal,int4);
 DROP FUNCTION set_curprs(int);
 DROP FUNCTION set_curprs(text);
index a6a8632b9b6de813931cd97607fbac7453a160db..f33d8b4106b70780b1c9996919931e9236aa5829 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.122 2004/12/31 21:59:38 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.122.4.1 2005/05/03 16:51:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -72,6 +72,8 @@ ProcedureCreate(const char *procedureName,
                                const char *parameterNames[])
 {
        int                     i;
+       bool            genericParam = false;
+       bool            internalParam = false;
        Relation        rel;
        HeapTuple       tup;
        HeapTuple       oldtup;
@@ -102,29 +104,36 @@ ProcedureCreate(const char *procedureName,
 
        /*
         * Do not allow return type ANYARRAY or ANYELEMENT unless at least one
-        * argument is also ANYARRAY or ANYELEMENT
+        * input argument is ANYARRAY or ANYELEMENT.  Also, do not allow
+        * return type INTERNAL unless at least one input argument is INTERNAL.
         */
-       if (returnType == ANYARRAYOID || returnType == ANYELEMENTOID)
+       for (i = 0; i < parameterCount; i++)
        {
-               bool            genericParam = false;
-
-               for (i = 0; i < parameterCount; i++)
+               switch (parameterTypes[i])
                {
-                       if (parameterTypes[i] == ANYARRAYOID ||
-                               parameterTypes[i] == ANYELEMENTOID)
-                       {
+                       case ANYARRAYOID:
+                       case ANYELEMENTOID:
                                genericParam = true;
                                break;
-                       }
+                       case INTERNALOID:
+                               internalParam = true;
+                               break;
                }
-
-               if (!genericParam)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
-                                        errmsg("cannot determine result data type"),
-                                        errdetail("A function returning \"anyarray\" or \"anyelement\" must have at least one argument of either type.")));
        }
 
+       if ((returnType == ANYARRAYOID || returnType == ANYELEMENTOID)
+               && !genericParam)
+               ereport(ERROR,
+                               (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
+                                errmsg("cannot determine result data type"),
+                                errdetail("A function returning \"anyarray\" or \"anyelement\" must have at least one argument of either type.")));
+
+       if (returnType == INTERNALOID && !internalParam)
+               ereport(ERROR,
+                               (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
+                                errmsg("unsafe use of INTERNAL pseudo-type"),
+                                errdetail("A function returning \"internal\" must have at least one \"internal\" argument.")));
+
        /* Make sure we have a zero-padded param type array */
        MemSet(typev, 0, FUNC_MAX_ARGS * sizeof(Oid));
        if (parameterCount > 0)