Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=frugalware-0.7.git;a=commitdiff;h=f4299c4e3103e5b66f7343186656ea00d2a12758

commit f4299c4e3103e5b66f7343186656ea00d2a12758
Author: voroskoi <[EMAIL PROTECTED]>
Date:   Tue Jan 22 18:11:33 2008 +0100

asterisk-1.4.13-1sayshell2-i686
fixes for AST-2007-025, AST-2007-026
AST-2007-027 and AST-2008-001
closes #2652

diff --git a/source/apps-extra/asterisk/AST-2007-025.diff 
b/source/apps-extra/asterisk/AST-2007-025.diff
new file mode 100644
index 0000000..b65a16c
--- /dev/null
+++ b/source/apps-extra/asterisk/AST-2007-025.diff
@@ -0,0 +1,145 @@
+--- res/res_config_pgsql.c     2007/11/29 18:50:22     90159
++++ res/res_config_pgsql.c     2007/11/29 19:24:11     90160
+@@ -79,8 +79,8 @@
+ static struct ast_variable *realtime_pgsql(const char *database, const char 
*table, va_list ap)
+ {
+       PGresult *result = NULL;
+-      int num_rows = 0;
+-      char sql[256];
++      int num_rows = 0, pgerror;
++      char sql[256], escapebuf[513];
+       char *stringp;
+       char *chunk;
+       char *op;
+@@ -109,16 +109,31 @@
+          If there is only 1 set, then we have our query. Otherwise, loop thru 
the list and concat */
+       op = strchr(newparam, ' ') ? "" : " =";
+
++      PQescapeStringConn(pgsqlConn, escapebuf, newval, (sizeof(escapebuf) - 
1) / 2, &pgerror);
++      if (pgerror) {
++              ast_log(LOG_ERROR, "Postgres detected invalid input: '%s'\n", 
newval);
++              va_end(ap);
++              return NULL;
++      }
++
+       snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s%s '%s'", table, 
newparam, op,
+-                       newval);
++                       escapebuf);
+       while ((newparam = va_arg(ap, const char *))) {
+               newval = va_arg(ap, const char *);
+               if (!strchr(newparam, ' '))
+                       op = " =";
+               else
+                       op = "";
++
++              PQescapeStringConn(pgsqlConn, escapebuf, newval, 
(sizeof(escapebuf) - 1) / 2, &pgerror);
++              if (pgerror) {
++                      ast_log(LOG_ERROR, "Postgres detected invalid input: 
'%s'\n", newval);
++                      va_end(ap);
++                      return NULL;
++              }
++
+               snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND 
%s%s '%s'", newparam,
+-                               op, newval);
++                               op, escapebuf);
+       }
+       va_end(ap);
+
+@@ -202,8 +217,8 @@
+ static struct ast_config *realtime_multi_pgsql(const char *database, const 
char *table, va_list ap)
+ {
+       PGresult *result = NULL;
+-      int num_rows = 0;
+-      char sql[256];
++      int num_rows = 0, pgerror;
++      char sql[256], escapebuf[513];
+       const char *initfield = NULL;
+       char *stringp;
+       char *chunk;
+@@ -250,16 +265,31 @@
+       else
+               op = "";
+
++      PQescapeStringConn(pgsqlConn, escapebuf, newval, (sizeof(escapebuf) - 
1) / 2, &pgerror);
++      if (pgerror) {
++              ast_log(LOG_ERROR, "Postgres detected invalid input: '%s'\n", 
newval);
++              va_end(ap);
++              return NULL;
++      }
++
+       snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s%s '%s'", table, 
newparam, op,
+-                       newval);
++                       escapebuf);
+       while ((newparam = va_arg(ap, const char *))) {
+               newval = va_arg(ap, const char *);
+               if (!strchr(newparam, ' '))
+                       op = " =";
+               else
+                       op = "";
++
++              PQescapeStringConn(pgsqlConn, escapebuf, newval, 
(sizeof(escapebuf) - 1) / 2, &pgerror);
++              if (pgerror) {
++                      ast_log(LOG_ERROR, "Postgres detected invalid input: 
'%s'\n", newval);
++                      va_end(ap);
++                      return NULL;
++              }
++
+               snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND 
%s%s '%s'", newparam,
+-                               op, newval);
++                               op, escapebuf);
+       }
+
+       if (initfield) {
+@@ -351,8 +381,8 @@
+                                               const char *lookup, va_list ap)
+ {
+       PGresult *result = NULL;
+-      int numrows = 0;
+-      char sql[256];
++      int numrows = 0, pgerror;
++      char sql[256], escapebuf[513];
+       const char *newparam, *newval;
+
+       if (!table) {
+@@ -376,15 +406,38 @@
+       /* Create the first part of the query using the first parameter/value 
pairs we just extracted
+          If there is only 1 set, then we have our query. Otherwise, loop thru 
the list and concat */
+
+-      snprintf(sql, sizeof(sql), "UPDATE %s SET %s = '%s'", table, newparam, 
newval);
++      PQescapeStringConn(pgsqlConn, escapebuf, newval, (sizeof(escapebuf) - 
1) / 2, &pgerror);
++      if (pgerror) {
++              ast_log(LOG_ERROR, "Postgres detected invalid input: '%s'\n", 
newval);
++              va_end(ap);
++              return -1;
++      }
++      snprintf(sql, sizeof(sql), "UPDATE %s SET %s = '%s'", table, newparam, 
escapebuf);
++
+       while ((newparam = va_arg(ap, const char *))) {
+               newval = va_arg(ap, const char *);
++
++              PQescapeStringConn(pgsqlConn, escapebuf, newval, 
(sizeof(escapebuf) - 1) / 2, &pgerror);
++              if (pgerror) {
++                      ast_log(LOG_ERROR, "Postgres detected invalid input: 
'%s'\n", newval);
++                      va_end(ap);
++                      return -1;
++              }
++
+               snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), ", %s = 
'%s'", newparam,
+-                               newval);
++                               escapebuf);
+       }
+       va_end(ap);
++
++      PQescapeStringConn(pgsqlConn, escapebuf, lookup, (sizeof(escapebuf) - 
1) / 2, &pgerror);
++      if (pgerror) {
++              ast_log(LOG_ERROR, "Postgres detected invalid input: '%s'\n", 
lookup);
++              va_end(ap);
++              return -1;
++      }
++
+       snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " WHERE %s = 
'%s'", keyfield,
+-                       lookup);
++                       escapebuf);
+
+       ast_log(LOG_DEBUG, "Postgresql RealTime: Update SQL: %s\n", sql);
+
diff --git a/source/apps-extra/asterisk/AST-2007-026.diff 
b/source/apps-extra/asterisk/AST-2007-026.diff
new file mode 100644
index 0000000..77fab83
--- /dev/null
+++ b/source/apps-extra/asterisk/AST-2007-026.diff
@@ -0,0 +1,55 @@
+--- cdr/cdr_pgsql.c    2007/11/29 19:43:33     90165
++++ cdr/cdr_pgsql.c    2007/11/29 19:48:10     90166
+@@ -96,28 +96,33 @@
+
+       if (connected) {
+               char *clid=NULL, *dcontext=NULL, *channel=NULL, 
*dstchannel=NULL, *lastapp=NULL, *lastdata=NULL;
+-              char *uniqueid=NULL, *userfield=NULL;
++              char *src=NULL, *dst=NULL, *uniqueid=NULL, *userfield=NULL;
++              int pgerr;
+
+               /* Maximum space needed would be if all characters needed to be 
escaped, plus a trailing NULL */
+               if ((clid = alloca(strlen(cdr->clid) * 2 + 1)) != NULL)
+-                      PQescapeString(clid, cdr->clid, strlen(cdr->clid));
++                      PQescapeStringConn(conn, clid, cdr->clid, 
strlen(cdr->clid), &pgerr);
+               if ((dcontext = alloca(strlen(cdr->dcontext) * 2 + 1)) != NULL)
+-                      PQescapeString(dcontext, cdr->dcontext, 
strlen(cdr->dcontext));
++                      PQescapeStringConn(conn, dcontext, cdr->dcontext, 
strlen(cdr->dcontext), &pgerr);
+               if ((channel = alloca(strlen(cdr->channel) * 2 + 1)) != NULL)
+-                      PQescapeString(channel, cdr->channel, 
strlen(cdr->channel));
++                      PQescapeStringConn(conn, channel, cdr->channel, 
strlen(cdr->channel), &pgerr);
+               if ((dstchannel = alloca(strlen(cdr->dstchannel) * 2 + 1)) != 
NULL)
+-                      PQescapeString(dstchannel, cdr->dstchannel, 
strlen(cdr->dstchannel));
++                      PQescapeStringConn(conn, dstchannel, cdr->dstchannel, 
strlen(cdr->dstchannel), &pgerr);
+               if ((lastapp = alloca(strlen(cdr->lastapp) * 2 + 1)) != NULL)
+-                      PQescapeString(lastapp, cdr->lastapp, 
strlen(cdr->lastapp));
++                      PQescapeStringConn(conn, lastapp, cdr->lastapp, 
strlen(cdr->lastapp), &pgerr);
+               if ((lastdata = alloca(strlen(cdr->lastdata) * 2 + 1)) != NULL)
+-                      PQescapeString(lastdata, cdr->lastdata, 
strlen(cdr->lastdata));
++                      PQescapeStringConn(conn, lastdata, cdr->lastdata, 
strlen(cdr->lastdata), &pgerr);
+               if ((uniqueid = alloca(strlen(cdr->uniqueid) * 2 + 1)) != NULL)
+-                      PQescapeString(uniqueid, cdr->uniqueid, 
strlen(cdr->uniqueid));
++                      PQescapeStringConn(conn, uniqueid, cdr->uniqueid, 
strlen(cdr->uniqueid), &pgerr);
+               if ((userfield = alloca(strlen(cdr->userfield) * 2 + 1)) != 
NULL)
+-                      PQescapeString(userfield, cdr->userfield, 
strlen(cdr->userfield));
++                      PQescapeStringConn(conn, userfield, cdr->userfield, 
strlen(cdr->userfield), &pgerr);
++              if ((src = alloca(strlen(cdr->src) * 2 + 1)) != NULL)
++                      PQescapeStringConn(conn, src, cdr->src, 
strlen(cdr->src), &pgerr);
++              if ((dst = alloca(strlen(cdr->dst) * 2 + 1)) != NULL)
++                      PQescapeStringConn(conn, dst, cdr->dst, 
strlen(cdr->dst), &pgerr);
+
+               /* Check for all alloca failures above at once */
+-              if ((!clid) || (!dcontext) || (!channel) || (!dstchannel) || 
(!lastapp) || (!lastdata) || (!uniqueid) || (!userfield)) {
++              if ((!clid) || (!dcontext) || (!channel) || (!dstchannel) || 
(!lastapp) || (!lastdata) || (!uniqueid) || (!userfield) || (!src) || (!dst)) {
+                       ast_log(LOG_ERROR, "cdr_pgsql:  Out of memory error 
(insert fails)\n");
+                       ast_mutex_unlock(&pgsql_lock);
+                       return -1;
+@@ -129,7 +134,7 @@
+               snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s 
(calldate,clid,src,dst,dcontext,channel,dstchannel,"
+                                
"lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield)
 VALUES"
+                                " ('%s','%s','%s','%s','%s', 
'%s','%s','%s','%s',%ld,%ld,'%s',%ld,'%s','%s','%s')",
+-                               table,timestr,clid,cdr->src, cdr->dst, 
dcontext,channel, dstchannel, lastapp, lastdata,
++                               table, timestr, clid, src, dst, dcontext, 
channel, dstchannel, lastapp, lastdata,
+                                
cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, 
cdr->accountcode, uniqueid, userfield);
+
+               if (option_debug > 2)
diff --git a/source/apps-extra/asterisk/AST-2007-027-2.diff 
b/source/apps-extra/asterisk/AST-2007-027-2.diff
new file mode 100644
index 0000000..bf05c65
--- /dev/null
+++ b/source/apps-extra/asterisk/AST-2007-027-2.diff
@@ -0,0 +1,11 @@
+--- channels/chan_iax2.c       2007/12/19 16:39:49     93948
++++ channels/chan_iax2.c       2007/12/19 17:04:13     93949
+@@ -2696,7 +2696,7 @@
+                       }
+               }
+       }
+-      if (!var) { /* Last ditch effort */
++      if (!var && peername) { /* Last ditch effort */
+               var = ast_load_realtime("iaxpeers", "name", peername, NULL);
+               /*!\note
+                * If this one loaded something, then we need to ensure that 
the host
diff --git a/source/apps-extra/asterisk/AST-2007-027-3.diff 
b/source/apps-extra/asterisk/AST-2007-027-3.diff
new file mode 100644
index 0000000..7ecb36c
--- /dev/null
+++ b/source/apps-extra/asterisk/AST-2007-027-3.diff
@@ -0,0 +1,11 @@
+--- channels/chan_iax2.c       2007/12/20 20:21:41     94255
++++ channels/chan_iax2.c       2007/12/20 20:22:22     94256
+@@ -2704,7 +2704,7 @@
+                * is because we only have the IP address and the host field 
might be
+                * set as a name (and the reverse PTR might not match).
+                */
+-              if (var) {
++              if (var && sin) {
+                       for (tmp = var; tmp; tmp = tmp->next) {
+                               if (!strcasecmp(tmp->name, "host")) {
+                                       struct in_addr sin2 = { 0, };
diff --git a/source/apps-extra/asterisk/AST-2007-027.diff 
b/source/apps-extra/asterisk/AST-2007-027.diff
new file mode 100644
index 0000000..63f3472
--- /dev/null
+++ b/source/apps-extra/asterisk/AST-2007-027.diff
@@ -0,0 +1,153 @@
+--- channels/chan_sip.c        2007/12/18 18:23:06     93667
++++ channels/chan_sip.c        2007/12/18 18:29:39     93668
+@@ -149,6 +149,7 @@
+ #include "asterisk/compiler.h"
+ #include "asterisk/threadstorage.h"
+ #include "asterisk/translate.h"
++#include "asterisk/dnsmgr.h"
+
+ #ifndef FALSE
+ #define FALSE    0
+@@ -2497,9 +2498,35 @@
+       unsigned short portnum;
+
+       /* First check on peer name */
+-      if (newpeername)
+-              var = ast_load_realtime("sippeers", "name", newpeername, NULL);
+-      else if (sin) { /* Then check on IP address */
++      if (newpeername) {
++              var = ast_load_realtime("sippeers", "name", newpeername, 
"host", "dynamic", NULL);
++              if (!var && sin) {
++                      var = ast_load_realtime("sippeers", "name", 
newpeername, "host", ast_inet_ntoa(sin->sin_addr), NULL);
++                      if (!var) {
++                              var = ast_load_realtime("sippeers", "name", 
newpeername, NULL);
++                              /*!\note
++                               * If this one loaded something, then we need 
to ensure that the host
++                               * field matched.  The only reason why we can't 
have this as a criteria
++                               * is because we only have the IP address and 
the host field might be
++                               * set as a name (and the reverse PTR might not 
match).
++                               */
++                              if (var) {
++                                      for (tmp = var; tmp; tmp = tmp->next) {
++                                              if (!strcasecmp(var->name, 
"host")) {
++                                                      struct in_addr sin2 = { 
0, };
++                                                      struct ast_dnsmgr_entry 
*dnsmgr = NULL;
++                                                      if 
((ast_dnsmgr_lookup(tmp->value, &sin2, &dnsmgr) < 0) || (memcmp(&sin2, 
&sin->sin_addr, sizeof(sin2)) != 0)) {
++                                                              /* No match */
++                                                              
ast_variables_destroy(var);
++                                                              var = NULL;
++                                                      }
++                                                      break;
++                                              }
++                                      }
++                              }
++                      }
++              }
++      } else if (sin) {       /* Then check on IP address */
+               iabuf = ast_inet_ntoa(sin->sin_addr);
+               portnum = ntohs(sin->sin_port);
+               sprintf(portstring, "%d", portnum);
+--- channels/chan_iax2.c       2007/12/18 18:23:06     93667
++++ channels/chan_iax2.c       2007/12/18 18:29:39     93668
+@@ -2680,9 +2680,11 @@
+       time_t regseconds = 0, nowtime;
+       int dynamic=0;
+
+-      if (peername)
+-              var = ast_load_realtime("iaxpeers", "name", peername, NULL);
+-      else {
++      if (peername) {
++              var = ast_load_realtime("iaxpeers", "name", peername, "host", 
"dynamic", NULL);
++              if (!var && sin)
++                      var = ast_load_realtime("iaxpeers", "name", peername, 
"host", ast_inet_ntoa(sin->sin_addr));
++      } else if (sin) {
+               char porta[25];
+               sprintf(porta, "%d", ntohs(sin->sin_port));
+               var = ast_load_realtime("iaxpeers", "ipaddr", 
ast_inet_ntoa(sin->sin_addr), "port", porta, NULL);
+@@ -2694,6 +2696,29 @@
+                       }
+               }
+       }
++      if (!var) { /* Last ditch effort */
++              var = ast_load_realtime("iaxpeers", "name", peername, NULL);
++              /*!\note
++               * If this one loaded something, then we need to ensure that 
the host
++               * field matched.  The only reason why we can't have this as a 
criteria
++               * is because we only have the IP address and the host field 
might be
++               * set as a name (and the reverse PTR might not match).
++               */
++              if (var) {
++                      for (tmp = var; tmp; tmp = tmp->next) {
++                              if (!strcasecmp(tmp->name, "host")) {
++                                      struct in_addr sin2 = { 0, };
++                                      struct ast_dnsmgr_entry *dnsmgr = NULL;
++                                      if ((ast_dnsmgr_lookup(tmp->value, 
&sin2, &dnsmgr) < 0) || (memcmp(&sin2, &sin->sin_addr, sizeof(sin2)) != 0)) {
++                                              /* No match */
++                                              ast_variables_destroy(var);
++                                              var = NULL;
++                                      }
++                                      break;
++                              }
++                      }
++              }
++      }
+       if (!var)
+               return NULL;
+
+@@ -2769,13 +2794,45 @@
+       return peer;
+ }
+
+-static struct iax2_user *realtime_user(const char *username)
++static struct iax2_user *realtime_user(const char *username, struct 
sockaddr_in *sin)
+ {
+       struct ast_variable *var;
+       struct ast_variable *tmp;
+       struct iax2_user *user=NULL;
+
+-      var = ast_load_realtime("iaxusers", "name", username, NULL);
++      var = ast_load_realtime("iaxusers", "name", username, "host", 
"dynamic", NULL);
++      if (!var)
++              var = ast_load_realtime("iaxusers", "name", username, "host", 
ast_inet_ntoa(sin->sin_addr));
++      if (!var && sin) {
++              char porta[6];
++              snprintf(porta, sizeof(porta), "%d", ntohs(sin->sin_port));
++              var = ast_load_realtime("iaxusers", "name", username, "ipaddr", 
ast_inet_ntoa(sin->sin_addr), "port", porta, NULL);
++              if (!var)
++                      var = ast_load_realtime("iaxusers", "ipaddr", 
ast_inet_ntoa(sin->sin_addr), "port", porta, NULL);
++      }
++      if (!var) { /* Last ditch effort */
++              var = ast_load_realtime("iaxusers", "name", username, NULL);
++              /*!\note
++               * If this one loaded something, then we need to ensure that 
the host
++               * field matched.  The only reason why we can't have this as a 
criteria
++               * is because we only have the IP address and the host field 
might be
++               * set as a name (and the reverse PTR might not match).
++               */
++              if (var) {
++                      for (tmp = var; tmp; tmp = tmp->next) {
++                              if (!strcasecmp(tmp->name, "host")) {
++                                      struct in_addr sin2 = { 0, };
++                                      struct ast_dnsmgr_entry *dnsmgr = NULL;
++                                      if ((ast_dnsmgr_lookup(tmp->value, 
&sin2, &dnsmgr) < 0) || (memcmp(&sin2, &sin->sin_addr, sizeof(sin2)) != 0)) {
++                                              /* No match */
++                                              ast_variables_destroy(var);
++                                              var = NULL;
++                                      }
++                                      break;
++                              }
++                      }
++              }
++      }
+       if (!var)
+               return NULL;
+
+@@ -4970,7 +5027,7 @@
+       }
+       user = best;
+       if (!user && !ast_strlen_zero(iaxs[callno]->username)) {
+-              user = realtime_user(iaxs[callno]->username);
++              user = realtime_user(iaxs[callno]->username, sin);
+               if (user && !ast_strlen_zero(iaxs[callno]->context) &&          
        /* No context specified */
+                   !apply_context(user->contexts, iaxs[callno]->context)) {    
        /* Context is permitted */
+                       user = user_unref(user);
diff --git a/source/apps-extra/asterisk/AST-2008-001.diff 
b/source/apps-extra/asterisk/AST-2008-001.diff
new file mode 100644
index 0000000..40f144d
--- /dev/null
+++ b/source/apps-extra/asterisk/AST-2008-001.diff
@@ -0,0 +1,18 @@
+--- channels/chan_sip.c        2008/01/02 20:23:23     95945
++++ channels/chan_sip.c        2008/01/02 20:24:09     95946
+@@ -9048,9 +9048,14 @@
+ {
+       char tmp[256] = "", *c, *a;
+       struct sip_request *req = oreq ? oreq : &p->initreq;
+-      struct sip_refer *referdata = p->refer;
++      struct sip_refer *referdata = NULL;
+       const char *transfer_context = NULL;
+
++      if (!p->refer && !sip_refer_allocate(p))
++              return -1;
++
++      referdata = p->refer;
++
+       ast_copy_string(tmp, get_header(req, "Also"), sizeof(tmp));
+       c = get_in_brackets(tmp);
+
diff --git a/source/apps-extra/asterisk/FrugalBuild 
b/source/apps-extra/asterisk/FrugalBuild
index 3248aac..6887139 100644
--- a/source/apps-extra/asterisk/FrugalBuild
+++ b/source/apps-extra/asterisk/FrugalBuild
@@ -4,7 +4,7 @@

pkgname=asterisk
pkgver=1.4.13
-pkgrel=1sayshell1
+pkgrel=1sayshell2
pkgdesc="Open Source Private Branch Exchange (PBX)."
url="http://asterisk.org/";
backup=(etc/asterisk/*)
@@ -15,9 +15,9 @@ depends=('asterisk-sounds' 'curl>=7.16.0' 'glibc' 'libidn' 
'ncurses' 'newt' 'pop
groups=('apps-extra')
archs=('i686' 'x86_64')
up2date="lynx -dump http://ftp.digium.com/pub/asterisk/|grep 
asterisk-[0-9\.]*tar.gz$|Flasttar"
-source=(http://ftp.digium.com/pub/$pkgname/$pkgname-$pkgver.tar.gz rc.asterisk)
-sha1sums=('76c07dcbc39bf77ef3de6eba5d345a1f22d1dc16' \
-          '1c18155cdece83d556e2295b54508636ff74f307')
+source=(http://downloads.digium.com/pub/asterisk/releases/$pkgname-$pkgver.tar.gz
 rc.asterisk \
+       AST-2007-025.diff AST-2007-026.diff AST-2007-027.diff 
AST-2007-027-2.diff AST-2007-027-3.diff AST-2008-001.diff)
+signatures=($source.asc '' '' '' '' '' '' '')

build()
{
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to