diff options
-rw-r--r-- | rdiff-backup/rdiff_backup/cmodule.c | 16 | ||||
-rw-r--r-- | rdiff-backup/testing/ctest.py | 11 |
2 files changed, 19 insertions, 8 deletions
diff --git a/rdiff-backup/rdiff_backup/cmodule.c b/rdiff-backup/rdiff_backup/cmodule.c index a5f1c65..6fafde7 100644 --- a/rdiff-backup/rdiff_backup/cmodule.c +++ b/rdiff-backup/rdiff_backup/cmodule.c @@ -283,23 +283,25 @@ int high_water_alloc(void **buf, size_t *bufsize, size_t newsize) const char *quote(const char *str) { - static char *quoted_str; - static size_t quoted_str_len; + static char *quoted_str = NULL; + static size_t quoted_str_len = 0; const unsigned char *s; char *q; - size_t nonpr; + size_t nonpr, total_len; if (!str) return str; - for (nonpr = 0, s = (unsigned char *)str; *s != '\0'; s++) - if (!isprint(*s) || isspace(*s) || *s == '\\' || *s == '=') - nonpr++; + for (nonpr = 0, s = (unsigned char *)str, total_len = 0; + *s != '\0'; s++, total_len++) { + if (!isprint(*s) || isspace(*s) || *s == '\\' || *s == '=') + nonpr++; + } if (nonpr == 0) return str; if (high_water_alloc((void **)"ed_str, "ed_str_len, - nonpr * 3 + 1)) + nonpr * 3 + total_len + 1)) return NULL; for (s = (unsigned char *)str, q = quoted_str; *s != '\0'; s++) { if (!isprint(*s) || isspace(*s) || *s == '\\' || *s == '=') { diff --git a/rdiff-backup/testing/ctest.py b/rdiff-backup/testing/ctest.py index 2f11b1f..399c43d 100644 --- a/rdiff-backup/testing/ctest.py +++ b/rdiff-backup/testing/ctest.py @@ -48,6 +48,15 @@ class CTest(unittest.TestCase): assert C.acl_unquote('\\012') == '\n' s = '\\\n\t\145\n\01==' assert C.acl_unquote(C.acl_quote(s)) == s - + + def test_acl_quoting2(self): + """This string used to segfault the quoting code, try now""" + s = '\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xf4\x0f!\xf9>\xe2Y\x86\xbb\xab\xdbp\xb0\x84\x13k\x1d\xc2\xf1\xf5e\xa5U\x82\x9aUV\xa0\xf4\xdf4\xba\xfdX\x03\x82\x07s\xce\x9e\x8b\xb34\x04\x9f\x17 \xf4\x8f\xa6\xfa\x97\xab\xd8\xac\xda\x85\xdcKvC\xfa#\x94\x92\x9e\xc9\xb7\xc3_\x0f\x84g\x9aB\x11<=^\xdbM\x13\x96c\x8b\xa7|*"\\\'^$@#!(){}?+ ~` ' + quoted = C.acl_quote(s) + assert C.acl_unquote(quoted) == s + + def test_acl_quoting_equals(self): + """Make sure the equals character is quoted""" + assert C.acl_quote('=') != '=' if __name__ == "__main__": unittest.main() |