]> git.sur5r.net Git - bacula/bacula/commitdiff
Modify db_escape_string() to take both jcr and db.
authorDan Langille <dan@langille.org>
Wed, 12 Sep 2007 13:52:56 +0000 (13:52 +0000)
committerDan Langille <dan@langille.org>
Wed, 12 Sep 2007 13:52:56 +0000 (13:52 +0000)
This allows for better escaping of strings.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5534 91ce42f0-d328-0410-95d8-f526ca767f89

13 files changed:
bacula/src/cats/bdb.c
bacula/src/cats/mysql.c
bacula/src/cats/postgresql.c
bacula/src/cats/protos.h
bacula/src/cats/sql_create.c
bacula/src/cats/sql_get.c
bacula/src/cats/sqlite.c
bacula/src/dird/fd_cmds.c
bacula/src/dird/ua_query.c
bacula/src/dird/ua_restore.c
bacula/src/dird/verify.c
bacula/src/tools/dbcheck.c
bacula/technotes-2.3

index 60f57849ea8df70df7fbd1440a102eda22f16e45..d9862abab11eddc97f8c3ebe8bb488705c25882c 100644 (file)
@@ -307,7 +307,7 @@ void db_thread_cleanup()
 { }
 
 
-void db_escape_string(char *snew, char *old, int len)
+void db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len)
 {
    memset(snew, 0, len);
    bstrncpy(snew, old, len);
index 6242fc3753d4b42987aecea1bb2fd4dec1918321..a84fd502ef0e258a42f0f1bc27ed2523d5457c45 100644 (file)
@@ -295,62 +295,9 @@ int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index)
  *         the escaped output.
  */
 void
-db_escape_string(char *snew, char *old, int len)
+db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len)
 {
-   mysql_escape_string(snew, old, len);
-
-#ifdef xDO_IT_MYSELF
-
-/* Should use mysql_real_escape_string ! */
-unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length);
-
-   char *n, *o;
-
-   n = snew;
-   o = old;
-   while (len--) {
-      switch (*o) {
-      case 0:
-         *n++= '\\';
-         *n++= '0';
-         o++;
-         break;
-      case '\n':
-         *n++= '\\';
-         *n++= 'n';
-         o++;
-         break;
-      case '\r':
-         *n++= '\\';
-         *n++= 'r';
-         o++;
-         break;
-      case '\\':
-         *n++= '\\';
-         *n++= '\\';
-         o++;
-         break;
-      case '\'':
-         *n++= '\\';
-         *n++= '\'';
-         o++;
-         break;
-      case '"':
-         *n++= '\\';
-         *n++= '"';
-         o++;
-         break;
-      case '\032':
-         *n++= '\\';
-         *n++= 'Z';
-         o++;
-         break;
-      default:
-         *n++= *o++;
-      }
-   }
-   *n = 0;
-#endif
+   mysql_real_escape_string(jcr->db, snew, old, len);
 }
 
 /*
index ff73a9f9c5ba661ca9d623555ceaba6fba965d52..4a0d2d816ff42d5f7af8e83be017705b9c4fe7ca 100644 (file)
@@ -284,9 +284,17 @@ int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index)
  *         the escaped output.
  */
 void
-db_escape_string(char *snew, char *old, int len)
+db_escape_string(JCR *jcr, B_DB *mdb, char *snew, char *old, int len)
 {
-   PQescapeString(snew, old, len);
+   int error;
+  
+   PQescapeStringConn(mdb->db, snew, old, len, &error);
+   if (error) {
+      Jmsg(jcr, M_FATAL, 0, _("PQescapeStringConn returned non-zero.\n"));
+      /* error on encoding, probably invalid multibyte encoding in the source string
+        see PQescapeStringConn documentation for details. */
+      Dmsg0(500, "PQescapeStringConn failed\n");
+   }
 }
 
 /*
index c554a227442396134c56846c99525ce2c2d28e7f..43f1d984271561ea886fe6b03aeeb9a7717b02ba 100644 (file)
@@ -46,7 +46,7 @@ B_DB *db_init_database(JCR *jcr, const char *db_name, const char *db_user, const
                        int mult_db_connections);
 int  db_open_database(JCR *jcr, B_DB *db);
 void db_close_database(JCR *jcr, B_DB *db);
-void db_escape_string(char *snew, char *old, int len);
+void db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len);
 char *db_strerror(B_DB *mdb);
 int  db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index);
 int  db_sql_query(B_DB *mdb, const char *cmd, DB_RESULT_HANDLER *result_handler, void *ctx);
index 95d4afdf8564a2de8b087db4e2cb37c393ff0a87..b3b37726e291c45154e899eb6ad9acf8f405f8ff 100644 (file)
@@ -712,10 +712,10 @@ bool my_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
    char ed1[50];
 
    mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1);
-   db_escape_string(mdb->esc_name, mdb->fname, mdb->fnl);
+   db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl);
 
    mdb->esc_path = check_pool_memory_size(mdb->esc_path, mdb->pnl*2+1);
-   db_escape_string(mdb->esc_path, mdb->path, mdb->pnl);
+   db_escape_string(jcr, mdb, mdb->esc_path, mdb->path, mdb->pnl);
 
    if (ar->Digest == NULL || ar->Digest[0] == 0) {
       digest = "0";
@@ -994,7 +994,7 @@ static int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
    int stat;
 
    mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->pnl+2);
-   db_escape_string(mdb->esc_name, mdb->path, mdb->pnl);
+   db_escape_string(jcr, mdb, mdb->esc_name, mdb->path, mdb->pnl);
 
    if (mdb->cached_path_id != 0 && mdb->cached_path_len == mdb->pnl &&
        strcmp(mdb->cached_path, mdb->path) == 0) {
@@ -1064,8 +1064,8 @@ static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
    SQL_ROW row;
 
    mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->fnl+2);
-   db_escape_string(mdb->esc_name, mdb->fname, mdb->fnl);
-
+   db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl);
+   
    Mmsg(mdb->cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", mdb->esc_name);
 
    if (QUERY_DB(jcr, mdb, mdb->cmd)) {
index 438e3f788f9ae2c276dbd9831806729cf0b3d63f..981f10ab789af3d22aa99133de4f2ba420291346 100644 (file)
@@ -169,7 +169,7 @@ static int db_get_filename_record(JCR *jcr, B_DB *mdb)
    int FilenameId = 0;
 
    mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->fnl+2);
-   db_escape_string(mdb->esc_name, mdb->fname, mdb->fnl);
+   db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl);
 
    Mmsg(mdb->cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", mdb->esc_name);
    if (QUERY_DB(jcr, mdb, mdb->cmd)) {
@@ -213,7 +213,7 @@ static int db_get_path_record(JCR *jcr, B_DB *mdb)
    uint32_t PathId = 0;
 
    mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->pnl+2);
-   db_escape_string(mdb->esc_name, mdb->path, mdb->pnl);
+   db_escape_string(jcr, mdb, mdb->esc_name, mdb->path, mdb->pnl);
 
    if (mdb->cached_path_id != 0 && mdb->cached_path_len == mdb->pnl &&
        strcmp(mdb->cached_path, mdb->path) == 0) {
index 5f129f4f75ad71e2f040bbaccc5519c55d48bbe2..460fafe452ab4e173005c5656d8c2e2abd603604 100644 (file)
@@ -282,7 +282,7 @@ int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index)
  *         the escaped output.
  */
 void
-db_escape_string(char *snew, char *old, int len)
+db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len)
 {
    char *n, *o;
 
index 2e9e3e50148f4e4cd2c78b4dfdf15b71fa829020..3aa372472fc829bcb57f70ce0217fc1be076442e 100644 (file)
@@ -677,7 +677,7 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
          }
          ar->Digest = digest;
          ar->DigestType = crypto_digest_stream_type(stream);
-         db_escape_string(digest, Digest, strlen(Digest));
+         db_escape_string(jcr, jcr->db, digest, Digest, strlen(Digest));
          Dmsg4(dbglvl, "stream=%d DigestLen=%d Digest=%s type=%d\n", stream,
                strlen(digest), digest, ar->DigestType);
       }
index bd3202e300f76b2b3824306a5dcf1a1f679a465b..2ab55acb399f3ff17fe59f70d4ff16ea02683a07 100644 (file)
@@ -207,7 +207,7 @@ static POOLMEM *substitute_prompts(UAContext *ua,
                }
                len = strlen(ua->cmd);
                p = (char *)malloc(len * 2 + 1);
-               db_escape_string(p, ua->cmd, len);
+               db_escape_string(ua->jcr, ua->db, p, ua->cmd, len);
                subst[n] = p;
                olen = o - new_query;
                new_query = check_pool_memory_size(new_query, olen + strlen(p) + 10);
index 0320456e868db1d313cd9185d342ed18b1c360cc..9b0dc9090ddd01405d2e54a088e6336e5e9a28be 100644 (file)
@@ -58,7 +58,7 @@ static void free_name_list(NAME_LIST *name_list);
 static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *date);
 static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx);
 static void free_rx(RESTORE_CTX *rx);
-static void split_path_and_filename(RESTORE_CTX *rx, char *fname);
+static void split_path_and_filename(UAContext *ua, RESTORE_CTX *rx, char *fname);
 static int jobid_fileindex_handler(void *ctx, int num_fields, char **row);
 static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *file,
                                          char *date);
@@ -581,7 +581,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
          }
          len = strlen(ua->cmd);
          fname = (char *)malloc(len * 2 + 1);
-         db_escape_string(fname, ua->cmd, len);
+         db_escape_string(ua->jcr, ua->db, fname, ua->cmd, len);
          Mmsg(rx->query, uar_file, rx->ClientName, fname);
          free(fname);
          gui_save = ua->jcr->gui;
@@ -868,7 +868,7 @@ static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *f
                                         char *date)
 {
    strip_trailing_newline(file);
-   split_path_and_filename(rx, file);
+   split_path_and_filename(ua, rx, file);
    if (*rx->JobIds == 0) {
       Mmsg(rx->query, uar_jobid_fileindex, date, rx->path, rx->fname, 
            rx->ClientName);
@@ -939,7 +939,7 @@ static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *
    return true;
 }
 
-static void split_path_and_filename(RESTORE_CTX *rx, char *name)
+static void split_path_and_filename(UAContext *ua, RESTORE_CTX *rx, char *name)
 {
    char *p, *f;
 
@@ -968,7 +968,7 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *name)
    rx->fnl = p - f;
    if (rx->fnl > 0) {
       rx->fname = check_pool_memory_size(rx->fname, 2*(rx->fnl)+1);
-      db_escape_string(rx->fname, f, rx->fnl);
+      db_escape_string(ua->jcr, ua->db, rx->fname, f, rx->fnl);
    } else {
       rx->fname[0] = 0;
       rx->fnl = 0;
@@ -977,7 +977,7 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *name)
    rx->pnl = f - name;
    if (rx->pnl > 0) {
       rx->path = check_pool_memory_size(rx->path, 2*(rx->pnl)+1);
-      db_escape_string(rx->path, name, rx->pnl);
+      db_escape_string(ua->jcr, ua->db, rx->path, name, rx->pnl);
    } else {
       rx->path[0] = 0;
       rx->pnl = 0;
index 85651452b400a9aa03d5051029114deb39c82ba1..b5418d11add204a06c8508198cbee3012bcac975 100644 (file)
@@ -703,7 +703,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
             return false;
          }
          if (do_Digest != CRYPTO_DIGEST_NONE) {
-            db_escape_string(buf, Opts_Digest, strlen(Opts_Digest));
+            db_escape_string(jcr, jcr->db, buf, Opts_Digest, strlen(Opts_Digest));
             if (strcmp(buf, fdbr.Digest) != 0) {
                prt_fname(jcr);
                if (debug_level >= 10) {
index 1963931e64efa15aa34ea67c379744c0ebc07b1d..dafff136af50cf0e188131fb7e07e7999bacf05a 100644 (file)
@@ -611,7 +611,7 @@ static void eliminate_duplicate_filenames()
       /* Loop through list of duplicate names */
       for (int i=0; i<name_list.num_ids; i++) {
          /* Get all the Ids of each name */
-         db_escape_string(esc_name, name_list.name[i], strlen(name_list.name[i]));
+         db_escape_string(NULL, db, esc_name, name_list.name[i], strlen(name_list.name[i]));
          bsnprintf(buf, sizeof(buf), "SELECT FilenameId FROM Filename WHERE Name='%s'", esc_name);
          if (verbose > 1) {
             printf("%s\n", buf);
@@ -669,7 +669,7 @@ static void eliminate_duplicate_paths()
       /* Loop through list of duplicate names */
       for (int i=0; i<name_list.num_ids; i++) {
          /* Get all the Ids of each name */
-         db_escape_string(esc_name, name_list.name[i], strlen(name_list.name[i]));
+         db_escape_string(NULL, db, esc_name, name_list.name[i], strlen(name_list.name[i]));
          bsnprintf(buf, sizeof(buf), "SELECT PathId FROM Path WHERE Path='%s'", esc_name);
          if (verbose > 1) {
             printf("%s\n", buf);
@@ -1103,7 +1103,7 @@ static void repair_bad_filenames()
             esc_name[1] = 0;
          } else {
             name[len-1] = 0;
-            db_escape_string(esc_name, name, len);
+            db_escape_string(NULL, db, esc_name, name, len);
          }
          bsnprintf(buf, sizeof(buf),
             "UPDATE Filename SET Name='%s' WHERE FilenameId=%s",
@@ -1162,7 +1162,7 @@ static void repair_bad_paths()
          }
          /* Add trailing slash */
          len = pm_strcat(&name, "/");
-         db_escape_string(esc_name, name, len);
+         db_escape_string(NULL, db, esc_name, name, len);
          bsnprintf(buf, sizeof(buf), "UPDATE Path SET Path='%s' WHERE PathId=%s",
             esc_name, edit_int64(id_list.Id[i], ed1));
          if (verbose > 1) {
index 81abacb68589fd80da8b804a3a81908173592633..f23b5be0169645b042ddd1d9e8542c6821945008 100644 (file)
@@ -2,6 +2,8 @@
 
 General:
 12Sep07
+dvl  Pass jcr and db into db_escape_string() to enable better escaping
+     of strings
 kes  Fix migration code to get correct Volume name with multiple volumes 
      by skipping |.  Fixes bug #936.
 kes  Implement patch supplied by Landon to fix bug #944 where using