Re: BUG #19382: Server crash at __nss_database_lookup - Mailing list pgsql-bugs

From surya poondla
Subject Re: BUG #19382: Server crash at __nss_database_lookup
Date
Msg-id CAOVWO5pbgCVx0zgTr1mxZug2hoGwxZOk+-Owvwg0jaQv9JE3Fw@mail.gmail.com
Whole thread
In response to Re: BUG #19382: Server crash at __nss_database_lookup  (surya poondla <suryapoondla4@gmail.com>)
Responses Re: BUG #19382: Server crash at __nss_database_lookup
List pgsql-bugs
Hi All,

CFBot on the commitfest asked me to rebase my code, and during the rebase (rebase to 17 Stable version) I realized my initial patch v1 might have a memory management issue.
When conversion of type was needed, the old record object was never properly freed, and the new record was being created in the wrong memory context. v2 fixes this by passing the record variable directly to convert_record_for_altered_type() and using assign_record_var() internally to replace a record variable and this way correctly frees the old value, transfers the new one into the right memory context.

Testing:
1) All 224 core regression tests pass
2) All 13 PL/pgSQL regression tests pass
3) All original test cases from the bug report produce correct results (same results as my v1 patch) (adding them here again for quick reference) and we no longer see the crash of the database.

psql (17.9)

Type "help" for help.


postgres=# DROP FUNCTION IF EXISTS bar();                                                                                         

DROP FUNCTION

postgres=#   DROP TYPE IF EXISTS foo CASCADE;                                                                                       

DROP TYPE

postgres=#   CREATE TYPE foo AS (a INT, b INT);                                                                                     

CREATE TYPE

postgres=#   CREATE FUNCTION bar() RETURNS RECORD AS $$                                                                             

postgres$#   DECLARE                                                                                                                

postgres$#       r foo := ROW(123, power(2, 30));                                                                                   

postgres$#   BEGIN                                                                                                                  

postgres$#       ALTER TYPE foo ALTER ATTRIBUTE b TYPE TEXT;

postgres$#       RETURN r;

postgres$#   END;

postgres$#   $$ LANGUAGE plpgsql;

CREATE FUNCTION

postgres=# SELECT bar();

       bar        

------------------

 (123,1073741824)

(1 row)


postgres=# DROP FUNCTION IF EXISTS bar1();

DROP FUNCTION

postgres=#   DROP TYPE IF EXISTS foo1 CASCADE;

DROP TYPE

postgres=#   CREATE TYPE foo1 AS (a INT, b INT);

CREATE TYPE

postgres=#   CREATE FUNCTION bar1(OUT r1 foo1) AS $$

postgres$#   BEGIN

postgres$#       r1 := ROW(1, 2);

postgres$#       ALTER TYPE foo1 ALTER ATTRIBUTE b TYPE TEXT;

postgres$#       RETURN;

postgres$#   END;

postgres$#   $$ LANGUAGE plpgsql;

CREATE FUNCTION

postgres=# SELECT bar1();

 bar1  

-------

 (1,2)

(1 row)


postgres=# DROP TYPE IF EXISTS foo2 CASCADE;

NOTICE:  drop cascades to function bar2()

DROP TYPE

postgres=#   CREATE TYPE foo2 AS (a INT, b TEXT);

CREATE TYPE

postgres=#   CREATE FUNCTION bar2() RETURNS foo2 AS $$

postgres$#   DECLARE

postgres$#       r foo2 := ROW(1, 'hello');

postgres$#   BEGIN

postgres$#       ALTER TYPE foo2 ALTER ATTRIBUTE b TYPE INT;

postgres$#       RETURN r;

postgres$#   END;

postgres$#   $$ LANGUAGE plpgsql;

CREATE FUNCTION

postgres=# SELECT bar2();

ERROR:  invalid input syntax for type integer: "hello"

CONTEXT:  PL/pgSQL function bar2() line 6 at RETURN

postgres=# quit

Regards,
Surya Poondla
Attachment

pgsql-bugs by date:

Previous
From: Fujii Masao
Date:
Subject: Re: basic_archive lost archive_directory
Next
From: yuanchao zhang
Date:
Subject: Re: BUG #19417: '\dD' fails to list user-defined domains that shadow built-in type names (e.g., 'numeric')