]> granicus.if.org Git - postgresql/commitdiff
Fix potential coredump in pg_conndefaults (assigning constant string
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 2 Oct 1998 01:37:17 +0000 (01:37 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 2 Oct 1998 01:37:17 +0000 (01:37 +0000)
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

index 620e4bcfe89f5a2a30950dee27f9dab8e91c7f55..563bd1768488aaaf9b44478d5fbaf04056b60436 100644 (file)
@@ -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;
 }