Обсуждение: Fwd: Segmentation fault on RelationGetDescr in my first extension
Hi!
I'm trying to write my first extension and open a table in it.
I use check_password_hook and my function executes at the moment of changing user password.
But if I try to open a table inside this function, I get Segmentation fault on the line with "RelationGetDescr".
What am I doing wrong?
void
_PG_init(void)
{
prev_check_password_hook = check_password_hook;
check_password_hook = check_password;
}
_PG_init(void)
{
prev_check_password_hook = check_password_hook;
check_password_hook = check_password;
}
...
void check_password(const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null)
{
Relation rel;
TupleDesc tupdesc;
int Natts;
Oid tbl_oid = DatumGetObjectId(DirectFunctionCall1(to_regclass, CStringGetTextDatum("my_test_table")));
if (OidIsValid(tbl_oid)) {
rel = table_open(tbl_oid, RowExclusiveLock);
tupdesc = RelationGetDescr(rel); // !!! server process (PID 70525) was terminated by signal 11: Segmentation fault
Natts = tupdesc->natts;
table_close(rel, RowExclusiveLock);
} else {
ereport(NOTICE, (errmsg("IndexRelationId (%d) is NOT valid !", tbl_oid)));
}
}
{
Relation rel;
TupleDesc tupdesc;
int Natts;
Oid tbl_oid = DatumGetObjectId(DirectFunctionCall1(to_regclass, CStringGetTextDatum("my_test_table")));
if (OidIsValid(tbl_oid)) {
rel = table_open(tbl_oid, RowExclusiveLock);
tupdesc = RelationGetDescr(rel); // !!! server process (PID 70525) was terminated by signal 11: Segmentation fault
Natts = tupdesc->natts;
table_close(rel, RowExclusiveLock);
} else {
ereport(NOTICE, (errmsg("IndexRelationId (%d) is NOT valid !", tbl_oid)));
}
}
Table is fine:
postgres=# \d my_test_table
Table "public.my_test_table"
Column | Type | Collation | Nullable | Default
--------+------+-----------+----------+---------
name | text | | |
Table "public.my_test_table"
Column | Type | Collation | Nullable | Default
--------+------+-----------+----------+---------
name | text | | |
At Thu, 29 Dec 2022 13:52:18 +0300, Дмитрий Цветков <dmitry.cvetkov@gmail.com> wrote in > I'm trying to write my first extension and open a table in it. > I use check_password_hook and my function executes at the moment of > changing user password. > > But if I try to open a table inside this function, I get Segmentation fault > on the line with "RelationGetDescr". > What am I doing wrong? table_open() should error out when it is going to return an invalid Relation*, and RelationGetDescr(rel) is "rel->rd_att". So the RelationGetDescr() cannot get a segv even if the table does not exist. # I modified contrib/passwordcheck that way and saw RelationGetDescr() # doesn't get segv in the shown context. I guess the segv comes from another place, or something else has broken memory until there. but anyway more information is needed for people to diagnose your situation more closely. regards. -- Kyotaro Horiguchi NTT Open Source Software Center