Message-ID: From: "r33s3n6 (@r33s3n6)" To: "postgresql-interfaces/psqlodbc" Date: Sat, 02 Nov 2024 08:39:39 +0000 Subject: [postgresql-interfaces/psqlodbc] PR #70: Fix PG_ErrorInfo and ER_ReturnError when error message is larger than 65535 bytes List-Id: X-GitHub-Author-Id: 14369640 X-GitHub-Author-Login: r33s3n6 X-GitHub-Issue: 70 X-GitHub-Repo: postgresql-interfaces/psqlodbc X-GitHub-State: merged X-GitHub-Type: pull_request X-GitHub-Url: https://github.com/postgresql-interfaces/psqlodbc/pull/70 Content-Type: text/plain; charset=utf-8 Old driver truncated the server error message incorrectly. ## old implementation environ.c:147: ```c error->errorsize = (Int2) errsize; ``` When `errsize` is larger than 32767, the errorsize is wrong. environ.c:204: ```c msglen = (SQLSMALLINT) strlen(msg); ``` `msglen` is truncated when msg is larger than 65535 bytes. environ.c:224: ```c RecNumber = 2 + (error->errorpos - 1) / error->recsize; ``` `errorpos` is used but never set. ## new implementaion In `PG_ErrorInfo`, makes `errsize`, `errpos` UInt4. ```c typedef struct { UInt4 status; UInt4 errsize; UInt4 errpos; UInt2 recsize; char sqlstate[6]; char __error_message[44]; } PG_ErrorInfo; ``` Fix `ER_Construct` and `ER_Dup` . In `ER_ReturnError`, makes `msglen`, `wrtlen`, `pcblen` UInt4, and set `errpos` correctly. ```c UInt4 stapos, msglen, wrtlen, pcblen; ``` ```c msglen = error->errsize; ``` ```c error->errpos = stapos + wrtlen; ```