Fix a bug in extension_file_exists() - Mailing list pgsql-hackers

From Chao Li
Subject Fix a bug in extension_file_exists()
Date
Msg-id 362EA9B3-589B-475A-A16E-F10C30426E28@gmail.com
Whole thread Raw
Responses Re: Fix a bug in extension_file_exists()
List pgsql-hackers
Hi,

I just noticed a bug in extension_file_exists():

```
bool
extension_file_exists(const char *extensionName)
{
    bool        result = false;
    List       *locations;
    DIR           *dir;
    struct dirent *de;

    locations = get_extension_control_directories();

    foreach_ptr(char, location, locations) // <== Here type char is wrong
    {
        dir = AllocateDir(location);
```

get_extension_control_directories() returns a list of ExtensionLocation, but the loop iterates it as if it contained
char*, which is incorrect. As a result, AllocateDir() and ReadDir() are called with the wrong type. 

This bug is only triggered on an error path, when PostgreSQL is deciding whether to emit a hint. For example:
```
evantest=# create function f() returns int LANGUAGE plpython3u as $$return 1$$;
ERROR:  language "plpython3u" does not exist
```
No hint is printed.

With this patch applied:
```
evantest=# create function f() returns int LANGUAGE plpython3u as $$return 1$$;
ERROR:  language "plpython3u" does not exist
HINT:  Use CREATE EXTENSION to load the language into the database.
```
So the hint is shown as intended.

Attached is a patch fixing the iteration to use ExtensionLocation and location->loc consistently.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/





Attachment

pgsql-hackers by date:

Previous
From: Christoph Berg
Date:
Subject: Re: [PATCH] Add last_executed timestamp to pg_stat_statements
Next
From: Anthonin Bonnefoy
Date:
Subject: Re: Propagate XLogFindNextRecord error to callers