1
0
mirror of https://github.com/hashcat/hashcat.git synced 2025-02-02 10:51:16 +00:00

huge fwrite/fread problem on windows fixed

This commit is contained in:
philsmd 2020-06-02 09:52:10 +02:00
parent 6c0dc7493e
commit e151a72717
No known key found for this signature in database
GPG Key ID: 4F25D016D9D6A8AF

View File

@ -130,9 +130,49 @@ size_t hc_fread (void *ptr, size_t size, size_t nmemb, HCFILE *fp)
n = unzReadCurrentFile (fp->ufp, ptr, s); n = unzReadCurrentFile (fp->ufp, ptr, s);
} }
else else
{
#if defined (_WIN)
// 4 GB fread () limit for windows systems ?
// see: https://social.msdn.microsoft.com/Forums/vstudio/en-US/7c913001-227e-439b-bf07-54369ba07994/fwrite-issues-with-large-data-write
#define GIGABYTE (1024u * 1024u * 1024u)
if (((size * nmemb) / GIGABYTE) < 4)
{ {
n = fread (ptr, size, nmemb, fp->pfp); n = fread (ptr, size, nmemb, fp->pfp);
} }
else
{
if ((size / GIGABYTE) > 3) return -1;
size_t elements_max = (3u * GIGABYTE) / size;
size_t elements_left = nmemb;
size_t off = 0;
n = 0;
while (elements_left > 0)
{
size_t elements_cur = elements_max;
if (elements_left < elements_max) elements_cur = elements_left;
size_t ret = fread (ptr + off, size, elements_cur, fp->pfp);
if (ret != elements_cur) return -1;
n += ret;
off += ret * size;
elements_left -= ret;
}
}
#else
n = fread (ptr, size, nmemb, fp->pfp);
#endif
}
return n; return n;
} }
@ -151,9 +191,49 @@ size_t hc_fwrite (const void *ptr, size_t size, size_t nmemb, HCFILE *fp)
{ {
} }
else else
{
#if defined (_WIN)
// 4 GB fwrite () limit for windows systems ?
// see: https://social.msdn.microsoft.com/Forums/vstudio/en-US/7c913001-227e-439b-bf07-54369ba07994/fwrite-issues-with-large-data-write
#define GIGABYTE (1024u * 1024u * 1024u)
if (((size * nmemb) / GIGABYTE) < 4)
{ {
n = fwrite (ptr, size, nmemb, fp->pfp); n = fwrite (ptr, size, nmemb, fp->pfp);
} }
else
{
if ((size / GIGABYTE) > 3) return -1;
size_t elements_max = (3u * GIGABYTE) / size;
size_t elements_left = nmemb;
size_t off = 0;
n = 0;
while (elements_left > 0)
{
size_t elements_cur = elements_max;
if (elements_left < elements_max) elements_cur = elements_left;
size_t ret = fwrite (ptr + off, size, elements_cur, fp->pfp);
if (ret != elements_cur) return -1;
n += ret;
off += ret * size;
elements_left -= ret;
}
}
#else
n = fwrite (ptr, size, nmemb, fp->pfp);
#endif
}
if (n != nmemb) return -1; if (n != nmemb) return -1;