Code

data: Escape \ and " in strings when formatting them.
authorSebastian Harl <sh@tokkee.org>
Thu, 20 Feb 2014 20:36:46 +0000 (21:36 +0100)
committerSebastian Harl <sh@tokkee.org>
Thu, 20 Feb 2014 20:36:46 +0000 (21:36 +0100)
src/core/data.c
t/core/data_test.c

index 81b511b6c48fda961b51e9d770f13da415cabfac..54b6d282e6640d755e38457e4dbd497bb995fd32 100644 (file)
@@ -103,8 +103,24 @@ sdb_data_format(sdb_data_t *datum, sdb_strbuf_t *buf)
                                sdb_strbuf_append(buf, "\"NULL\"");
                                return 0;
                        }
-                       /* TODO: escape special characters */
-                       sdb_strbuf_append(buf, "\"%s\"", datum->data.string);
+                       {
+                               char tmp[2 * strlen(datum->data.string) + 1];
+                               size_t i, pos;
+
+                               pos = 0;
+                               for (i = 0; i < strlen(datum->data.string); ++i) {
+                                       char byte = datum->data.string[i];
+
+                                       if ((byte == '\\') || (byte == '"')) {
+                                               tmp[pos] = '\\';
+                                               ++pos;
+                                       }
+                                       tmp[pos] = byte;
+                                       ++pos;
+                               }
+                               tmp[pos] = '\0';
+                               sdb_strbuf_append(buf, "\"%s\"", tmp);
+                       }
                        break;
                case SDB_TYPE_DATETIME:
                        {
index a16d7fef891a287cec3444d0e5d74872097376f8..649a7df4bece545e9689953ec31ea39e52f55018 100644 (file)
@@ -155,6 +155,17 @@ START_TEST(test_format)
                        "sdb_data_format() used wrong format: %s; expected: %s",
                        string, expected);
 
+       datum.data.string = "now using special \\ \" characters";
+       sdb_strbuf_clear(buf);
+       check = sdb_data_format(&datum, buf);
+       fail_unless(! check,
+                       "sdb_data_format(STRING) = %d; expected: 0", check);
+       string = sdb_strbuf_string(buf);
+       expected = "\"now using special \\\\ \\\" characters\"";
+       fail_unless(! strcmp(string, expected),
+                       "sdb_data_format() used wrong format: %s; expected: %s",
+                       string, expected);
+
        datum.data.string = NULL;
        sdb_strbuf_clear(buf);
        check = sdb_data_format(&datum, buf);