|
diff --git a/html.c b/html.c index 337baeb..eaabf72 100644 --- a/ html.c+++ b/ html.c |
|
@@ -247,61 +247,62 @@ int html_include(const char *filename) |
247 | fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", |
247 | fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", |
248 | filename, strerror(errno), errno); |
248 | filename, strerror(errno), errno); |
249 | return -1; |
249 | return -1; |
250 | } |
250 | } |
251 | while((len = fread(buf, 1, 4096, f)) > 0) |
251 | while((len = fread(buf, 1, 4096, f)) > 0) |
252 | write(htmlfd, buf, len); |
252 | write(htmlfd, buf, len); |
253 | fclose(f); |
253 | fclose(f); |
254 | return 0; |
254 | return 0; |
255 | } |
255 | } |
256 | |
256 | |
257 | int hextoint(char c) |
257 | int hextoint(char c) |
258 | { |
258 | { |
259 | if (c >= 'a' && c <= 'f') |
259 | if (c >= 'a' && c <= 'f') |
260 | return 10 + c - 'a'; |
260 | return 10 + c - 'a'; |
261 | else if (c >= 'A' && c <= 'F') |
261 | else if (c >= 'A' && c <= 'F') |
262 | return 10 + c - 'A'; |
262 | return 10 + c - 'A'; |
263 | else if (c >= '0' && c <= '9') |
263 | else if (c >= '0' && c <= '9') |
264 | return c - '0'; |
264 | return c - '0'; |
265 | else |
265 | else |
266 | return -1; |
266 | return -1; |
267 | } |
267 | } |
268 | |
268 | |
269 | char *convert_query_hexchar(char *txt) |
269 | char *convert_query_hexchar(char *txt) |
270 | { |
270 | { |
271 | int d1, d2; |
271 | int d1, d2, n; |
272 | if (strlen(txt) < 3) { |
272 | n = strlen(txt); |
| |
273 | if (n < 3) { |
273 | *txt = '\0'; |
274 | *txt = '\0'; |
274 | return txt-1; |
275 | return txt-1; |
275 | } |
276 | } |
276 | d1 = hextoint(*(txt+1)); |
277 | d1 = hextoint(*(txt+1)); |
277 | d2 = hextoint(*(txt+2)); |
278 | d2 = hextoint(*(txt+2)); |
278 | if (d1<0 || d2<0) { |
279 | if (d1<0 || d2<0) { |
279 | strcpy(txt, txt+3); |
280 | memmove(txt, txt+3, n-3); |
280 | return txt-1; |
281 | return txt-1; |
281 | } else { |
282 | } else { |
282 | *txt = d1 * 16 + d2; |
283 | *txt = d1 * 16 + d2; |
283 | strcpy(txt+1, txt+3); |
284 | memmove(txt+1, txt+3, n-2); |
284 | return txt; |
285 | return txt; |
285 | } |
286 | } |
286 | } |
287 | } |
287 | |
288 | |
288 | int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) |
289 | int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) |
289 | { |
290 | { |
290 | char *t, *txt, *value = NULL, c; |
291 | char *t, *txt, *value = NULL, c; |
291 | |
292 | |
292 | if (!txt_) |
293 | if (!txt_) |
293 | return 0; |
294 | return 0; |
294 | |
295 | |
295 | t = txt = strdup(txt_); |
296 | t = txt = strdup(txt_); |
296 | if (t == NULL) { |
297 | if (t == NULL) { |
297 | printf("Out of memory\n"); |
298 | printf("Out of memory\n"); |
298 | exit(1); |
299 | exit(1); |
299 | } |
300 | } |
300 | while((c=*t) != '\0') { |
301 | while((c=*t) != '\0') { |
301 | if (c=='=') { |
302 | if (c=='=') { |
302 | *t = '\0'; |
303 | *t = '\0'; |
303 | value = t+1; |
304 | value = t+1; |
304 | } else if (c=='+') { |
305 | } else if (c=='+') { |
305 | *t = ' '; |
306 | *t = ' '; |
306 | } else if (c=='%') { |
307 | } else if (c=='%') { |
307 | t = convert_query_hexchar(t); |
308 | t = convert_query_hexchar(t); |
|