~ubuntu-branches/ubuntu/oneiric/firebird2.5/oneiric-security

« back to all changes in this revision

Viewing changes to src/jrd/unicode_util.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Damyan Ivanov
  • Date: 2011-04-23 11:14:47 UTC
  • mfrom: (15.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20110423111447-liopox8hmj2yb5po
Tags: 2.5.0.26074-0.ds4-5
* watch: protect against 'ReleaseCandidate' in versions
* add a patch from upstream SVN fixing loading of ICU routines
* disable fix_kfreebsd_amd64_miscompile.patch
* link fbtrace with ICU and libpthreads
* drop lintian overrides about manpages in dependency package
* claim conformance to Policy 3.9.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
61
61
        ICU& operator =(const ICU&);    // not implemented
62
62
 
63
63
public:
64
 
        ICU()
65
 
                : inModule(NULL), ucModule(NULL)
 
64
        ICU(int aMajorVersion, int aMinorVersion)
 
65
                : majorVersion(aMajorVersion),
 
66
                  minorVersion(aMinorVersion),
 
67
                  inModule(NULL),
 
68
                  ucModule(NULL)
66
69
        {
67
70
        }
68
71
 
72
75
                delete inModule;
73
76
        }
74
77
 
 
78
        template <typename T> void getEntryPoint(const char* name, ModuleLoader::Module* module, T& ptr)
 
79
        {
 
80
                string symbol;
 
81
 
 
82
                symbol.printf("%s_%d_%d", name, majorVersion, minorVersion);
 
83
                module->findSymbol(symbol, ptr);
 
84
                if (ptr)
 
85
                        return;
 
86
 
 
87
                symbol.printf("%s_%d%d", name, majorVersion, minorVersion);
 
88
                module->findSymbol(symbol, ptr);
 
89
        }
 
90
 
 
91
        int majorVersion;
 
92
        int minorVersion;
75
93
        ModuleLoader::Module* inModule;
76
94
        ModuleLoader::Module* ucModule;
77
95
        UVersionInfo collVersion;
740
758
        const Firebird::string& configInfo)
741
759
{
742
760
#if defined(WIN_NT)
743
 
        const char* const inTemplate = "icuin%s%s.dll";
744
 
        const char* const ucTemplate = "icuuc%s%s.dll";
 
761
        const char* const inTemplate = "icuin%d%d.dll";
 
762
        const char* const ucTemplate = "icuuc%d%d.dll";
745
763
#elif defined(DARWIN)
746
764
        const char* const inTemplate = "/Library/Frameworks/Firebird.framework/Versions/A/Libraries/libicui18n.dylib";
747
765
        const char* const ucTemplate = "/Library/Frameworks/Firebird.framework/versions/A/Libraries/libicuuc.dylib";
748
766
#elif defined(HPUX)
749
 
        const char* const inTemplate = "libicui18n.sl.%s%s";
750
 
        const char* const ucTemplate = "libicuuc.sl.%s%s";
 
767
        const char* const inTemplate = "libicui18n.sl.%d%d";
 
768
        const char* const ucTemplate = "libicuuc.sl.%d%d";
751
769
#else
752
 
        const char* const inTemplate = "libicui18n.so.%s%s";
753
 
        const char* const ucTemplate = "libicuuc.so.%s%s";
 
770
        const char* const inTemplate = "libicui18n.so.%d%d";
 
771
        const char* const ucTemplate = "libicuuc.so.%d%d";
754
772
#endif
755
773
 
756
774
        ObjectsArray<string> versions;
764
782
 
765
783
        for (ObjectsArray<string>::const_iterator i(versions.begin()); i != versions.end(); ++i)
766
784
        {
767
 
                string majorVersion;
768
 
                string minorVersion;
 
785
                int majorVersion, minorVersion;
769
786
 
770
787
                if (*i == "default")
771
788
                {
772
 
                        majorVersion = STRINGIZE(U_ICU_VERSION_MAJOR_NUM);
773
 
                        minorVersion = STRINGIZE(U_ICU_VERSION_MINOR_NUM);
774
 
                }
775
 
                else
776
 
                {
777
 
                        const size_t pos = i->find('.');
778
 
                        if (pos == i->npos)
779
 
                                continue;
780
 
 
781
 
                        majorVersion = i->substr(0, pos);
782
 
                        minorVersion = i->substr(pos + 1);
783
 
                }
784
 
 
785
 
                if (version != majorVersion + "." + minorVersion)
786
 
                {
787
 
                        continue;
788
 
                }
 
789
                        majorVersion = U_ICU_VERSION_MAJOR_NUM;
 
790
                        minorVersion = U_ICU_VERSION_MINOR_NUM;
 
791
                }
 
792
                else if (sscanf(i->c_str(), "%d.%d", &majorVersion, &minorVersion) != 2)
 
793
                        continue;
 
794
 
 
795
                string configVersion;
 
796
                configVersion.printf("%d.%d", majorVersion, minorVersion);
 
797
 
 
798
                if (version != configVersion)
 
799
                        continue;
789
800
 
790
801
                ReadLockGuard readGuard(icuModules->lock);
791
802
 
792
803
                ICU* icu;
793
804
                if (icuModules->modules().get(version, icu))
794
 
                {
795
805
                        return icu;
796
 
                }
797
806
 
798
807
                PathName filename;
799
 
                filename.printf(ucTemplate, majorVersion.c_str(), minorVersion.c_str());
 
808
                filename.printf(ucTemplate, majorVersion, minorVersion);
800
809
 
801
 
                icu = FB_NEW(*getDefaultMemoryPool()) ICU();
 
810
                icu = FB_NEW(*getDefaultMemoryPool()) ICU(majorVersion, minorVersion);
802
811
 
803
812
                icu->ucModule = ModuleLoader::loadModule(filename);
804
813
                if (!icu->ucModule)
813
822
                        continue;
814
823
                }
815
824
 
816
 
                filename.printf(inTemplate, majorVersion.c_str(), minorVersion.c_str());
 
825
                filename.printf(inTemplate, majorVersion, minorVersion);
817
826
 
818
827
                icu->inModule = ModuleLoader::loadModule(filename);
819
828
                if (!icu->inModule)
828
837
                        continue;
829
838
                }
830
839
 
831
 
                string symbol;
832
 
 
833
 
                symbol.printf("u_init_%s_%s", majorVersion.c_str(), minorVersion.c_str());
834
 
                icu->ucModule->findSymbol(symbol, icu->uInit);
835
 
 
836
 
                symbol.printf("u_versionToString_%s_%s", majorVersion.c_str(), minorVersion.c_str());
837
 
                icu->ucModule->findSymbol(symbol, icu->uVersionToString);
838
 
 
839
 
                symbol.printf("uloc_countAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str());
840
 
                icu->ucModule->findSymbol(symbol, icu->ulocCountAvailable);
841
 
 
842
 
                symbol.printf("uloc_getAvailable_%s_%s", majorVersion.c_str(), minorVersion.c_str());
843
 
                icu->ucModule->findSymbol(symbol, icu->ulocGetAvailable);
844
 
 
845
 
                symbol.printf("uset_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
846
 
                icu->ucModule->findSymbol(symbol, icu->usetClose);
847
 
 
848
 
                symbol.printf("uset_getItem_%s_%s", majorVersion.c_str(), minorVersion.c_str());
849
 
                icu->ucModule->findSymbol(symbol, icu->usetGetItem);
850
 
 
851
 
                symbol.printf("uset_getItemCount_%s_%s", majorVersion.c_str(), minorVersion.c_str());
852
 
                icu->ucModule->findSymbol(symbol, icu->usetGetItemCount);
853
 
 
854
 
                symbol.printf("uset_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
855
 
                icu->ucModule->findSymbol(symbol, icu->usetOpen);
856
 
 
857
 
                symbol.printf("ucol_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
858
 
                icu->inModule->findSymbol(symbol, icu->ucolClose);
859
 
 
860
 
                symbol.printf("ucol_getContractions_%s_%s", majorVersion.c_str(), minorVersion.c_str());
861
 
                icu->inModule->findSymbol(symbol, icu->ucolGetContractions);
862
 
 
863
 
                symbol.printf("ucol_getSortKey_%s_%s", majorVersion.c_str(), minorVersion.c_str());
864
 
                icu->inModule->findSymbol(symbol, icu->ucolGetSortKey);
865
 
 
866
 
                symbol.printf("ucol_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
867
 
                icu->inModule->findSymbol(symbol, icu->ucolOpen);
868
 
 
869
 
                symbol.printf("ucol_setAttribute_%s_%s", majorVersion.c_str(), minorVersion.c_str());
870
 
                icu->inModule->findSymbol(symbol, icu->ucolSetAttribute);
871
 
 
872
 
                symbol.printf("ucol_strcoll_%s_%s", majorVersion.c_str(), minorVersion.c_str());
873
 
                icu->inModule->findSymbol(symbol, icu->ucolStrColl);
874
 
 
875
 
                symbol.printf("ucol_getVersion_%s_%s", majorVersion.c_str(), minorVersion.c_str());
876
 
                icu->inModule->findSymbol(symbol, icu->ucolGetVersion);
877
 
 
878
 
                symbol.printf("utrans_open_%s_%s", majorVersion.c_str(), minorVersion.c_str());
879
 
                icu->inModule->findSymbol(symbol, icu->utransOpen);
880
 
 
881
 
                symbol.printf("utrans_close_%s_%s", majorVersion.c_str(), minorVersion.c_str());
882
 
                icu->inModule->findSymbol(symbol, icu->utransClose);
883
 
 
884
 
                symbol.printf("utrans_transUChars_%s_%s", majorVersion.c_str(), minorVersion.c_str());
885
 
                icu->inModule->findSymbol(symbol, icu->utransTransUChars);
 
840
                icu->getEntryPoint("u_init", icu->ucModule, icu->uInit);
 
841
                icu->getEntryPoint("u_versionToString", icu->ucModule, icu->uVersionToString);
 
842
                icu->getEntryPoint("uloc_countAvailable", icu->ucModule, icu->ulocCountAvailable);
 
843
                icu->getEntryPoint("uloc_getAvailable", icu->ucModule, icu->ulocGetAvailable);
 
844
                icu->getEntryPoint("uset_close", icu->ucModule, icu->usetClose);
 
845
                icu->getEntryPoint("uset_getItem", icu->ucModule, icu->usetGetItem);
 
846
                icu->getEntryPoint("uset_getItemCount", icu->ucModule, icu->usetGetItemCount);
 
847
                icu->getEntryPoint("uset_open", icu->ucModule, icu->usetOpen);
 
848
 
 
849
                icu->getEntryPoint("ucol_close", icu->inModule, icu->ucolClose);
 
850
                icu->getEntryPoint("ucol_getContractions", icu->inModule, icu->ucolGetContractions);
 
851
                icu->getEntryPoint("ucol_getSortKey", icu->inModule, icu->ucolGetSortKey);
 
852
                icu->getEntryPoint("ucol_open", icu->inModule, icu->ucolOpen);
 
853
                icu->getEntryPoint("ucol_setAttribute", icu->inModule, icu->ucolSetAttribute);
 
854
                icu->getEntryPoint("ucol_strcoll", icu->inModule, icu->ucolStrColl);
 
855
                icu->getEntryPoint("ucol_getVersion", icu->inModule, icu->ucolGetVersion);
 
856
                icu->getEntryPoint("utrans_open", icu->inModule, icu->utransOpen);
 
857
                icu->getEntryPoint("utrans_close", icu->inModule, icu->utransClose);
 
858
                icu->getEntryPoint("utrans_transUChars", icu->inModule, icu->utransTransUChars);
886
859
 
887
860
                if (/*!icu->uInit ||*/ !icu->uVersionToString || !icu->ulocCountAvailable ||
888
861
                        !icu->ulocGetAvailable || !icu->usetClose || !icu->usetGetItem ||