| From: | Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> |
|---|---|
| To: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
| Cc: | Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, tfoertsch123(at)gmail(dot)com, kanbayashi(dot)dev(at)gmail(dot)com |
| Subject: | SERVICEFILE shows wrong file after servicefile fallback |
| Date: | 2026-06-02 13:42:23 |
| Message-ID: | 59DD1652-4EB5-449B-8DE3-959F06561A96@gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
While testing “psql: Add variable SERVICEFILE”, I found a small issue where SERVICEFILE may show the wrong value.
While tracing the code, I noticed there is a fallback path. If the service file specified in the connection string does not contain the requested service, libpq falls back to pg_service.conf. So I tested the following case:
1. Prepare two service files: one empty, and the other containing the service:
```
% mkdir -p /tmp/svc
% : > /tmp/svc/empty.conf
% printf '[actual]\n' > /tmp/svc/pg_service.conf
```
2. Run psql with a connection string and show SERVICEFILE:
```
% PGSYSCONFDIR=/tmp/svc psql "dbname=postgres service=actual servicefile=/tmp/svc/empty.conf"
psql (19beta1)
Type "help" for help.
postgres=# \echo :SERVICE :SERVICEFILE
actual /tmp/svc/empty.conf
```
Here, SERVICEFILE shows the empty file /tmp/svc/empty.conf, which is wrong because the actual service is read from /tmp/svc/pg_service.conf.
I think the bug was actually introduced by the previous commit 092f3c63efc6. In parseServiceFile(), if the service file has already been set in the connection options, it refuses to update the value, so the fallback service file is not synced to the connection options. Then SERVICEFILE is read from the connection options, which still contain the original file specified on the command line. So, SERVICEFILE just makes the bug visible.
The fix is simple, when fallback happens, explicitly store the actual service file into the connection options. See the attached patch for details.
With the fix, SERVICEFILE shows the actual service file:
```
% PGSYSCONFDIR=/tmp/svc psql "dbname=postgres service=actual servicefile=/tmp/svc/empty.conf"
psql (19beta1)
Type "help" for help.
postgres=# \echo :SERVICE :SERVICEFILE
actual /tmp/svc/pg_service.conf
```
Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/
| Attachment | Content-Type | Size |
|---|---|---|
| v1-0001-libpq-Report-correct-service-file-after-fallback.patch | application/octet-stream | 2.2 KB |
| From | Date | Subject | |
|---|---|---|---|
| Previous Message | Tobias Bussmann | 2026-06-02 12:49:54 | Re: Broken build on macOS (Universal / Intel): cpuid instruction not available |