Skip to content

Commit 56b1a3c

Browse files
addaleaxtargos
authored andcommitted
src: refactor zlib dictionary to STL vector
PR-URL: #23019 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Gus Caplan <[email protected]>
1 parent 0bc4529 commit 56b1a3c

File tree

1 file changed

+28
-35
lines changed

1 file changed

+28
-35
lines changed

src/node_zlib.cc

+28-35
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
7878
ZCtx(Environment* env, Local<Object> wrap, node_zlib_mode mode)
7979
: AsyncWrap(env, wrap, AsyncWrap::PROVIDER_ZLIB),
8080
ThreadPoolWork(env),
81-
dictionary_(nullptr),
82-
dictionary_len_(0),
8381
err_(0),
8482
flush_(0),
8583
init_done_(false),
@@ -126,10 +124,7 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
126124
CHECK(status == Z_OK || status == Z_DATA_ERROR);
127125
mode_ = NONE;
128126

129-
if (dictionary_ != nullptr) {
130-
delete[] dictionary_;
131-
dictionary_ = nullptr;
132-
}
127+
dictionary_.clear();
133128
}
134129

135130

@@ -294,9 +289,11 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
294289
// SetDictionary, don't repeat that here)
295290
if (mode_ != INFLATERAW &&
296291
err_ == Z_NEED_DICT &&
297-
dictionary_ != nullptr) {
292+
!dictionary_.empty()) {
298293
// Load it
299-
err_ = inflateSetDictionary(&strm_, dictionary_, dictionary_len_);
294+
err_ = inflateSetDictionary(&strm_,
295+
dictionary_.data(),
296+
dictionary_.size());
300297
if (err_ == Z_OK) {
301298
// And try to decode again
302299
err_ = inflate(&strm_, flush_);
@@ -346,7 +343,7 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
346343
// normal statuses, not fatal
347344
break;
348345
case Z_NEED_DICT:
349-
if (dictionary_ == nullptr)
346+
if (dictionary_.empty())
350347
Error("Missing dictionary");
351348
else
352349
Error("Bad dictionary");
@@ -483,23 +480,20 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
483480

484481
Local<Function> write_js_callback = args[5].As<Function>();
485482

486-
char* dictionary = nullptr;
487-
size_t dictionary_len = 0;
483+
std::vector<unsigned char> dictionary;
488484
if (Buffer::HasInstance(args[6])) {
489-
const char* dictionary_ = Buffer::Data(args[6]);
490-
dictionary_len = Buffer::Length(args[6]);
491-
492-
dictionary = new char[dictionary_len];
493-
memcpy(dictionary, dictionary_, dictionary_len);
485+
unsigned char* data =
486+
reinterpret_cast<unsigned char*>(Buffer::Data(args[6]));
487+
dictionary = std::vector<unsigned char>(
488+
data,
489+
data + Buffer::Length(args[6]));
494490
}
495491

496492
bool ret = Init(ctx, level, windowBits, memLevel, strategy, write_result,
497-
write_js_callback, dictionary, dictionary_len);
498-
if (!ret) goto end;
493+
write_js_callback, std::move(dictionary));
494+
if (ret)
495+
ctx->SetDictionary();
499496

500-
ctx->SetDictionary();
501-
502-
end:
503497
return args.GetReturnValue().Set(ret);
504498
}
505499

@@ -524,8 +518,8 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
524518

525519
static bool Init(ZCtx* ctx, int level, int windowBits, int memLevel,
526520
int strategy, uint32_t* write_result,
527-
Local<Function> write_js_callback, char* dictionary,
528-
size_t dictionary_len) {
521+
Local<Function> write_js_callback,
522+
std::vector<unsigned char>&& dictionary) {
529523
AllocScope alloc_scope(ctx);
530524
ctx->level_ = level;
531525
ctx->windowBits_ = windowBits;
@@ -573,17 +567,13 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
573567
UNREACHABLE();
574568
}
575569

576-
ctx->dictionary_ = reinterpret_cast<Bytef *>(dictionary);
577-
ctx->dictionary_len_ = dictionary_len;
570+
ctx->dictionary_ = std::move(dictionary);
578571

579572
ctx->write_in_progress_ = false;
580573
ctx->init_done_ = true;
581574

582575
if (ctx->err_ != Z_OK) {
583-
if (dictionary != nullptr) {
584-
delete[] dictionary;
585-
ctx->dictionary_ = nullptr;
586-
}
576+
ctx->dictionary_.clear();
587577
ctx->mode_ = NONE;
588578
return false;
589579
}
@@ -594,20 +584,24 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
594584
}
595585

596586
void SetDictionary() {
597-
if (dictionary_ == nullptr)
587+
if (dictionary_.empty())
598588
return;
599589

600590
err_ = Z_OK;
601591

602592
switch (mode_) {
603593
case DEFLATE:
604594
case DEFLATERAW:
605-
err_ = deflateSetDictionary(&strm_, dictionary_, dictionary_len_);
595+
err_ = deflateSetDictionary(&strm_,
596+
dictionary_.data(),
597+
dictionary_.size());
606598
break;
607599
case INFLATERAW:
608600
// The other inflate cases will have the dictionary set when inflate()
609601
// returns Z_NEED_DICT in Process()
610-
err_ = inflateSetDictionary(&strm_, dictionary_, dictionary_len_);
602+
err_ = inflateSetDictionary(&strm_,
603+
dictionary_.data(),
604+
dictionary_.size());
611605
break;
612606
default:
613607
break;
@@ -664,7 +658,7 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
664658

665659
void MemoryInfo(MemoryTracker* tracker) const override {
666660
tracker->TrackThis(this);
667-
tracker->TrackFieldWithSize("dictionary", dictionary_len_);
661+
tracker->TrackField("dictionary", dictionary_);
668662
tracker->TrackFieldWithSize("zlib memory",
669663
zlib_memory_ + unreported_allocations_);
670664
}
@@ -732,8 +726,7 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
732726
ZCtx* ctx;
733727
};
734728

735-
Bytef* dictionary_;
736-
size_t dictionary_len_;
729+
std::vector<unsigned char> dictionary_;
737730
int err_;
738731
int flush_;
739732
bool init_done_;

0 commit comments

Comments
 (0)