Author: turnstep
Date: Sat Mar  1 17:55:09 2008
New Revision: 10858

Modified:
   DBD-Pg/trunk/dbdimp.c

Log:
Fix for two strlen problems in dbdimp.c provided by Alexey Tourbin, per bug 
33737


Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c       (original)
+++ DBD-Pg/trunk/dbdimp.c       Sat Mar  1 17:55:09 2008
@@ -271,23 +271,21 @@
 static void pg_error (pTHX_ SV * h, ExecStatusType error_num, const char * 
error_msg)
 {
        D_imp_xxh(h);
-       char *      err;
+       size_t error_len;
        imp_dbh_t * imp_dbh = (imp_dbh_t *)(DBIc_TYPE(imp_xxh) == DBIt_ST ? 
DBIc_PARENT_COM(imp_xxh) : imp_xxh);
 
        if (TSTART) TRC(DBILOGFP, "%sBegin pg_error (message: %s number: %d)\n",
                                        THEADER, error_msg, error_num);
 
-       New(0, err, strlen(error_msg)+1, char); /* freed below */
-       strcpy(err, error_msg);
+       error_len = strlen(error_msg);
 
        /* Strip final newline so line number appears for warn/die */
-       if (err[strlen(err)] == 10)
-               err[strlen(err)] = '\0';
+       if (error_len > 0 && error_msg[error_len-1] == 10)
+               error_len--;
 
        sv_setiv(DBIc_ERR(imp_xxh), (IV)error_num);
-       sv_setpv(DBIc_ERRSTR(imp_xxh), (char*)err);
+       sv_setpvn(DBIc_ERRSTR(imp_xxh), (char*)error_msg, error_len);
        sv_setpv(DBIc_STATE(imp_xxh), (char*)imp_dbh->sqlstate);
-       Safefree(err);
 
        if (TEND) TRC(DBILOGFP, "%sEnd pg_error\n", THEADER);
 
@@ -1056,13 +1054,10 @@
                        PGresult *result;
                        int status = -1;
                        D_imp_dbh_from_sth;
-                       char *statement;
                        int nullable; /* 0 = not nullable, 1 = nullable 2 = 
unknown */
                        int y;
                        retsv = newRV(sv_2mortal((SV*)av));
 
-                       New(0, statement, 100, char); /* freed below */
-                       statement[0] = '\0';
                        while(--fields >= 0) {
                                nullable=2;
                                TRACE_PQFTABLE;
@@ -1070,9 +1065,9 @@
                                TRACE_PQFTABLECOL;
                                y = PQftablecol(imp_sth->result, fields);
                                if (InvalidOid != x && y > 0) { /* We know what 
table and column this came from */
-                                       sprintf(statement,
+                                       char statement[128];
+                                       snprintf(statement, sizeof(statement),
                                                        "SELECT attnotnull FROM 
pg_catalog.pg_attribute WHERE attrelid=%d AND attnum=%d", x, y);
-                                       statement[strlen(statement)]='\0';
                                        TRACE_PQEXEC;
                                        result = PQexec(imp_dbh->conn, 
statement);
                                        TRACE_PQRESULTSTATUS;
@@ -1097,7 +1092,6 @@
                                }
                                (void)av_store(av, fields, newSViv(nullable));
                        }
-                       Safefree(statement);
                }
                break;
 

Reply via email to