From: Aleksei Nikiforov <darktemplar@altlinux.org> To: devel@lists.altlinux.org Subject: Re: [devel] [PATCH for apt 2/2 v2] Fix pointer arithmetics Date: Mon, 9 Dec 2019 10:08:42 +0300 Message-ID: <dc72e16e-3305-7dc4-8aee-da71b085954f@altlinux.org> (raw) In-Reply-To: <20191208232108.GC30742@altlinux.org> 09.12.2019 2:21, Dmitry V. Levin пишет: > On Fri, Dec 06, 2019 at 06:36:55PM +0300, Aleksei Nikiforov wrote: > [...] >> @@ -85,11 +87,11 @@ class pkgCache::PkgIterator >> inline unsigned long long Index() const {return Pkg - Owner->PkgP;}; >> OkState State() const; >> >> - void ReMap(void const * const oldMap, void const * const newMap) >> + void ReMap(void *oldMap, void *newMap) > > Is there any particular reason for stripping const here and in other > similar places? > Yes, it's needed due to issues emerging from mixing const and non-const pointers with new and allegedly more proper way of calculating rebased pointers. > [...] >> @@ -301,7 +302,7 @@ std::experimental::optional<map_ptrloc> DynamicMMap::Allocate(unsigned long Item >> Pool* oldPools = Pools; >> auto idxResult = RawAllocate(I->Count*ItemSize,ItemSize); >> if (Pools != oldPools) >> - I += Pools - oldPools; >> + I = RebasePointer(I, oldPools, Pools); >> >> // Does the allocation failed ? >> if (!idxResult) > > In my patch RebasePointer invocation was after the idxResult check, > not before the check. > Theoretically, order here might be important. In practice, it doesn't matter. > By the way, in this and other similar cases, > is there any reason for "Pools != oldPools" check? > Is RebasePointer incapable of handling this, or is it an optimization? > It's just an optimization, it may be removed. > [...] >> diff --git a/apt/apt-pkg/rebase_pointer.h b/apt/apt-pkg/rebase_pointer.h >> new file mode 100644 >> index 0000000..f6b3c15 >> --- /dev/null >> +++ b/apt/apt-pkg/rebase_pointer.h >> @@ -0,0 +1,16 @@ >> +#ifndef PKGLIB_REBASE_POINTER_H >> +#define PKGLIB_REBASE_POINTER_H >> + >> +template <typename T> >> +static inline T* RebasePointer(T *ptr, void *old_base, void *new_base) >> +{ >> + return reinterpret_cast<T*>(reinterpret_cast<char*>(new_base) + (reinterpret_cast<char*>(ptr) - reinterpret_cast<char*>(old_base))); >> +} >> + >> +template <typename T> >> +static inline const T* RebasePointer(const T *ptr, void *old_base, void *new_base) >> +{ >> + return reinterpret_cast<const T*>(reinterpret_cast<char*>(new_base) + (reinterpret_cast<const char*>(ptr) - reinterpret_cast<char*>(old_base))); >> +} >> + >> +#endif > > Do we really need two templates here? > > Yes, second template with const ptr is needed for rpmListParser::rpmListParser from rpmlistparser.cc. Variable SeenPackages has type SeenPackagesType, which is a typedef to std::set<const char*,cstr_lt_pred>. Thus, elements are 'const char*', and either it should be const-casted to 'char*', which is ugly, or const-correctness should be achieved some other way, for example by getting rid of unimportant const qualifiers like in my changes. And first template is needed for every other case with non-const ptr. > > _______________________________________________ > Devel mailing list > Devel@lists.altlinux.org > https://lists.altlinux.org/mailman/listinfo/devel >
next prev parent reply other threads:[~2019-12-09 7:08 UTC|newest] Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-12-06 13:16 [devel] [PATCH for apt 1/2] Add option for debugging DynamicMMap::Allocate Aleksei Nikiforov 2019-12-06 13:16 ` [devel] [PATCH for apt 2/2] Fix pointer arithmetics Aleksei Nikiforov 2019-12-06 13:36 ` Ivan A. Melnikov 2019-12-06 15:32 ` Aleksei Nikiforov 2019-12-06 15:36 ` [devel] [PATCH for apt 2/2 v2] " Aleksei Nikiforov 2019-12-07 14:52 ` Andrey Savchenko 2019-12-08 22:56 ` Dmitry V. Levin 2019-12-09 6:54 ` Aleksei Nikiforov 2019-12-12 19:20 ` Andrey Savchenko 2019-12-13 7:58 ` Aleksei Nikiforov 2019-12-08 23:21 ` Dmitry V. Levin 2019-12-09 7:08 ` Aleksei Nikiforov [this message] 2019-12-10 0:07 ` Dmitry V. Levin 2019-12-10 8:18 ` Aleksei Nikiforov 2019-12-10 10:20 ` Dmitry V. Levin 2019-12-10 10:58 ` Aleksei Nikiforov 2019-12-10 22:20 ` Dmitry V. Levin 2019-12-11 7:50 ` Aleksei Nikiforov 2019-12-12 19:43 ` Andrey Savchenko 2019-12-13 8:01 ` Aleksei Nikiforov 2019-12-08 23:31 ` [devel] [PATCH for apt 2/2] " Dmitry V. Levin 2019-12-09 7:09 ` Aleksei Nikiforov 2019-12-09 7:16 ` [devel] [PATCH for apt 2/2 v3] " Aleksei Nikiforov 2019-12-09 23:54 ` [devel] [PATCH apt 0/3] Fix 0.5.15lorg2-alt70~9 fallout Dmitry V. Levin 2019-12-09 23:56 ` [devel] [PATCH apt 1/3] apt-pkg/cacheiterators.h: revert #include <set> Dmitry V. Levin 2019-12-09 23:56 ` [devel] [PATCH apt 2/3] apt-pkg/contrib/mmap.cc: revert confusing change of Flags to this->Flags Dmitry V. Levin 2019-12-09 23:56 ` [devel] [PATCH apt 3/3] Fix UB in pointer arithmetic Dmitry V. Levin 2019-12-10 8:18 ` Aleksei Nikiforov 2019-12-08 22:50 ` [devel] [PATCH for apt 1/2] Add option for debugging DynamicMMap::Allocate Dmitry V. Levin 2019-12-09 6:58 ` Aleksei Nikiforov 2019-12-09 10:24 ` Dmitry V. Levin 2019-12-09 11:03 ` [devel] [PATCH for apt 1/2 v3] Add Debug::DynamicMMap::Allocate option Aleksei Nikiforov 2019-12-09 22:59 ` Dmitry V. Levin 2019-12-09 7:00 ` [devel] [PATCH for apt 1/2 v2] Add option for debugging Debug::DynamicMMap::Allocate Aleksei Nikiforov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=dc72e16e-3305-7dc4-8aee-da71b085954f@altlinux.org \ --to=darktemplar@altlinux.org \ --cc=devel@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git