From 820f9f8be8008832de9cf645027de0a8ba2595a1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 2 Oct 1998 01:37:17 +0000 Subject: [PATCH] Fix potential coredump in pg_conndefaults (assigning constant string to a field that will get free'd). Also make it robust in cases where values contain Tcl special characters. --- src/interfaces/libpgtcl/pgtclCmds.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/interfaces/libpgtcl/pgtclCmds.c b/src/interfaces/libpgtcl/pgtclCmds.c index 620e4bcfe8..563bd17684 100644 --- a/src/interfaces/libpgtcl/pgtclCmds.c +++ b/src/interfaces/libpgtcl/pgtclCmds.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.36 1998/10/01 01:45:38 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.37 1998/10/02 01:37:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -240,21 +240,23 @@ int Pg_conndefaults(ClientData cData, Tcl_Interp * interp, int argc, char **argv) { PQconninfoOption *option; - char buf[8192]; + Tcl_DString result; + char ibuf[32]; - Tcl_ResetResult(interp); + Tcl_DStringInit(&result); for (option = PQconndefaults(); option->keyword != NULL; option++) { - if (option->val == NULL) - option->val = ""; - sprintf(buf, "{%s} {%s} {%s} %d {%s}", - option->keyword, - option->label, - option->dispchar, - option->dispsize, - option->val); - Tcl_AppendElement(interp, buf); - } + char * val = option->val ? option->val : ""; + sprintf(ibuf, "%d", option->dispsize); + Tcl_DStringStartSublist(&result); + Tcl_DStringAppendElement(&result, option->keyword); + Tcl_DStringAppendElement(&result, option->label); + Tcl_DStringAppendElement(&result, option->dispchar); + Tcl_DStringAppendElement(&result, ibuf); + Tcl_DStringAppendElement(&result, val); + Tcl_DStringEndSublist(&result); + } + Tcl_DStringResult(interp, &result); return TCL_OK; } -- GitLab