Commit e1295400 by Julian Ganz Committed by Patrick Steinhardt

parse: Do not initialize the content in context to NULL

String operations in libgit2 are supposed to never receive `NULL`, e.g.
they are not `NULL`-save. In the case of `git__linenlen()`, invocation
with `NULL` leads to undefined behavior.

In a `git_parse_ctx` however, the `content` field used in these
operations was initialized to `NULL` if the `git_parse_ctx_init()` was
called with `NULL` for `content` or `0` for `content_len`. For the
latter case, the initialization function even contained some logic for
initializing `content` with `NULL`.

This commit mitigates triggering undefined behavior by rewriting the
logic. Now `content` is always initialized to a non-null buffer. Instead
of a null buffer, an empty string is used for denoting an empty buffer.

(cherry picked from commit d1bfe614)
parent b8844566
...@@ -8,12 +8,14 @@ ...@@ -8,12 +8,14 @@
int git_parse_ctx_init(git_parse_ctx *ctx, const char *content, size_t content_len) int git_parse_ctx_init(git_parse_ctx *ctx, const char *content, size_t content_len)
{ {
if (content_len) if (content && content_len) {
ctx->content = content; ctx->content = content;
else
ctx->content = NULL;
ctx->content_len = content_len; ctx->content_len = content_len;
} else {
ctx->content = "";
ctx->content_len = 0;
}
ctx->remain = ctx->content; ctx->remain = ctx->content;
ctx->remain_len = ctx->content_len; ctx->remain_len = ctx->content_len;
ctx->line = ctx->remain; ctx->line = ctx->remain;
...@@ -26,6 +28,7 @@ int git_parse_ctx_init(git_parse_ctx *ctx, const char *content, size_t content_l ...@@ -26,6 +28,7 @@ int git_parse_ctx_init(git_parse_ctx *ctx, const char *content, size_t content_l
void git_parse_ctx_clear(git_parse_ctx *ctx) void git_parse_ctx_clear(git_parse_ctx *ctx)
{ {
memset(ctx, 0, sizeof(*ctx)); memset(ctx, 0, sizeof(*ctx));
ctx->content = "";
} }
void git_parse_advance_line(git_parse_ctx *ctx) void git_parse_advance_line(git_parse_ctx *ctx)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment