From d66e827ecdb431dfd8dc1a7c98e2b67579f0906b Mon Sep 17 00:00:00 2001 From: Rich Megginson Date: Sep 04 2008 02:46:09 +0000 Subject: Resolves: bug 413531 Description: Web browser accepted languages configuration causes dsgw CGI binaries to segfault Fix Description: Use XP_AccLangList from adminutil rather than the local AcceptLangList and get rid of the local AcceptLangList function. --- diff --git a/collate.c b/collate.c index 66146c3..9b5c57d 100644 --- a/collate.c +++ b/collate.c @@ -120,9 +120,9 @@ get_collator (int flavor) ACCEPT_LANGUAGE_LIST langlist; size_t langs; /* dsgw_emitf ("ClientLanguage = \"%s\"
\n", gc->gc_ClientLanguage); */ - langs = AcceptLangList (gc->gc_ClientLanguage, langlist); + langs = XP_AccLangList (gc->gc_ClientLanguage, langlist); if (langs <= 0) { -dsgw_emitf ("AcceptLangList (%s) = %lu
\n", +dsgw_emitf ("XP_AccLangList (%s) = %lu
\n", gc->gc_ClientLanguage, (unsigned long)langs); } else { UCollator* fallback_collator = NULL; diff --git a/dsgw.h b/dsgw.h index e720f69..57f2f5d 100644 --- a/dsgw.h +++ b/dsgw.h @@ -1055,23 +1055,6 @@ char *dsgw_utf8StrToUpper(char *s); /* * dsgwutil.c */ -/******************** Accept Language List ************************/\ - -/* AcceptLangList - * - * Will parse an Accept-Language string of the form - * "en;q=1.0,fr;q=0.9..." - * The ACCEPT_LANGUAGE_LIST array will be loaded with the ordered - * language elements based on the priority of the languages specified. - * The number of languages will be returned as the result of the - * call. - */ -size_t -AcceptLangList( - const char * acceptLanguage, - ACCEPT_LANGUAGE_LIST acceptLanguageList -); - /* * converts a buffer of characters to/from UTF8 from/to a native charset * the given converter will handle the native charset diff --git a/dsgwutil.c b/dsgwutil.c index a801f63..f30e081 100644 --- a/dsgwutil.c +++ b/dsgwutil.c @@ -1135,119 +1135,6 @@ dsgw_time_plus_sec (time_t l, long r) return mktime_r (&t); } -/* - * Accept-Language = "Accept-Language" ":" - * 1#( language-range [ ";" "q" "=" qvalue ] ) - * language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" ) - * - * NLS_AccLangList() assumes that "Accept-Language:" has already - * been stripped off. It takes as input - * - * 1#( ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" ) [ ";" "q" "=" qvalue ] ) - * - * and returns a list of languages, ordered by qvalues, in - * the array NLS_ACCEPT_LANGUAGE_LIST. - * - * If there are to many languages (>NLS_MAX_ACCEPT_LANGUAGE) the excess - * is ignored. If the language-range is too long (>NLS_MAX_ACCEPT_LENGTH), - * the language-range is ignored. In these cases, NLS_AccLangList() - * will quietly return, perhaps with numLang = 0. numLang is - * returned by the function. - */ - - -size_t -AcceptLangList(const char* AcceptLanguage, - ACCEPT_LANGUAGE_LIST AcceptLanguageList) -{ - char* input; - char* cPtr; - char* cPtr1; - char* cPtr2; - int i; - int j; - int countLang = 0; - - input = dsgw_ch_strdup(AcceptLanguage); - if (input == (char*)NULL){ - return 0; - } - - cPtr1 = input-1; - cPtr2 = input; - - /* put in standard form */ - while (*(++cPtr1)) { - if (isalpha(*cPtr1)) *cPtr2++ = tolower(*cPtr1); /* force lower case */ - else if (isspace(*cPtr1)); /* ignore any space */ - else if (*cPtr1=='-') *cPtr2++ = '_'; /* "-" -> "_" */ - else if (*cPtr1=='*'); /* ignore "*" */ - else *cPtr2++ = *cPtr1; /* else unchanged */ - } - *cPtr2 = '\0'; - - countLang = 0; - - if (strchr(input,';')) { - /* deal with the quality values */ - - float qvalue[MAX_ACCEPT_LANGUAGE]; - float qSwap; - float bias = 0.0f; - char* ptrLanguage[MAX_ACCEPT_LANGUAGE]; - char* ptrSwap; - - cPtr = strtok(input,","); - while (cPtr) { - qvalue[countLang] = 1.0f; - if ((cPtr1 = strchr(cPtr,';'))) { - sscanf(cPtr1,";q=%f",&qvalue[countLang]); - *cPtr1 = '\0'; - } - if (strlen(cPtr)=MAX_ACCEPT_LANGUAGE) break; /* quit if too many */ - } - cPtr = strtok(NULL,","); - } - - /* sort according to decending qvalue */ - /* not a very good algorithm, but count is not likely large */ - for ( i=0 ; i=MAX_ACCEPT_LANGUAGE) break; /* quit if too many */ - } - cPtr = strtok(NULL,","); - } - } - - free(input); - - return countLang; -} - char * dsgw_server_url() {