]> granicus.if.org Git - apache/commitdiff
Fix negotiation type parsing to be strict about "*", "*/*" and "type/*"
authorWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 5 Jul 2017 19:42:30 +0000 (19:42 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 5 Jul 2017 19:42:30 +0000 (19:42 +0000)
comparisons.

Submitted by: wrowe, Robert Święcki <robert swiecki.net>

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1800917 13f79535-47bb-0310-9956-ffa450edef68

modules/mappers/mod_negotiation.c

index baa28149ddb665b10400cd73620ab2ec380a29bf..5ff205be612fec225812670a175c830848641629 100644 (file)
@@ -1332,14 +1332,19 @@ static int mime_match(accept_rec *accept_r, var_rec *avail)
     const char *avail_type = avail->mime_type;
     int len = strlen(accept_type);
 
-    if (accept_type[0] == '*') {        /* Anything matches star/star */
+    if ((len == 1 && accept_type[0] == '*')
+            || (len == 3 && !strncmp(accept_type, "*/*", 3))) {
+        /* Anything matches star or star/star */
         if (avail->mime_stars < 1) {
             avail->mime_stars = 1;
         }
         return 1;
     }
-    else if ((accept_type[len - 1] == '*') &&
-             !strncmp(accept_type, avail_type, len - 2)) {
+    else if (len > 2 && accept_type[len - 2] == '/'
+                     && accept_type[len - 1] == '*'
+                     && !strncmp(accept_type, avail_type, len - 2)
+                     && avail_type[len - 2] == '/') {
+        /* Any subtype matches for type/star */
         if (avail->mime_stars < 2) {
             avail->mime_stars = 2;
         }