author | Lukas Fleischer <cgit@cryptocrack.de> | 2011-04-05 08:35:43 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2011-05-23 20:58:35 (UTC) |
commit | a0bf375a1a9b74056a913f3687c6f5b42ad4acf6 (patch) (side-by-side diff) | |
tree | d8845fbb7fcf73da11f29673081ed2ca31964e2e | |
parent | 070e109c1413d28b54eb6123a9fd24ac98897554 (diff) | |
download | cgit-a0bf375a1a9b74056a913f3687c6f5b42ad4acf6.zip cgit-a0bf375a1a9b74056a913f3687c6f5b42ad4acf6.tar.gz cgit-a0bf375a1a9b74056a913f3687c6f5b42ad4acf6.tar.bz2 |
Avoid null pointer dereference in reencode().
Returning "*txt" if "txt" is a null pointer is a bad thing. Spotted with
clang-analyzer.
Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | parsing.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -42,129 +42,132 @@ void cgit_parse_url(const char *url) ctx.qry.repo = ctx.repo->url; p = strchr(cmd + 1, '/'); if (p) { p[0] = '\0'; if (p[1]) ctx.qry.path = trim_end(p + 1, '/'); } if (cmd[1]) ctx.qry.page = xstrdup(cmd + 1); return; } } char *substr(const char *head, const char *tail) { char *buf; buf = xmalloc(tail - head + 1); strncpy(buf, head, tail - head); buf[tail - head] = '\0'; return buf; } char *parse_user(char *t, char **name, char **email, unsigned long *date) { char *p = t; int mode = 1; while (p && *p) { if (mode == 1 && *p == '<') { *name = substr(t, p - 1); t = p; mode++; } else if (mode == 1 && *p == '\n') { *name = substr(t, p); p++; break; } else if (mode == 2 && *p == '>') { *email = substr(t, p + 1); t = p; mode++; } else if (mode == 2 && *p == '\n') { *email = substr(t, p); p++; break; } else if (mode == 3 && isdigit(*p)) { *date = atol(p); mode++; } else if (*p == '\n') { p++; break; } p++; } return p; } #ifdef NO_ICONV #define reencode(a, b, c) #else const char *reencode(char **txt, const char *src_enc, const char *dst_enc) { char *tmp; - if (!txt || !*txt || !src_enc || !dst_enc) + if (!txt) + return NULL; + + if (!*txt || !src_enc || !dst_enc) return *txt; /* no encoding needed if src_enc equals dst_enc */ if(!strcasecmp(src_enc, dst_enc)) return *txt; tmp = reencode_string(*txt, dst_enc, src_enc); if (tmp) { free(*txt); *txt = tmp; } return *txt; } #endif struct commitinfo *cgit_parse_commit(struct commit *commit) { struct commitinfo *ret; char *p = commit->buffer, *t = commit->buffer; ret = xmalloc(sizeof(*ret)); ret->commit = commit; ret->author = NULL; ret->author_email = NULL; ret->committer = NULL; ret->committer_email = NULL; ret->subject = NULL; ret->msg = NULL; ret->msg_encoding = NULL; if (p == NULL) return ret; if (strncmp(p, "tree ", 5)) die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); else p += 46; // "tree " + hex[40] + "\n" while (!strncmp(p, "parent ", 7)) p += 48; // "parent " + hex[40] + "\n" if (p && !strncmp(p, "author ", 7)) { p = parse_user(p + 7, &ret->author, &ret->author_email, &ret->author_date); } if (p && !strncmp(p, "committer ", 9)) { p = parse_user(p + 9, &ret->committer, &ret->committer_email, &ret->committer_date); } if (p && !strncmp(p, "encoding ", 9)) { p += 9; t = strchr(p, '\n'); if (t) { ret->msg_encoding = substr(p, t + 1); p = t + 1; } } /* if no special encoding is found, assume UTF-8 */ if(!ret->msg_encoding) ret->msg_encoding = xstrdup("UTF-8"); |