atom: really work with non-NUL-terminated strings
authorRan Benita <ran234@gmail.com>
Mon, 22 Jul 2013 07:51:22 +0000 (10:51 +0300)
committerRan Benita <ran234@gmail.com>
Mon, 22 Jul 2013 08:02:20 +0000 (11:02 +0300)
Signed-off-by: Ran Benita <ran234@gmail.com>
src/atom.c
test/context.c

index cbc7a14..a7033c4 100644 (file)
@@ -210,7 +210,7 @@ atom_intern(struct atom_table *table, const char *string, size_t len,
     struct atom_node *node;
     unsigned int fingerprint;
 
-    if (!string)
+    if (!string || len == 0)
         return XKB_ATOM_NONE;
 
     if (find_node_pointer(table, string, len, &nodep, &fingerprint)) {
@@ -227,7 +227,7 @@ atom_intern(struct atom_table *table, const char *string, size_t len,
         node->string = UNCONSTIFY(string);
     }
     else {
-        node->string = strdup(string);
+        node->string = strndup(string, len);
         if (!node->string) {
             free(node);
             return XKB_ATOM_NONE;
index 63813f1..dc60888 100644 (file)
@@ -30,6 +30,7 @@ int
 main(void)
 {
     struct xkb_context *context = test_get_context(0);
+    xkb_atom_t atom;
 
     assert(context);
 
@@ -37,6 +38,14 @@ main(void)
     assert(!xkb_context_include_path_append(context, "¡NONSENSE!"));
     assert(xkb_context_num_include_paths(context) == 1);
 
+    atom = xkb_atom_intern(context, "HELLOjunkjunkjunk", 5);
+    assert(atom != XKB_ATOM_NONE);
+    assert(streq(xkb_atom_text(context, atom), "HELLO"));
+
+    atom = xkb_atom_intern_literal(context, "HELLOjunkjunkjunk");
+    assert(atom != XKB_ATOM_NONE);
+    assert(streq(xkb_atom_text(context, atom), "HELLOjunkjunkjunk"));
+
     xkb_context_unref(context);
 
     return 0;