diff options
author | 2016-05-13 07:23:36 -0700 | |
---|---|---|
committer | 2016-05-13 07:23:36 -0700 | |
commit | e0d6c57e15c9dd53074f8278253da53b78f743b8 (patch) | |
tree | 64acbf0dc66a86b11733dcbb64836cc885593945 /src/core/lib | |
parent | d039722f0628159376fc3afe34b9de490b261863 (diff) |
Fuzzing fixes
Diffstat (limited to 'src/core/lib')
-rw-r--r-- | src/core/lib/iomgr/error.c | 21 | ||||
-rw-r--r-- | src/core/lib/iomgr/error.h | 8 | ||||
-rw-r--r-- | src/core/lib/iomgr/tcp_posix.c | 1 | ||||
-rw-r--r-- | src/core/lib/transport/transport.h | 2 |
4 files changed, 31 insertions, 1 deletions
diff --git a/src/core/lib/iomgr/error.c b/src/core/lib/iomgr/error.c index 7e5d74b495..e75a643a54 100644 --- a/src/core/lib/iomgr/error.c +++ b/src/core/lib/iomgr/error.c @@ -158,6 +158,7 @@ static bool is_special(grpc_error *err) { err == GRPC_ERROR_CANCELLED; } +#ifdef GRPC_ERROR_REFCOUNT_DEBUG grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line, const char *func) { if (is_special(err)) return err; @@ -166,6 +167,13 @@ grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line, gpr_ref(&err->refs); return err; } +#else +grpc_error *grpc_error_ref(grpc_error *err) { + if (is_special(err)) return err; + gpr_ref(&err->refs); + return err; +} +#endif static void error_destroy(grpc_error *err) { GPR_ASSERT(!is_special(err)); @@ -176,6 +184,7 @@ static void error_destroy(grpc_error *err) { gpr_free(err); } +#ifdef GRPC_ERROR_REFCOUNT_DEBUG void grpc_error_unref(grpc_error *err, const char *file, int line, const char *func) { if (is_special(err)) return; @@ -185,6 +194,14 @@ void grpc_error_unref(grpc_error *err, const char *file, int line, error_destroy(err); } } +#else +void grpc_error_unref(grpc_error *err) { + if (is_special(err)) return; + if (gpr_unref(&err->refs)) { + error_destroy(err); + } +} +#endif grpc_error *grpc_error_create(const char *file, int line, const char *desc, grpc_error **referencing, @@ -193,7 +210,9 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc, if (err == NULL) { // TODO(ctiller): make gpr_malloc return NULL return GRPC_ERROR_OOM; } +#ifdef GRPC_ERROR_REFCOUNT_DEBUG gpr_log(GPR_DEBUG, "%p create [%s:%d]", err, file, line); +#endif err->ints = gpr_avl_add(gpr_avl_create(&avl_vtable_ints), (void *)(uintptr_t)GRPC_ERROR_INT_FILE_LINE, (void *)(uintptr_t)line); @@ -223,7 +242,9 @@ static grpc_error *copy_error_and_unref(grpc_error *in) { return GRPC_ERROR_CREATE("unknown"); } grpc_error *out = gpr_malloc(sizeof(*out)); +#ifdef GRPC_ERROR_REFCOUNT_DEBUG gpr_log(GPR_DEBUG, "%p create copying", out); +#endif out->ints = gpr_avl_ref(in->ints); out->strs = gpr_avl_ref(in->strs); out->errs = gpr_avl_ref(in->errs); diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index 0cc466e8c4..fa0a78011c 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -100,6 +100,8 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc, #define GRPC_ERROR_CREATE_REFERENCING(desc, errs, count) \ grpc_error_create(__FILE__, __LINE__, desc, errs, count) +#define GRPC_ERROR_REFCOUNT_DEBUG +#ifdef GRPC_ERROR_REFCOUNT_DEBUG grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line, const char *func); void grpc_error_unref(grpc_error *err, const char *file, int line, @@ -107,6 +109,12 @@ void grpc_error_unref(grpc_error *err, const char *file, int line, #define GRPC_ERROR_REF(err) grpc_error_ref(err, __FILE__, __LINE__, __func__) #define GRPC_ERROR_UNREF(err) \ grpc_error_unref(err, __FILE__, __LINE__, __func__) +#else +grpc_error *grpc_error_ref(grpc_error *err); +void grpc_error_unref(grpc_error *err); +#define GRPC_ERROR_REF(err) grpc_error_ref(err) +#define GRPC_ERROR_UNREF(err) grpc_error_unref(err) +#endif grpc_error *grpc_error_set_int(grpc_error *src, grpc_error_ints which, intptr_t value); diff --git a/src/core/lib/iomgr/tcp_posix.c b/src/core/lib/iomgr/tcp_posix.c index 766a976277..81c2acf79a 100644 --- a/src/core/lib/iomgr/tcp_posix.c +++ b/src/core/lib/iomgr/tcp_posix.c @@ -384,6 +384,7 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */, cb->cb(exec_ctx, cb->cb_arg, error); GPR_TIMER_END("tcp_handle_write.cb", 0); TCP_UNREF(exec_ctx, tcp, "write"); + GRPC_ERROR_UNREF(error); } } diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index f2d750e870..83529e794e 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -50,7 +50,7 @@ typedef struct grpc_transport grpc_transport; for a stream. */ typedef struct grpc_stream grpc_stream; -//#define GRPC_STREAM_REFCOUNT_DEBUG +#define GRPC_STREAM_REFCOUNT_DEBUG typedef struct grpc_stream_refcount { gpr_refcount refs; |