]> granicus.if.org Git - apache/blobdiff - server/util_md5.c
Fix wrong condition that may lead to NULL being set as 'Vary' header
[apache] / server / util_md5.c
index d59c717eaa91f9d4a59fbeb44cfecfee632beef9..83bfa75741110763c68e5b9edc5719fd2c3494ce 100644 (file)
@@ -1,58 +1,17 @@
-/* ====================================================================
- * Copyright (c) 1995-1999 The Apache Group.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the Apache Group
- *    for use in the Apache HTTP server project (http://www.apache.org/)."
- *
- * 4. The names "Apache Server" and "Apache Group" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the Apache Group
- *    for use in the Apache HTTP server project (http://www.apache.org/)."
- *
- * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Group and was originally based
- * on public domain software written at the National Center for
- * Supercomputing Applications, University of Illinois, Urbana-Champaign.
- * For more information on the Apache Group and the Apache HTTP server
- * project, please see <http://www.apache.org/>.
- *
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
 /************************************************************************
@@ -72,7 +31,7 @@
  *  Original Code Copyright (C) 1994, Jeff Hostetler, Spyglass, Inc.
  *  Portions of Content-MD5 code Copyright (C) 1993, 1994 by Carnegie Mellon
  *     University (see Copyright below).
- *  Portions of Content-MD5 code Copyright (C) 1991 Bell Communications 
+ *  Portions of Content-MD5 code Copyright (C) 1991 Bell Communications
  *     Research, Inc. (Bellcore) (see Copyright below).
  *  Portions extracted from mpack, John G. Myers - jgm+@cmu.edu
  *  Content-MD5 Code contributed by Martin Hamilton (martin@net.lut.ac.uk)
 /* md5.c --Module Interface to MD5. */
 /* Jeff Hostetler, Spyglass, Inc., 1994. */
 
+#include "ap_config.h"
+#include "apr_portable.h"
+#include "apr_strings.h"
 #include "httpd.h"
 #include "util_md5.h"
+#include "util_ebcdic.h"
 
-API_EXPORT(char *) ap_md5_binary(ap_context_t *p, const unsigned char *buf, int length)
+AP_DECLARE(char *) ap_md5_binary(apr_pool_t *p, const unsigned char *buf, int length)
 {
     const char *hex = "0123456789abcdef";
-    AP_MD5_CTX my_md5;
-    unsigned char hash[16];
-    char *r, result[33];
+    apr_md5_ctx_t my_md5;
+    unsigned char hash[APR_MD5_DIGESTSIZE];
+    char *r, result[33]; /* (MD5_DIGESTSIZE * 2) + 1 */
     int i;
 
     /*
      * Take the MD5 hash of the string argument.
      */
 
-    ap_MD5Init(&my_md5);
-    ap_MD5Update(&my_md5, buf, (unsigned int)length);
-    ap_MD5Final(hash, &my_md5);
+    apr_md5_init(&my_md5);
+#if APR_CHARSET_EBCDIC
+    apr_md5_set_xlate(&my_md5, ap_hdrs_to_ascii);
+#endif
+    apr_md5_update(&my_md5, buf, (unsigned int)length);
+    apr_md5_final(hash, &my_md5);
 
-    for (i = 0, r = result; i < 16; i++) {
-       *r++ = hex[hash[i] >> 4];
-       *r++ = hex[hash[i] & 0xF];
+    for (i = 0, r = result; i < APR_MD5_DIGESTSIZE; i++) {
+        *r++ = hex[hash[i] >> 4];
+        *r++ = hex[hash[i] & 0xF];
     }
     *r = '\0';
 
-    return ap_pstrdup(p, result);
+    return apr_pstrndup(p, result, APR_MD5_DIGESTSIZE*2);
 }
 
-API_EXPORT(char *) ap_md5(ap_context_t *p, const unsigned char *string)
+AP_DECLARE(char *) ap_md5(apr_pool_t *p, const unsigned char *string)
 {
     return ap_md5_binary(p, string, (int) strlen((char *)string));
 }
@@ -156,30 +122,30 @@ API_EXPORT(char *) ap_md5(ap_context_t *p, const unsigned char *string)
  * of an authorized representative of Bellcore.  BELLCORE
  * MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
  * OF THIS MATERIAL FOR ANY PURPOSE.  IT IS PROVIDED "AS IS",
- * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.  
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
  */
 
 static char basis_64[] =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-API_EXPORT(char *) ap_md5contextTo64(ap_context_t *a, AP_MD5_CTX * context)
+AP_DECLARE(char *) ap_md5contextTo64(apr_pool_t *a, apr_md5_ctx_t *context)
 {
     unsigned char digest[18];
     char *encodedDigest;
     int i;
     char *p;
 
-    encodedDigest = (char *) ap_pcalloc(a, 25 * sizeof(char));
+    encodedDigest = (char *) apr_pcalloc(a, 25 * sizeof(char));
 
-    ap_MD5Final(digest, context);
+    apr_md5_final(digest, context);
     digest[sizeof(digest) - 1] = digest[sizeof(digest) - 2] = 0;
 
     p = encodedDigest;
     for (i = 0; i < sizeof(digest); i += 3) {
-       *p++ = basis_64[digest[i] >> 2];
-       *p++ = basis_64[((digest[i] & 0x3) << 4) | ((int) (digest[i + 1] & 0xF0) >> 4)];
-       *p++ = basis_64[((digest[i + 1] & 0xF) << 2) | ((int) (digest[i + 2] & 0xC0) >> 6)];
-       *p++ = basis_64[digest[i + 2] & 0x3F];
+        *p++ = basis_64[digest[i] >> 2];
+        *p++ = basis_64[((digest[i] & 0x3) << 4) | ((int) (digest[i + 1] & 0xF0) >> 4)];
+        *p++ = basis_64[((digest[i + 1] & 0xF) << 2) | ((int) (digest[i + 2] & 0xC0) >> 6)];
+        *p++ = basis_64[digest[i + 2] & 0x3F];
     }
     *p-- = '\0';
     *p-- = '=';
@@ -187,47 +153,20 @@ API_EXPORT(char *) ap_md5contextTo64(ap_context_t *a, AP_MD5_CTX * context)
     return encodedDigest;
 }
 
-#ifdef CHARSET_EBCDIC
-
-API_EXPORT(char *) ap_md5digest(ap_context_t *p, APRFile infile, int convert)
+AP_DECLARE(char *) ap_md5digest(apr_pool_t *p, apr_file_t *infile)
 {
-    AP_MD5_CTX context;
-    unsigned char buf[1000];
-    long length = 0;
-    int nbytes;
-
-    ap_MD5Init(&context);
-    /* ZZZ use AP func instead of fread. */
-    while ((nbytes = read(infile, buf, sizeof(buf)))) {
-       length += nbytes;
-        if (!convert) {
-            ascii2ebcdic(buf, buf, nbytes);
-        }
-       ap_MD5Update(&context, buf, nbytes);
+    apr_md5_ctx_t context;
+    unsigned char buf[4096]; /* keep this a multiple of 64 */
+    apr_size_t nbytes;
+    apr_off_t offset = 0L;
+
+    apr_md5_init(&context);
+    nbytes = sizeof(buf);
+    while (apr_file_read(infile, buf, &nbytes) == APR_SUCCESS) {
+        apr_md5_update(&context, buf, nbytes);
+        nbytes = sizeof(buf);
     }
-    /* ZZZ use AP seek func instead of REWIND. */
-    lseek(infile, 0L, SEEK_SET);
+    apr_file_seek(infile, APR_SET, &offset);
     return ap_md5contextTo64(p, &context);
 }
 
-#else
-
-API_EXPORT(char *) ap_md5digest(ap_context_t *p, APRFile infile)
-{
-    AP_MD5_CTX context;
-    unsigned char buf[1000];
-    long length = 0;
-    int nbytes;
-
-    ap_MD5Init(&context);
-    /* ZZZ use AP func instead of fread. */
-    while ((nbytes = read(infile, buf, sizeof(buf)))) {
-       length += nbytes;
-       ap_MD5Update(&context, buf, nbytes);
-    }
-    /* ZZZ use AP seek func instead of REWIND. */
-    lseek(infile, 0L, SEEK_SET);
-    return ap_md5contextTo64(p, &context);
-}
-
-#endif