From ac5f7cb30c6a09d809e2d9fea2824b100c8093d4 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sat, 17 May 2014 01:43:58 -0700 Subject: Don't rely on null-terminated name in PackageFind. --- MobileCydia.mm | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'MobileCydia.mm') diff --git a/MobileCydia.mm b/MobileCydia.mm index 900e76e..e207fa3 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -1304,7 +1304,7 @@ static PackageValue *PackageFind(const char *name, size_t length, bool *fail = N PackageValue *metadata; Cytore::Offset *offset(&MetaFile_->packages_[nhash.u16[0]]); - offset: if (offset->IsNull()) { + for (;; offset = &metadata->next_) { if (offset->IsNull()) { *offset = MetaFile_.New(length + 1); metadata = &MetaFile_.Get(*offset); @@ -1316,16 +1316,18 @@ static PackageValue *PackageFind(const char *name, size_t length, bool *fail = N memset(metadata, 0, sizeof(*metadata)); } - memcpy(metadata->name_, name, length + 1); + memcpy(metadata->name_, name, length); + metadata->name_[length] = '\0'; metadata->nhash_ = nhash.u16[1]; } else { metadata = &MetaFile_.Get(*offset); - - if (metadata->nhash_ != nhash.u16[1] || strncmp(metadata->name_, name, length + 1) != 0) { - offset = &metadata->next_; - goto offset; - } - } + if (metadata->nhash_ != nhash.u16[1]) + continue; + if (strncmp(metadata->name_, name, length) != 0) + continue; + if (metadata->name_[length] != '\0') + continue; + } break; } return metadata; } -- cgit v1.2.3