Each RLogCallback have its own user pointer ##crash

This commit is contained in:
pancake 2024-05-27 17:09:46 +02:00 committed by pancake
parent 3806e4e3cb
commit edd00184df
2 changed files with 31 additions and 17 deletions

View File

@ -1,9 +1,9 @@
/* radare - LGPL - Copyright 2009-2022 - pancake */
/* radare - LGPL - Copyright 2009-2024 - pancake */
#include <r_core.h>
R_API int r_core_log_list(RCore *core, int n, int nth, char fmt) {
r_return_val_if_fail (core && core->log, 0);
R_RETURN_VAL_IF_FAIL (core && core->log, 0);
int printed = 0;
int count = 0, idx, id = core->log->first;
RStrpool *sp = core->log->sp;
@ -80,7 +80,7 @@ R_API RCoreLog *r_core_log_new(void) {
}
R_API void r_core_log_init(RCoreLog *log) {
r_return_if_fail (log);
R_RETURN_IF_FAIL (log);
log->first = 1;
log->last = 1;
log->sp = r_strpool_new (0);
@ -117,9 +117,9 @@ R_API bool r_core_log_run(RCore *core, const char *_buf, RCoreLogCallback cb_run
}
R_API char *r_core_log_get(RCore *core, int index) {
r_return_val_if_fail (core && core->config, NULL);
R_RETURN_VAL_IF_FAIL (core && core->config, NULL);
const char *host = r_config_get (core->config, "http.sync");
if (host && *host) {
if (R_STR_ISNOTEMPTY (host)) {
char *url = index > 0
? r_str_newf ("%s/cmd/T%%20%d", host, index)
: r_str_newf ("%s/cmd/T", host);

View File

@ -6,6 +6,10 @@
#include <stdarg.h>
static R_TH_LOCAL RLog *rlog = NULL;
typedef struct r_log_cbuser_t {
void *user;
RLogCallback cb;
} RLogCallbackUser;
static const char *level_tags[] = { // Log level to tag string lookup array
[R_LOG_LEVEL_FATAL] = "FATAL",
@ -145,9 +149,9 @@ R_API bool r_log_match(int level, const char *origin) {
}
if (rlog->cbs) {
RListIter *iter;
RLogCallback cb;
r_list_foreach (rlog->cbs, iter, cb) {
if (cb (rlog->user, level, origin, NULL)) {
RLogCallbackUser *cbu;
r_list_foreach (rlog->cbs, iter, cbu) {
if (cbu->cb (cbu->user, level, origin, NULL)) {
return true;
}
}
@ -157,16 +161,16 @@ R_API bool r_log_match(int level, const char *origin) {
R_API void r_log_vmessage(RLogLevel level, const char *origin, const char *func, int line, const char *fmt, va_list ap) {
char out[512];
int type = 3;
int type = R_LOG_LEVEL_WARN;
if (!r_log_init ()) {
return;
}
vsnprintf (out, sizeof (out), fmt, ap);
if (rlog->cbs) {
RListIter *iter;
RLogCallback cb;
r_list_foreach (rlog->cbs, iter, cb) {
if (cb (rlog->user, type, origin, out)) {
RLogCallbackUser *cbu;
r_list_foreach (rlog->cbs, iter, cbu) {
if (cbu->cb (cbu->user, type, origin, out)) {
return;
}
}
@ -235,19 +239,29 @@ R_API void r_log_add_callback(RLogCallback cb, void *user) {
return;
}
if (!rlog->cbs) {
rlog->cbs = r_list_new ();
rlog->cbs = r_list_newf (free);
}
#if !R2_USE_NEW_ABI
if (user) {
rlog->user = user;
}
if (!r_list_contains (rlog->cbs, cb)) {
r_list_append (rlog->cbs, cb);
}
#endif
RLogCallbackUser *cbu = R_NEW (RLogCallbackUser);
cbu->cb = cb;
cbu->user = user;
r_list_append (rlog->cbs, cbu);
}
R_API void r_log_del_callback(RLogCallback cb) {
if (r_log_init ()) {
r_list_delete_data (rlog->cbs, cb);
RLogCallbackUser *p;
RListIter *iter;
r_list_foreach (rlog->cbs, iter, p) {
if (cb == p->cb) {
r_list_delete (rlog->cbs, iter);
return;
}
}
}
}