From: Lars Hjemli Date: Mon, 11 Dec 2006 18:38:57 GMT Subject: Re: [ANNOUNCE] CGit v0.1-pre Message-ID: <8c5c35580612111038u480b1f95xdb7cf1b3b8fd97b@mail.gmail.com> In-Reply-To: On 12/11/06, Linus Torvalds wrote: > > > On Mon, 11 Dec 2006, Lars Hjemli wrote: > > > > Ok. Code speeks louder than words, so I'll blatantly paste the key functions: > > Yeah, they're still buggy: > > > int cache_unlock(struct cacheitem *item) > > { > > close(item->fd); > > return (rename(fmt("%s.lock", item->name), item->name) == 0); > > } > ... > > if (!cache_exist(item)) { > > if (!cache_lock(item)) { > > sleep(1); > > goto top; > > } > > if (!cache_exist(item)) > > cgit_fill_cache(item); > > cache_unlock(item); > > What do you think happens if that last "cache_exist()" returned true? > > That's right: the "cache_unlock()" will now OVERWRITE the valid cache with > the (empty) lock-file that you didn't fill in. > > Oops. > Wow, that's embarrassing. Thanks for the debugging, I'll try to actually fix it this time :-) --