aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-02-15 21:00:58 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-02-15 21:00:58 +0000
commitb0bc4317224e4287a4a362097df173899fc1a5af (patch)
tree7b1ae63e84abef3b9dbf797124ec6112cfa2e93f
parentaeb6b55d5e846a8864c38d94e61e9539a7527b31 (diff)
Merged revisions 175829 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r175829 | russell | 2009-02-15 14:56:27 -0600 (Sun, 15 Feb 2009) | 14 lines Fix a number of problems with ast_sched_report(). 1) It had numerous coding guidelines violations with regards to formatting. 2) It allocated memory using ast_calloc() that was never freed. 3) It didn't check for failure from the allocation. 4) It used sprintf() and strcat() to build the result, doing zero checking to prevent writing past the end of the provided buffer. The function also lacks API documentation, but that has not been addressed in this commit. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@175831 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_sip.c10
-rw-r--r--include/asterisk/sched.h5
-rw-r--r--main/sched.c37
3 files changed, 24 insertions, 28 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index ef7c4e001..1fb775179 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -13821,7 +13821,7 @@ static char *sip_show_user(struct ast_cli_entry *e, int cmd, struct ast_cli_args
static char *sip_show_sched(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- char cbuf[2256];
+ struct ast_str *cbuf;
struct ast_cb_names cbnames = {9, { "retrans_pkt",
"__sip_autodestruct",
"expire_register",
@@ -13851,9 +13851,13 @@ static char *sip_show_sched(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
case CLI_GENERATE:
return NULL;
}
+
+ cbuf = ast_str_alloca(2048);
+
ast_cli(a->fd, "\n");
- ast_sched_report(sched, cbuf, sizeof(cbuf), &cbnames);
- ast_cli(a->fd, "%s", cbuf);
+ ast_sched_report(sched, &cbuf, &cbnames);
+ ast_cli(a->fd, "%s", cbuf->str);
+
return CLI_SUCCESS;
}
diff --git a/include/asterisk/sched.h b/include/asterisk/sched.h
index ab328af95..ae1592553 100644
--- a/include/asterisk/sched.h
+++ b/include/asterisk/sched.h
@@ -145,13 +145,12 @@ void sched_context_destroy(struct sched_context *c);
typedef int (*ast_sched_cb)(const void *data);
#define AST_SCHED_CB(a) ((ast_sched_cb)(a))
-struct ast_cb_names
-{
+struct ast_cb_names {
int numassocs;
char *list[10];
ast_sched_cb cblist[10];
};
-char *ast_sched_report(struct sched_context *con, char *buf, int bufsiz, struct ast_cb_names *cbnames);
+void ast_sched_report(struct sched_context *con, struct ast_str **buf, struct ast_cb_names *cbnames);
/*! \brief Adds a scheduled event
* Schedule an event to take place at some point in the future. callback
diff --git a/main/sched.c b/main/sched.c
index d62ca115e..55823cb0e 100644
--- a/main/sched.c
+++ b/main/sched.c
@@ -386,41 +386,34 @@ int _ast_sched_del(struct sched_context *con, int id, const char *file, int line
return 0;
}
-
-char *ast_sched_report(struct sched_context *con, char *buf, int bufsiz, struct ast_cb_names *cbnames)
+void ast_sched_report(struct sched_context *con, struct ast_str **buf, struct ast_cb_names *cbnames)
{
- int *countlist,i;
+ int i;
struct sched *cur;
- char buf2[1200];
- ast_sched_cb xxx = NULL;
-
- buf[0] = 0;
- sprintf(buf, " Highwater = %d\n schedcnt = %d\n", con->highwater, con->schedcnt);
- countlist = ast_calloc(sizeof(int),cbnames->numassocs+1);
+ int countlist[cbnames->numassocs + 1];
+ ast_str_set(buf, 0, " Highwater = %d\n schedcnt = %d\n", con->highwater, con->schedcnt);
+
AST_DLLIST_TRAVERSE(&con->schedq, cur, list) {
/* match the callback to the cblist */
- for (i=0;i<cbnames->numassocs;i++) {
- if (cur->callback == cbnames->cblist[i])
+ for (i = 0; i < cbnames->numassocs; i++) {
+ if (cur->callback == cbnames->cblist[i]) {
break;
+ }
}
- if (i < cbnames->numassocs)
+ if (i < cbnames->numassocs) {
countlist[i]++;
- else {
- xxx = cur->callback;
+ } else {
countlist[cbnames->numassocs]++;
}
}
- for (i=0;i<cbnames->numassocs;i++) {
- sprintf(buf2," %s : %d\n", cbnames->list[i], countlist[i]);
- strcat(buf, buf2);
- }
- sprintf(buf2," <unknown:%p> : %d\n", xxx, countlist[cbnames->numassocs]);
- strcat( buf, buf2);
- return buf;
-}
+ for (i = 0; i < cbnames->numassocs; i++) {
+ ast_str_append(buf, 0, " %s : %d\n", cbnames->list[i], countlist[i]);
+ }
+ ast_str_append(buf, 0, " <unknown> : %d\n", countlist[cbnames->numassocs]);
+}
/*! \brief Dump the contents of the scheduler to LOG_DEBUG */
void ast_sched_dump(const struct sched_context *con)