From: lytboris at gmail dot com Operating system: FreeBSD PHP version: 5.2.9 PHP Bug Type: SNMP related Bug description: *_real_walk returns SNMP errors as values
Description: ------------ When remote SNMP agent returns an error with same OID that contained correct value *_real_walk functions will overwrite this correct value with error message because there is no snmp reply status check. Here is patch to address this issue: ======== --- ext/snmp/snmp.c.orig 2008-12-31 14:17:43.000000000 +0300 +++ ext/snmp/snmp.c 2009-05-14 10:31:23.000000000 +0400 @@ -480,12 +480,15 @@ } else if (st == SNMP_CMD_WALK) { add_next_index_zval(return_value,snmpval); /* Add to returned array */ } else if (st == SNMP_CMD_REALWALK) { + if (vars->type != SNMP_ENDOFMIBVIEW && + vars->type != SNMP_NOSUCHOBJECT && vars->type != SNMP_NOSUCHINSTANCE) { #ifdef HAVE_NET_SNMP - snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); + snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); #else - sprint_objid(buf2, vars->name, vars->name_length); + sprint_objid(buf2, vars->name, vars->name_length); #endif - add_assoc_zval(return_value,buf2,snmpval); + add_assoc_zval(return_value,buf2,snmpval); + } } if (st >= SNMP_CMD_WALK && st != SNMP_CMD_SET) { if (vars->type != SNMP_ENDOFMIBVIEW && ============ in BASE64 form: begin-base64 644 - LS0tIGV4dC9zbm1wL3NubXAuYy5vcmlnCTIwMDgtMTItMzEgMTQ6MTc6NDMuMDAwMDAwMDAwICsw MzAwCisrKyBleHQvc25tcC9zbm1wLmMJMjAwOS0wNS0xNCAxMDozMToyMy4wMDAwMDAwMDAgKzA0 MDAKQEAgLTQ4MCwxMiArNDgwLDE1IEBACiAJCQkJCX0gZWxzZSBpZiAoc3QgPT0gU05NUF9DTURf V0FMSykgewogCQkJCQkJYWRkX25leHRfaW5kZXhfenZhbChyZXR1cm5fdmFsdWUsc25tcHZhbCk7 IC8qIEFkZCB0byByZXR1cm5lZCBhcnJheSAqLwogCQkJCQl9IGVsc2UgaWYgKHN0ID09IFNOTVBf Q01EX1JFQUxXQUxLKSAgeworCQkJCQkJaWYgKHZhcnMtPnR5cGUgIT0gU05NUF9FTkRPRk1JQlZJ RVcgJiYgCisJCQkJCQkJdmFycy0+dHlwZSAhPSBTTk1QX05PU1VDSE9CSkVDVCAmJiB2YXJzLT50 eXBlICE9IFNOTVBfTk9TVUNISU5TVEFOQ0UpIHsKICNpZmRlZiBIQVZFX05FVF9TTk1QCi0JCQkJ CQlzbnByaW50X29iamlkKGJ1ZjIsIHNpemVvZihidWYyKSwgdmFycy0+bmFtZSwgdmFycy0+bmFt ZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCXNucHJpbnRfb2JqaWQoYnVmMiwgc2l6ZW9mKGJ1ZjIpLCB2YXJzLT5uYW1lLCB2YXJzLT5u YW1lX2xlbmd0aCk7CiAjZWxzZQotCQkJCQkJc3ByaW50X29iamlkKGJ1ZjIsIHZhcnMtPm5hbWUs IHZhcnMtPm5hbWVfbGVuZ3RoKTsKKwkJCQkJCQlzcHJpbnRfb2JqaWQoYnVmMiwgdmFycy0+bmFt ZSwgdmFycy0+bmFtZV9sZW5ndGgpOwogI2VuZGlmCi0JCQkJCQlhZGRfYXNzb2NfenZhbChyZXR1 cm5fdmFsdWUsYnVmMixzbm1wdmFsKTsKKwkJCQkJCQlhZGRfYXNzb2NfenZhbChyZXR1cm5fdmFs dWUsYnVmMixzbm1wdmFsKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCQlpZiAoc3QgPj0gU05NUF9D TURfV0FMSyAmJiBzdCAhPSBTTk1QX0NNRF9TRVQpIHsKIAkJCQkJCWlmICh2YXJzLT50eXBlICE9 IFNOTVBfRU5ET0ZNSUJWSUVXICYmIAo= ==== Reproduce code: --------------- print_r(@snmp2_real_walk("host:161", "community", ".1.3.6.1.4.1.8072.2.1.2.3", (800 * 1000), 2)): ======= Result shown by snmpwalk: >snmpwalk -v2c -ccommunity host .1.3.6.1.4.1.8072.2.1.2.3 NET-SNMP-MIB::netSnmp.2.1.2.3.1 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.2 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.3 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.4 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.5 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.6 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.7 = "" NET-SNMP-MIB::netSnmp.2.1.2.3.8 = STRING: "blah" NET-SNMP-MIB::netSnmp.2.1.2.3.8 = No more variables left in this MIB View (It is past the end of the MIB tree) Expected result: ---------------- Array ( [NET-SNMP-MIB::netSnmp.2.1.2.3.1] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.2] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.3] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.4] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.5] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.6] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.7] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.8] => "blah" ) Actual result: -------------- Array ( [NET-SNMP-MIB::netSnmp.2.1.2.3.1] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.2] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.3] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.4] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.5] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.6] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.7] => "" [NET-SNMP-MIB::netSnmp.2.1.2.3.8] => No Such Instance currently exists at this OID ) -- Edit bug report at http://bugs.php.net/?id=48273&edit=1 -- Try a CVS snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=48273&r=trysnapshot52 Try a CVS snapshot (PHP 5.3): http://bugs.php.net/fix.php?id=48273&r=trysnapshot53 Try a CVS snapshot (PHP 6.0): http://bugs.php.net/fix.php?id=48273&r=trysnapshot60 Fixed in CVS: http://bugs.php.net/fix.php?id=48273&r=fixedcvs Fixed in CVS and need be documented: http://bugs.php.net/fix.php?id=48273&r=needdocs Fixed in release: http://bugs.php.net/fix.php?id=48273&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=48273&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=48273&r=needscript Try newer version: http://bugs.php.net/fix.php?id=48273&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=48273&r=support Expected behavior: http://bugs.php.net/fix.php?id=48273&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=48273&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=48273&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=48273&r=globals PHP 4 support discontinued: http://bugs.php.net/fix.php?id=48273&r=php4 Daylight Savings: http://bugs.php.net/fix.php?id=48273&r=dst IIS Stability: http://bugs.php.net/fix.php?id=48273&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=48273&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=48273&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=48273&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=48273&r=mysqlcfg