Re: a bug when execute "git status" in git version 1.7.7.431.g89633
- From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
- Date
- Oct 23, 2011, 13:25 UTC
- Message-ID
- <4EA415BD.1040109@lsrfire.ath.cx>
- In-Reply-To
- <4EA3D1BB.2010802@gmail.com>
Am 23.10.2011 10:35, schrieb John Hsing:
Show 7 quoted lines
> ok,when i finish compiling git 1.7.7.431.g89633,I use it to check > Cyanogenod(an Android mod source) by “git status”,it happend this > error!but when i reuse git v1.7.7,it is OK!so i think it is a bug in > git 1.7.7.431.g89633!My OS is Ubuntu Linux 10.10,sorry for my bad > english! If you want to reproduce this error,please excute "git status" > in https://github.com/CyanogenMod/android_packages_apps_DSPManager.git > repo!
I can reproduce the malloc crash on Ubuntu 11.10 with these simple steps:
$ a=android_packages_apps_DSPManager $ git-v1.7.7 clone https://github.com/CyanogenMod/$a.git Cloning into android_packages_apps_DSPManager... remote: Counting objects: 902, done. remote: Compressing objects: 100% (412/412), done. remote: Total 902 (delta 367), reused 838 (delta 324) Receiving objects: 100% (902/902), 136.78 KiB | 264 KiB/s, done. Resolving deltas: 100% (367/367), done. $ cd $a
$ git-v1.7.7 status # On branch gingerbread nothing to commit (working directory clean)
$ git-master status git: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. Aborted
Bisect points to 2548183ba, "fix phantom untracked files when core.ignorecase is set" from Jeff (cc:d). If I revert that patch from master (8963314c), git status works fine.
The following experimental patch fixes it for me as well, but I can't claim to know exactly why. In any case, estimate_cache_size() seems to guess too low.
René
--- read-cache.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/read-cache.c b/read-cache.c index 01a0e25..b143bd3 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1257,7 +1257,7 @@ static inline size_t estimate_cache_size(size_t ondisk_size, unsigned int entrie * Alignment can cause differences. This should be "alignof", but * since that's a gcc'ism, just use the size of a pointer. */ - per_entry += sizeof(void *); + per_entry += 2 * sizeof(void *); return ondisk_size + entries*per_entry; }