1
0
Fork 0

fix adler32 function

This commit is contained in:
jsteemann 2017-05-18 15:40:35 +02:00
parent 565e605d20
commit adbe81d45d
3 changed files with 24 additions and 14 deletions

View File

@ -371,25 +371,28 @@ int TRI_ZipFile(char const* filename, char const* dir,
return res; return res;
} }
uint32_t TRI_Adler32(char const* filename) { int TRI_Adler32(char const* filename, uint32_t& checksum) {
int fd; checksum = 0;
fd = TRI_OPEN(filename, O_RDONLY); if (!TRI_IsRegularFile(filename) && !TRI_IsSymbolicLink(filename)) {
return TRI_ERROR_FILE_NOT_FOUND;
}
int fd = TRI_OPEN(filename, O_RDONLY);
if (fd < 0) { if (fd < 0) {
return 0; return TRI_ERROR_FILE_NOT_FOUND;
} }
TRI_DEFER(TRI_CLOSE(fd)); TRI_DEFER(TRI_CLOSE(fd));
struct TRI_STAT statbuf; struct TRI_STAT statbuf;
TRI_FSTAT(fd, &statbuf); TRI_FSTAT(fd, &statbuf);
TRI_write_t nRead; ssize_t chunkRemain = static_cast<TRI_read_t>(statbuf.st_size);
TRI_read_t chunkRemain = static_cast<TRI_read_t>(statbuf.st_size);
char* buf = char* buf =
static_cast<char*>(TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, 131072, false)); static_cast<char*>(TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, 131072, false));
if (buf == nullptr) { if (buf == nullptr) {
return 0; return TRI_ERROR_OUT_OF_MEMORY;
} }
uLong adler = adler32(0L, Z_NULL, 0); uLong adler = adler32(0L, Z_NULL, 0);
@ -401,19 +404,21 @@ uint32_t TRI_Adler32(char const* filename) {
readChunk = chunkRemain; readChunk = chunkRemain;
} }
nRead = TRI_READ(fd, buf, readChunk); ssize_t nRead = TRI_READ(fd, buf, readChunk);
adler = adler32(adler, reinterpret_cast<const unsigned char *>(buf), nRead);
if (nRead < 1) { if (nRead < 0) {
TRI_Free(TRI_UNKNOWN_MEM_ZONE, buf);
return TRI_ERROR_INTERNAL; return TRI_ERROR_INTERNAL;
} }
adler = adler32(adler, reinterpret_cast<const unsigned char *>(buf), static_cast<uInt>(nRead));
chunkRemain -= nRead; chunkRemain -= nRead;
} }
TRI_Free(TRI_UNKNOWN_MEM_ZONE, buf); TRI_Free(TRI_UNKNOWN_MEM_ZONE, buf);
return (uint32_t) adler; checksum = static_cast<uint32_t>(adler);
return TRI_ERROR_NO_ERROR;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -30,7 +30,7 @@
#include "Basics/Common.h" #include "Basics/Common.h"
uint32_t TRI_Adler32(char const* filename); int TRI_Adler32(char const* filename, uint32_t& checksum);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief zips a file /// @brief zips a file

View File

@ -1665,7 +1665,12 @@ static void JS_Adler32(v8::FunctionCallbackInfo<v8::Value> const& args) {
TRI_V8_THROW_TYPE_ERROR("<filename> must be a UTF-8 string"); TRI_V8_THROW_TYPE_ERROR("<filename> must be a UTF-8 string");
} }
uint32_t chksum = TRI_Adler32(*name); uint32_t chksum = 0;
int res = TRI_Adler32(*name, chksum);
if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_THROW_EXCEPTION(res);
}
v8::Handle<v8::Value> result; v8::Handle<v8::Value> result;