Skip to content

Commit 790a1f0

Browse files
authored
Don't assume output connection string has size MAX_CONNECT_STRING (#106)
1 parent e6bcc38 commit 790a1f0

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

dlg_specific.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -301,16 +301,22 @@ makeConnectString(char *connect_string, const ConnInfo *ci, UWORD len)
301301
char xaOptStr[16];
302302
#endif
303303
ssize_t hlen, nlen, olen;
304-
/*BOOL abbrev = (len <= 400);*/
305-
BOOL abbrev = (len < 1024) || 0 < ci->force_abbrev_connstr;
304+
BOOL abbrev;
306305
UInt4 flag;
307306

307+
if (len > MAX_CONNECT_STRING) {
308+
len = MAX_CONNECT_STRING;
309+
}
310+
311+
/*abbrev = (len <= 400);*/
312+
abbrev = (len < 1024) || 0 < ci->force_abbrev_connstr;
313+
308314
MYLOG(0, "%s row_versioning=%s\n", __FUNCTION__, ci->row_versioning);
309315

310316
MYLOG(DETAIL_LOG_LEVEL, "force_abbrev=%d abbrev=%d\n", ci->force_abbrev_connstr, abbrev);
311317
encode(ci->password, encoded_item, sizeof(encoded_item));
312318
/* fundamental info */
313-
nlen = MAX_CONNECT_STRING;
319+
nlen = len;
314320
olen = snprintf(connect_string, nlen, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s",
315321
got_dsn ? "DSN" : "DRIVER",
316322
got_dsn ? ci->dsn : ci->drivername,
@@ -327,7 +333,7 @@ MYLOG(DETAIL_LOG_LEVEL, "force_abbrev=%d abbrev=%d\n", ci->force_abbrev_connstr,
327333

328334
/* extra info */
329335
hlen = strlen(connect_string);
330-
nlen = MAX_CONNECT_STRING - hlen;
336+
nlen = len - hlen;
331337
MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
332338
if (!abbrev)
333339
{
@@ -474,7 +480,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
474480
ABBR_SSLMODE "=%s", abbrev_sslmode(ci->sslmode, abbrevmode, sizeof(abbrevmode)));
475481
}
476482
hlen = strlen(connect_string);
477-
nlen = MAX_CONNECT_STRING - hlen;
483+
nlen = len - hlen;
478484
olen = snprintf(&connect_string[hlen], nlen, ";"
479485
"%s" /* ABBR_CONNSETTINGS */
480486
ABBR_FETCH "=%d;"
@@ -505,7 +511,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
505511
if (olen < nlen || ci->rollback_on_error >= 0)
506512
{
507513
hlen = strlen(connect_string);
508-
nlen = MAX_CONNECT_STRING - hlen;
514+
nlen = len - hlen;
509515
/*
510516
* The PROTOCOL setting must be placed after CX flag
511517
* so that this option can override the CX setting.
@@ -525,7 +531,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
525531
if (0 != flag)
526532
{
527533
hlen = strlen(connect_string);
528-
nlen = MAX_CONNECT_STRING - hlen;
534+
nlen = len - hlen;
529535
olen = snprintf(&connect_string[hlen], nlen, ";"
530536
INI_EXTRAOPTIONS "=%x;",
531537
flag);

0 commit comments

Comments
 (0)