cryptsetup - fix buffer overflow
authorAlex Hornung <ahornung@gmail.com>
Sat, 14 Aug 2010 22:01:47 +0000 (23:01 +0100)
committerAlex Hornung <ahornung@gmail.com>
Sat, 14 Aug 2010 22:05:00 +0000 (23:05 +0100)
* fix a buffer overflow introduced during the porting. Linux originally
  did digest = gcry_md_read(hd, hash_id); memcpy(dst, digest, len);
  I ported that to do EVP_DigestFinal directly into dst, causing
  corruption. Avoid this by writing to some intermediate (large) buffer
  and then using memcpy like Linux does.

contrib/cryptsetup/luks/af.c

index 98f71ac..2d3acc0 100644 (file)
@@ -39,14 +39,15 @@ static void XORblock(char const *src1, char const *src2, char *dst, size_t n)
 static int hash_buf(char *src, char *dst, uint32_t iv, int len, const EVP_MD *hash_id)
 {
        EVP_MD_CTX mdctx;
-       unsigned char *digest;
+       unsigned char digest[128];
 
        iv = htonl(iv);
 
        EVP_DigestInit(&mdctx, hash_id);
        EVP_DigestUpdate(&mdctx, (unsigned char *)&iv, sizeof(iv));
        EVP_DigestUpdate(&mdctx, src, len);
-       EVP_DigestFinal(&mdctx, dst, NULL);
+       EVP_DigestFinal(&mdctx, digest, NULL);
+       memcpy(dst, digest, len);
 
        return 0;
 }