]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix a number of problems with ast_sched_report().
authorRussell Bryant <russell@russellbryant.com>
Sun, 15 Feb 2009 20:56:27 +0000 (20:56 +0000)
committerRussell Bryant <russell@russellbryant.com>
Sun, 15 Feb 2009 20:56:27 +0000 (20:56 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@175829 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
include/asterisk/sched.h
main/sched.c

index 686496bee66c8836e007d90fac67be976be51e5a..0742c3010a0d1571da443b0ff8a2d4f71aa6d085 100644 (file)
@@ -14631,7 +14631,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",
@@ -14661,9 +14661,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;
 }
 
index f9e1ca5d2df840c6811b7cec16c561740e3ebbef..564453ae29aefd85a634a58c94db38e29c46f7d5 100644 (file)
@@ -147,13 +147,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
index 8b69814a3f0b9880e58fbabfd3f3549c36da8798..e6fe0549f216bebcb13814d2a2fdd7c48e96adce 100644 (file)
@@ -528,41 +528,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)