Przeglądaj źródła

fix problematic use of tolower() when calculating the version
hash by using locale independant tolower_ascii() function.
Thanks to M. Vefa Bicakci (LP: #80248)

Michael Vogt 17 lat temu
rodzic
commit
4e86942abf

+ 11 - 0
apt-pkg/contrib/strutl.cc

@@ -1074,6 +1074,17 @@ char *safe_snprintf(char *Buffer,char *End,const char *Format,...)
 }
 }
 									/*}}}*/
 									/*}}}*/
 
 
+// tolower_ascii - tolower() function that ignores the locale		/*{{{*/
+// ---------------------------------------------------------------------
+/* */
+int tolower_ascii(int c)
+{
+   if (c >= 'A' and c <= 'Z')
+      return c + 32;
+   return c;
+}
+									/*}}}*/
+
 // CheckDomainList - See if Host is in a , seperate list		/*{{{*/
 // CheckDomainList - See if Host is in a , seperate list		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* The domain list is a comma seperate list of domains that are suffix
 /* The domain list is a comma seperate list of domains that are suffix

+ 1 - 0
apt-pkg/contrib/strutl.h

@@ -62,6 +62,7 @@ void ioprintf(ostream &out,const char *format,...) APT_FORMAT2;
 void strprintf(string &out,const char *format,...) APT_FORMAT2;
 void strprintf(string &out,const char *format,...) APT_FORMAT2;
 char *safe_snprintf(char *Buffer,char *End,const char *Format,...) APT_FORMAT3;
 char *safe_snprintf(char *Buffer,char *End,const char *Format,...) APT_FORMAT3;
 bool CheckDomainList(const string &Host, const string &List);
 bool CheckDomainList(const string &Host, const string &List);
+int tolower_ascii(int c);
 
 
 #define APT_MKSTRCMP(name,func) \
 #define APT_MKSTRCMP(name,func) \
 inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \
 inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \

+ 1 - 1
apt-pkg/deb/deblistparser.cc

@@ -213,7 +213,7 @@ unsigned short debListParser::VersionHash()
       for (; Start != End; Start++)
       for (; Start != End; Start++)
       {
       {
 	 if (isspace(*Start) == 0)
 	 if (isspace(*Start) == 0)
-	    *I++ = tolower(*Start);
+	    *I++ = tolower_ascii(*Start);
 	 if (*Start == '<' && Start[1] != '<' && Start[1] != '=')
 	 if (*Start == '<' && Start[1] != '<' && Start[1] != '=')
 	    *I++ = '=';
 	    *I++ = '=';
 	 if (*Start == '>' && Start[1] != '>' && Start[1] != '=')
 	 if (*Start == '>' && Start[1] != '>' && Start[1] != '=')

+ 2 - 2
apt-pkg/pkgcache.cc

@@ -163,7 +163,7 @@ unsigned long pkgCache::sHash(const string &Str) const
 {
 {
    unsigned long Hash = 0;
    unsigned long Hash = 0;
    for (string::const_iterator I = Str.begin(); I != Str.end(); I++)
    for (string::const_iterator I = Str.begin(); I != Str.end(); I++)
-      Hash = 5*Hash + tolower(*I);
+      Hash = 5*Hash + tolower_ascii(*I);
    return Hash % _count(HeaderP->HashTable);
    return Hash % _count(HeaderP->HashTable);
 }
 }
 
 
@@ -171,7 +171,7 @@ unsigned long pkgCache::sHash(const char *Str) const
 {
 {
    unsigned long Hash = 0;
    unsigned long Hash = 0;
    for (const char *I = Str; *I != 0; I++)
    for (const char *I = Str; *I != 0; I++)
-      Hash = 5*Hash + tolower(*I);
+      Hash = 5*Hash + tolower_ascii(*I);
    return Hash % _count(HeaderP->HashTable);
    return Hash % _count(HeaderP->HashTable);
 }
 }
 
 

+ 4 - 0
debian/changelog

@@ -48,6 +48,10 @@ apt (0.7.21) UNRELEASED; urgency=low
     - add Acquire::https::AllowRedirect support
     - add Acquire::https::AllowRedirect support
   * methods/gpgv.cc:
   * methods/gpgv.cc:
     - properly check for expired and revoked keys (closes: #433091)
     - properly check for expired and revoked keys (closes: #433091)
+  * fix problematic use of tolower() when calculating the version 
+    hash by using locale independant tolower_ascii() function. 
+    Thanks to M. Vefa Bicakci (LP: #80248)
+    
 
 
   [ Dereck Wonnacott ]
   [ Dereck Wonnacott ]
   * apt-ftparchive might write corrupt Release files (LP: #46439)
   * apt-ftparchive might write corrupt Release files (LP: #46439)