On Fri, Dec 18, 2009 at 03:26:14PM +0300, Alexander Sabourenkov wrote:
> Dumping string-type data would spew contents of uninitialized memory
> because ber_get_string does no effort to zero-terminate its result.

Please submit diffs that apply to -current.

I admit ignorance of SNMP internals but by inspecting the code I
am not convinced this is the right fix.  Before working around
missing NUL terminator it must become clear why is it missing in
the first place.

Look at buf_read_element.  The BER_TYPE_OCTETSTRING is always
NUL-terminated.  Why is the terminator missing few lines later?

Then look at mps_setstr.  It strdups BER_TYPE_OCTETSTRING.  If NUL
was always missing, then use of strdup would be incorrect.  Is it?

Jacek

> Index: snmpe.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
> retrieving revision 1.25
> diff -u snmpe.c
> --- snmpe.c   16 Dec 2009 22:17:53 -0000      1.25
> +++ snmpe.c   18 Dec 2009 12:15:24 -0000
> @@ -433,9 +433,11 @@
>                   root->be_type == SNMP_T_IPADDR) {
>                       fprintf(stderr, "addr %s\n",
>                           inet_ntoa(*(struct in_addr *)buf));
> -             } else
> -                     fprintf(stderr, "string \"%s\"\n",
> -                         root->be_len ? buf : "");
> +             } else {
> +                     fwrite("string \"", 8, 1, stderr);
> +                     fwrite(buf, root->be_len, 1, stderr);
> +                     fwrite("\"\n", 2, 1, stderr);
> +             }
>               break;
>       case BER_TYPE_NULL:     /* no payload */
>       case BER_TYPE_EOC:
> 
> -- 
> 
> ./lxnt

Reply via email to