Blob Blame History Raw
diff -ru enchant-1.4.2.orig/src/myspell/myspell_checker.cpp enchant-1.4.2/src/myspell/myspell_checker.cpp
--- enchant-1.4.2.orig/src/myspell/myspell_checker.cpp	2009-06-29 17:04:41.000000000 +0100
+++ enchant-1.4.2/src/myspell/myspell_checker.cpp	2009-06-29 17:25:40.000000000 +0100
@@ -341,6 +341,27 @@
     return g_file_test(aff.c_str(), G_FILE_TEST_EXISTS) != 0;
 }
 
+static bool is_plausible_dict_for_tag(const char *dir_entry, const char *tag)
+{
+    const char *dic_suffix = ".dic";
+    size_t dic_suffix_len = strlen(dic_suffix);
+    size_t dir_entry_len = strlen(dir_entry);
+    size_t tag_len = strlen(tag);
+
+    if (dir_entry_len - dic_suffix_len < tag_len)
+        return false;
+    if (strcmp(dir_entry+dir_entry_len-dic_suffix_len, dic_suffix) != 0)
+        return false;
+    if (strncmp (dir_entry, tag, tag_len) != 0)
+        return false;
+    //e.g. requested dict for "fi",
+    //reject "fil_PH.dic"
+    //allow "fi-FOO.dic", "fi_FOO.dic", "fi.dic", etc.
+    if (!ispunct(dir_entry[tag_len]))
+        return false;
+    return true;
+}
+
 static char *
 myspell_request_dictionary (EnchantBroker * broker, const char * tag) 
 {
@@ -364,14 +385,13 @@
 		if (dir) {
 			const char *dir_entry;
 			while ((dir_entry = g_dir_read_name (dir)) != NULL) {
-				if (strncmp (dir_entry, tag, strlen(tag)) == 0 &&
-				    strstr (dir_entry, ".dic") != NULL) {
+				if (is_plausible_dict_for_tag(dir_entry, tag)) {
 					char *dict = g_build_filename (dirs[i].c_str(), 
 								       dir_entry, NULL);
-                    if(s_hasCorrespondingAffFile(dict)){
-			                    g_dir_close (dir);
-					    return dict;
-                    }
+					if(s_hasCorrespondingAffFile(dict)){
+						g_dir_close (dir);
+						return dict;
+					}
 				}
 			}