summaryrefslogtreecommitdiffabout
path: root/cgit.c
authorLars Hjemli <hjemli@gmail.com>2006-12-11 08:57:58 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2006-12-11 08:57:58 (UTC)
commitf5069d88dff7a7ed2f4665904b03e906cca75a7c (patch) (unidiff)
tree4c9bfa3aaf931af4a345ffb9563b19825c38b628 /cgit.c
parent76827d8679d1d2bd46e8cddf7da2ce4178e1d676 (diff)
downloadcgit-f5069d88dff7a7ed2f4665904b03e906cca75a7c.zip
cgit-f5069d88dff7a7ed2f4665904b03e906cca75a7c.tar.gz
cgit-f5069d88dff7a7ed2f4665904b03e906cca75a7c.tar.bz2
Fix cache algorithm loophole
This closes the door for unneccessary calls to cgit_fill_cache(). Noticed by Linus. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.c') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/cgit.c b/cgit.c
index 110face..7f14016 100644
--- a/cgit.c
+++ b/cgit.c
@@ -456,38 +456,38 @@ static void cgit_print_repo_page()
456static void cgit_fill_cache(struct cacheitem *item) 456static void cgit_fill_cache(struct cacheitem *item)
457{ 457{
458 htmlfd = item->fd; 458 htmlfd = item->fd;
459 item->st.st_mtime = time(NULL); 459 item->st.st_mtime = time(NULL);
460 if (cgit_query_repo) 460 if (cgit_query_repo)
461 cgit_print_repo_page(); 461 cgit_print_repo_page();
462 else 462 else
463 cgit_print_repolist(); 463 cgit_print_repolist();
464} 464}
465 465
466static void cgit_refresh_cache(struct cacheitem *item) 466static void cgit_refresh_cache(struct cacheitem *item)
467{ 467{
468 cache_prepare(item);
468 top: 469 top:
469 if (!cache_lookup(item)) { 470 if (!cache_exist(item)) {
470 if (cache_lock(item)) { 471 if (!cache_lock(item)) {
471 cgit_fill_cache(item);
472 cache_unlock(item);
473 } else {
474 sched_yield(); 472 sched_yield();
475 goto top; 473 goto top;
476 } 474 }
477 } else if (cache_expired(item)) { 475 if (!cache_exist(item))
478 if (cache_lock(item)) {
479 cgit_fill_cache(item); 476 cgit_fill_cache(item);
480 cache_unlock(item); 477 cache_unlock(item);
481 } 478 } else if (cache_expired(item) && cache_lock(item)) {
479 if (cache_expired(item))
480 cgit_fill_cache(item);
481 cache_unlock(item);
482 } 482 }
483} 483}
484 484
485static void cgit_print_cache(struct cacheitem *item) 485static void cgit_print_cache(struct cacheitem *item)
486{ 486{
487 static char buf[4096]; 487 static char buf[4096];
488 ssize_t i; 488 ssize_t i;
489 489
490 int fd = open(item->name, O_RDONLY); 490 int fd = open(item->name, O_RDONLY);
491 if (fd<0) 491 if (fd<0)
492 die("Unable to open cached file %s", item->name); 492 die("Unable to open cached file %s", item->name);
493 493