Don't use clobbered 'i' for checking UTCTime and GeneralizedTime length.
[openssl.git] / crypto / md32_common.h
index bbcb03a738e4f9d6217fe9c7e6dff6f3649c3e2c..61bcd9786f8679668d706b78c0691a0d3c51f1d6 100644 (file)
@@ -1,6 +1,6 @@
 /* crypto/md32_common.h */
 /* ====================================================================
- * Copyright (c) 1999-2006 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
                                : "r"(a), "I"(n));      \
                           ret;                         \
                        })
-#  elif defined(__s390__) || defined(__s390x__)
+#  elif defined(__s390x__)
 #   define ROTATE(a,n) ({ register unsigned int ret;   \
                                asm ("rll %0,%1,%2"     \
                                : "=r"(ret)             \
-                               : "r"(a), "I"(n):"cc"); \
+                               : "r"(a), "I"(n));      \
                          ret;                          \
                        })
 #  endif
@@ -301,7 +301,7 @@ int HASH_UPDATE (HASH_CTX *c, const void *data_, size_t len)
                {
                p=(unsigned char *)c->data;
 
-               if ((n+len) >= HASH_CBLOCK)
+               if (len >= HASH_CBLOCK || len+n >= HASH_CBLOCK)
                        {
                        memcpy (p+n,data,HASH_CBLOCK-n);
                        HASH_BLOCK_DATA_ORDER (c,p,1);
@@ -354,9 +354,11 @@ int HASH_FINAL (unsigned char *md, HASH_CTX *c)
 
        if (n > (HASH_CBLOCK-8))
                {
+               memset (p+n,0,HASH_CBLOCK-n);
+               n=0;
                HASH_BLOCK_DATA_ORDER (c,p,1);
-               memset (p,0,HASH_CBLOCK);
                }
+       memset (p+n,0,HASH_CBLOCK-8-n);
 
        p += HASH_CBLOCK-8;
 #if   defined(DATA_ORDER_IS_BIG_ENDIAN)