]> git.sur5r.net Git - bacula/bacula/commitdiff
Fix Bacula PostgreSQL buffer overruns.
authorKern Sibbald <kern@sibbald.com>
Sat, 2 Jun 2007 14:53:17 +0000 (14:53 +0000)
committerKern Sibbald <kern@sibbald.com>
Sat, 2 Jun 2007 14:53:17 +0000 (14:53 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4969 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/cats/cats.h
bacula/src/cats/postgresql.c
bacula/src/stored/reserve.c
bacula/technotes-2.1

index c5428750ed6fa69b3605d4c6273470cb60c02594..007a795c83a4124c5cc688a3c5d14035b7a54e8a 100644 (file)
@@ -442,9 +442,11 @@ struct B_DB {
    POSTGRESQL_ROW row;
    POSTGRESQL_FIELD *fields;
    int num_rows;
+   int row_size;                  /* size of malloced rows */
    int num_fields;
-   int row_number;            /* what row number did we get via my_postgresql_data_seek? */
-   int field_number;          /* what field number did we get via my_postgresql_field_seek? */
+   int fields_size;               /* size of malloced fields */
+   int row_number;                /* row number from my_postgresql_data_seek */
+   int field_number;              /* field number from my_postgresql_field_seek */
    int ref_count;
    char *db_name;
    char *db_user;
index 1df2a398cc05b91876a8d7a95d610681c1e29f70..3c16f9ed0528781c93f77e7b3c46e2d429b75d33 100644 (file)
@@ -341,16 +341,15 @@ POSTGRESQL_ROW my_postgresql_fetch_row(B_DB *mdb)
 
    Dmsg0(500, "my_postgresql_fetch_row start\n");
 
-   if (mdb->row_number == -1 || mdb->row == NULL) {
+   if (!mdb->row || mdb->row_size < mdb->num_fields) {
       Dmsg1(500, "we have need space of %d bytes\n", sizeof(char *) * mdb->num_fields);
 
-      if (mdb->row != NULL) {
+      if (mdb->row) {
          Dmsg0(500, "my_postgresql_fetch_row freeing space\n");
          free(mdb->row);
-         mdb->row = NULL;
       }
-
       mdb->row = (POSTGRESQL_ROW) malloc(sizeof(char *) * mdb->num_fields);
+      mdb->row_size = mdb->num_fields;
 
       // now reset the row_number now that we have the space allocated
       mdb->row_number = 0;
@@ -406,9 +405,14 @@ POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb)
    int     i;
 
    Dmsg0(500, "my_postgresql_fetch_field starts\n");
-   if (mdb->fields == NULL) {
+
+   if (!mdb->fields || mdb->fields_size < mdb->num_fields) {
+      if (mdb->fields) {
+         free(mdb->fields);
+      }
       Dmsg1(500, "allocating space for %d fields\n", mdb->num_fields);
       mdb->fields = (POSTGRESQL_FIELD *)malloc(sizeof(POSTGRESQL_FIELD) * mdb->num_fields);
+      mdb->fields_size = mdb->num_fields;
 
       for (i = 0; i < mdb->num_fields; i++) {
          Dmsg1(500, "filling field %d\n", i);
index 3fb60b4340e81299579d7ebd4470078d0af20ef6..18371f7bc587d65a6bf59c9dfffb0c9f3aed48b9 100644 (file)
@@ -1242,7 +1242,6 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
       }
 
       /* Check for prefer mounted volumes */
-//    if (rctx.PreferMountedVols && !dev->VolHdr.VolumeName[0] && dev->is_tape()) {
       if (rctx.PreferMountedVols && !dev->vol && dev->is_tape()) {
          Mmsg(jcr->errmsg, _("3606 JobId=%u prefers mounted drives, but drive %s has no Volume.\n"), 
             jcr->JobId, dev->print_name());
@@ -1271,7 +1270,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
                jcr->JobId, rctx.VolumeName, dev->VolHdr.VolumeName, 
                dev->print_name());
             queue_reserve_message(jcr);
-            Dmsg4(dbglvl, "JobId=%u failed: dev have=%s resvol=%s want=%s\n",
+            Dmsg4(dbglvl, "JobId=%u not OK: dev have=%s resvol=%s want=%s\n",
                   (int)jcr->JobId, dev->VolHdr.VolumeName, 
                   dev->vol?dev->vol->vol_name:"*none*", rctx.VolumeName);
             return 0;
index b7ddb2e06b03c2254e2829b7d914759c3c425ad6..d7c58ee944b0ede99724fdac6b1ced4294870343 100644 (file)
@@ -2,6 +2,7 @@
 
 General:
 02Jun07
+kes  Fix Bacula PostgreSQL buffer overruns.
 kes  Do better checking for NULL results returned from PostgreSQL;
      implement retry for failed queries; clear results buffer after
      failed query. Hopefully this will correct the PostgreSQL failures.