summaryrefslogtreecommitdiffabout
path: root/parsing.c
Unidiff
Diffstat (limited to 'parsing.c') (more/less context) (ignore whitespace changes)
-rw-r--r--parsing.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/parsing.c b/parsing.c
index 332d61c..8e15e5a 100644
--- a/parsing.c
+++ b/parsing.c
@@ -55,37 +55,39 @@ int read_config_line(FILE *f, char *line, const char **value, int bufsize)
55 } else { 55 } else {
56 line[i]=c; 56 line[i]=c;
57 } 57 }
58 isname = 1; 58 isname = 1;
59 i++; 59 i++;
60 } 60 }
61 line[i+1] = 0; 61 line[i+1] = 0;
62 return i; 62 return i;
63} 63}
64 64
65int cgit_read_config(const char *filename, configfn fn) 65int cgit_read_config(const char *filename, configfn fn)
66{ 66{
67 int ret = 0, len; 67 static int nesting;
68 int len;
68 char line[256]; 69 char line[256];
69 const char *value; 70 const char *value;
70 FILE *f = fopen(filename, "r"); 71 FILE *f;
71 72
72 if (!f) 73 /* cancel the reading of yet another configfile after 16 invocations */
74 if (nesting++ > 16)
75 return -1;
76 if (!(f = fopen(filename, "r")))
73 return -1; 77 return -1;
74
75 while((len = read_config_line(f, line, &value, sizeof(line))) > 0) 78 while((len = read_config_line(f, line, &value, sizeof(line))) > 0)
76 (*fn)(line, value); 79 (*fn)(line, value);
77
78 fclose(f); 80 fclose(f);
79 return ret; 81 return 0;
80} 82}
81 83
82char *convert_query_hexchar(char *txt) 84char *convert_query_hexchar(char *txt)
83{ 85{
84 int d1, d2; 86 int d1, d2;
85 if (strlen(txt) < 3) { 87 if (strlen(txt) < 3) {
86 *txt = '\0'; 88 *txt = '\0';
87 return txt-1; 89 return txt-1;
88 } 90 }
89 d1 = hextoint(*(txt+1)); 91 d1 = hextoint(*(txt+1));
90 d2 = hextoint(*(txt+2)); 92 d2 = hextoint(*(txt+2));
91 if (d1<0 || d2<0) { 93 if (d1<0 || d2<0) {