summaryrefslogtreecommitdiffabout
authorSimon Arlott <simon@fire.lp0.eu>2009-03-07 00:06:24 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-08-18 12:27:41 (UTC)
commit011f2e9bdddcbfe65da397629bca87d167313a28 (patch) (unidiff)
tree606b84a7b0211a6c4536bb508d57d4f19d20c3ab
parent6421dc38db02eff8d3ada93e87a2f7e5292af131 (diff)
downloadcgit-011f2e9bdddcbfe65da397629bca87d167313a28.zip
cgit-011f2e9bdddcbfe65da397629bca87d167313a28.tar.gz
cgit-011f2e9bdddcbfe65da397629bca87d167313a28.tar.bz2
truncate buffer before reading empty files
If readfile() reads an empty file, fgets() won't truncate the buffer and it'll still contain the contents of the previously read file. [lh: fixed similar issue in ui-repolist.c] Signed-off-by: Simon Arlott <simon@fire.lp0.eu> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--scan-tree.c1
-rw-r--r--ui-repolist.c1
2 files changed, 2 insertions, 0 deletions
diff --git a/scan-tree.c b/scan-tree.c
index cdafb02..47f3988 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -13,64 +13,65 @@ static int is_git_dir(const char *path)
13 fprintf(stderr, "Insanely long path: %s\n", path); 13 fprintf(stderr, "Insanely long path: %s\n", path);
14 return 0; 14 return 0;
15 } 15 }
16 if (stat(buf, &st)) { 16 if (stat(buf, &st)) {
17 if (errno != ENOENT) 17 if (errno != ENOENT)
18 fprintf(stderr, "Error checking path %s: %s (%d)\n", 18 fprintf(stderr, "Error checking path %s: %s (%d)\n",
19 path, strerror(errno), errno); 19 path, strerror(errno), errno);
20 return 0; 20 return 0;
21 } 21 }
22 if (!S_ISDIR(st.st_mode)) 22 if (!S_ISDIR(st.st_mode))
23 return 0; 23 return 0;
24 24
25 sprintf(buf, "%s/HEAD", path); 25 sprintf(buf, "%s/HEAD", path);
26 if (stat(buf, &st)) { 26 if (stat(buf, &st)) {
27 if (errno != ENOENT) 27 if (errno != ENOENT)
28 fprintf(stderr, "Error checking path %s: %s (%d)\n", 28 fprintf(stderr, "Error checking path %s: %s (%d)\n",
29 path, strerror(errno), errno); 29 path, strerror(errno), errno);
30 return 0; 30 return 0;
31 } 31 }
32 if (!S_ISREG(st.st_mode)) 32 if (!S_ISREG(st.st_mode))
33 return 0; 33 return 0;
34 34
35 return 1; 35 return 1;
36} 36}
37 37
38char *readfile(const char *path) 38char *readfile(const char *path)
39{ 39{
40 FILE *f; 40 FILE *f;
41 static char buf[MAX_PATH]; 41 static char buf[MAX_PATH];
42 42
43 if (!(f = fopen(path, "r"))) 43 if (!(f = fopen(path, "r")))
44 return NULL; 44 return NULL;
45 buf[0] = 0;
45 fgets(buf, MAX_PATH, f); 46 fgets(buf, MAX_PATH, f);
46 fclose(f); 47 fclose(f);
47 return buf; 48 return buf;
48} 49}
49 50
50static void add_repo(const char *base, const char *path) 51static void add_repo(const char *base, const char *path)
51{ 52{
52 struct cgit_repo *repo; 53 struct cgit_repo *repo;
53 struct stat st; 54 struct stat st;
54 struct passwd *pwd; 55 struct passwd *pwd;
55 char *p; 56 char *p;
56 57
57 if (stat(path, &st)) { 58 if (stat(path, &st)) {
58 fprintf(stderr, "Error accessing %s: %s (%d)\n", 59 fprintf(stderr, "Error accessing %s: %s (%d)\n",
59 path, strerror(errno), errno); 60 path, strerror(errno), errno);
60 return; 61 return;
61 } 62 }
62 if ((pwd = getpwuid(st.st_uid)) == NULL) { 63 if ((pwd = getpwuid(st.st_uid)) == NULL) {
63 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", 64 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",
64 path, strerror(errno), errno); 65 path, strerror(errno), errno);
65 return; 66 return;
66 } 67 }
67 if (base == path) 68 if (base == path)
68 p = fmt("%s", path); 69 p = fmt("%s", path);
69 else 70 else
70 p = fmt("%s", path + strlen(base) + 1); 71 p = fmt("%s", path + strlen(base) + 1);
71 72
72 if (!strcmp(p + strlen(p) - 5, "/.git")) 73 if (!strcmp(p + strlen(p) - 5, "/.git"))
73 p[strlen(p) - 5] = '\0'; 74 p[strlen(p) - 5] = '\0';
74 75
75 repo = cgit_add_repo(xstrdup(p)); 76 repo = cgit_add_repo(xstrdup(p));
76 repo->name = repo->url; 77 repo->name = repo->url;
diff --git a/ui-repolist.c b/ui-repolist.c
index 2c13d50..3aedde5 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -1,57 +1,58 @@
1/* ui-repolist.c: functions for generating the repolist page 1/* ui-repolist.c: functions for generating the repolist page
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9/* This is needed for strcasestr to be defined by <string.h> */ 9/* This is needed for strcasestr to be defined by <string.h> */
10#define _GNU_SOURCE 1 10#define _GNU_SOURCE 1
11#include <string.h> 11#include <string.h>
12 12
13#include <time.h> 13#include <time.h>
14 14
15#include "cgit.h" 15#include "cgit.h"
16#include "html.h" 16#include "html.h"
17#include "ui-shared.h" 17#include "ui-shared.h"
18 18
19time_t read_agefile(char *path) 19time_t read_agefile(char *path)
20{ 20{
21 FILE *f; 21 FILE *f;
22 static char buf[64], buf2[64]; 22 static char buf[64], buf2[64];
23 23
24 if (!(f = fopen(path, "r"))) 24 if (!(f = fopen(path, "r")))
25 return -1; 25 return -1;
26 buf[0] = 0;
26 if (fgets(buf, sizeof(buf), f) == NULL) 27 if (fgets(buf, sizeof(buf), f) == NULL)
27 return -1; 28 return -1;
28 fclose(f); 29 fclose(f);
29 if (parse_date(buf, buf2, sizeof(buf2))) 30 if (parse_date(buf, buf2, sizeof(buf2)))
30 return strtoul(buf2, NULL, 10); 31 return strtoul(buf2, NULL, 10);
31 else 32 else
32 return 0; 33 return 0;
33} 34}
34 35
35static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime) 36static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
36{ 37{
37 char *path; 38 char *path;
38 struct stat s; 39 struct stat s;
39 struct cgit_repo *r = (struct cgit_repo *)repo; 40 struct cgit_repo *r = (struct cgit_repo *)repo;
40 41
41 if (repo->mtime != -1) { 42 if (repo->mtime != -1) {
42 *mtime = repo->mtime; 43 *mtime = repo->mtime;
43 return 1; 44 return 1;
44 } 45 }
45 path = fmt("%s/%s", repo->path, ctx.cfg.agefile); 46 path = fmt("%s/%s", repo->path, ctx.cfg.agefile);
46 if (stat(path, &s) == 0) { 47 if (stat(path, &s) == 0) {
47 *mtime = read_agefile(path); 48 *mtime = read_agefile(path);
48 r->mtime = *mtime; 49 r->mtime = *mtime;
49 return 1; 50 return 1;
50 } 51 }
51 52
52 path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch); 53 path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch);
53 if (stat(path, &s) == 0) 54 if (stat(path, &s) == 0)
54 *mtime = s.st_mtime; 55 *mtime = s.st_mtime;
55 else 56 else
56 *mtime = 0; 57 *mtime = 0;
57 58