Non-Unicde characters in an attachment name render a document unreadable.
-------------------------------------------------------------------------
Key: COUCHDB-254
URL: https://issues.apache.org/jira/browse/COUCHDB-254
Project: CouchDB
Issue Type: Bug
Components: Database Core
Affects Versions: 0.9
Environment: Linux, erlang, 12b-5, couchdb r791265
Reporter: Maximillian Dornseif
Priority: Critical
Attatchment names containing nun unicode characters can be created easily
because URI-s are (nearly) 8-bit clean. But when reading they are encoded into
utf-8 which doesn't work out. So you are left with unreadable database entries.
I was not able to generate invalid UTF-8 in JavaScript but a test case would
look somewhat like this:
--- couch_tests.js 2009-02-05 19:47:20.000000000 +0000
+++ /usr/local/share/couchdb/www/script/couch_tests.js 2009-02-13
21:34:23.000000000 +0000
@@ -1078,9 +1078,31 @@
var xhr = CouchDB.request("GET", "/test_suite_db/bin_doc4/attachment.txt");
T(xhr.status == 200);
T(xhr.responseText == "This is a string");
-
},
+ attatchment_names : function(debug) {
+ var db = new CouchDB("test_suite_db");
+ db.deleteDb();
+ db.createDb();
+ if (debug) debugger;
+
+ var binAttDoc = {
+ _id: "bin_doc",
+ _attachments:{
+ "foo\x80txt": {
+ content_type:"text/plain",
+ data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
+ }
+ }
+ }
+
+ var save_response = db.save(binAttDoc);
+ T(save_response.ok);
+
+ var xhr = CouchDB.request("GET", "/test_suite_db/bin_doc\x80foo.txt");
+ T(xhr.responseText == "This is a base64 encoded text");
+},
+
attachment_paths : function(debug) {
if (debug) debugger;
var dbNames = ["test_suite_db", "test_suite_db/with_slashes"];
A python script (fuzzer?) for triggering the bug looks like this:
import sys
import couchdb.client
COUCHSERVER = "http://localhost:5984"
COUCHDB_NAME = "md_test"
def _setup_couchdb():
"""Get a connection handler to the CouchDB Database, creating it when
needed."""
server = couchdb.client.Server(COUCHSERVER)
print "using %s/%s" % (COUCHSERVER, COUCHDB_NAME)
if COUCHDB_NAME in server:
return server[COUCHDB_NAME]
else:
return server.create(COUCHDB_NAME)
def main():
db = _setup_couchdb()
doc_id = "doc_id"
try:
doc = db[doc_id]
except couchdb.client.ResourceNotFound:
doc = {}
db[doc_id] = doc
for i in range(256):
char = chr(i)
name = "___%s___" % (char)
print "checking %r (%d) " % (char, i),
sys.stdout.flush()
db.put_attachment(db[doc_id], "data", name)
db[doc_id]
print '\r',
print
main()
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.