svn commit: r295240 - user/ngie/bsnmp_cleanup/usr.sbin/bsnmpd/tools/libbsnmptools

Garrett Cooper ngie at FreeBSD.org
Thu Feb 4 08:32:06 UTC 2016


Author: ngie
Date: Thu Feb  4 08:32:05 2016
New Revision: 295240
URL: https://svnweb.freebsd.org/changeset/base/295240

Log:
  - Use calloc instead of malloc + memset
  - Fix really busted logic proposed in r295191. Use asprintf instead of malloc,
    then strlcpy to circumvent the warning correctly by automatically creating
    the right sized buffer. The proposed change I committed was broken from the
    get-go because it was running strlen on an improperly initialized buffer, so
    it would have always segfaulted [*]
  
  Reported by: bde [*]

Modified:
  user/ngie/bsnmp_cleanup/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c

Modified: user/ngie/bsnmp_cleanup/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c
==============================================================================
--- user/ngie/bsnmp_cleanup/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c	Thu Feb  4 08:27:37 2016	(r295239)
+++ user/ngie/bsnmp_cleanup/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c	Thu Feb  4 08:32:05 2016	(r295240)
@@ -55,12 +55,11 @@ snmp_mapping_init(void)
 {
 	struct snmp_mappings *m;
 
-	if ((m = malloc(sizeof(struct snmp_mappings))) == NULL) {
+	if ((m = calloc(1, sizeof(struct snmp_mappings))) == NULL) {
 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
 		return (NULL);
 	}
 
-	memset(m, 0, sizeof(struct snmp_mappings));
 	return (m);
 }
 
@@ -268,21 +267,18 @@ enum_pair_insert(struct enum_pairs *head
 {
 	struct enum_pair *e_new;
 
-	if ((e_new = malloc(sizeof(struct enum_pair))) == NULL) {
+	if ((e_new = calloc(1, sizeof(struct enum_pair))) == NULL) {
 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
 		return (-1);
 	}
 
-	memset(e_new, 0, sizeof(struct enum_pair));
-
-	if ((e_new->enum_str = malloc(strlen(enum_str) + 1)) == NULL) {
+	if (asprintf(&e_new->enum_str, "%s", enum_str) == -1) {
 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
 		free(e_new);
 		return (-1);
 	}
 
 	e_new->enum_val = enum_val;
-	strlcpy(e_new->enum_str, enum_str, strlen(e_new->enum_str));
 	STAILQ_INSERT_TAIL(headp, e_new, link);
 
 	return (1);
@@ -481,13 +477,11 @@ snmp_syntax_insert(struct snmp_idxlist *
 {
 	struct index *idx;
 
-	if ((idx = malloc(sizeof(struct index))) == NULL) {
+	if ((idx = calloc(1, sizeof(struct index))) == NULL) {
 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
 		return (-1);
 	}
 
-	memset(idx, 0, sizeof(struct index));
-
 	if (snmp_index_insert(headp, idx) < 0) {
 		free(idx);
 		return (-1);
@@ -557,18 +551,16 @@ snmp_enumtc_init(char *name)
 {
 	struct enum_type *enum_tc;
 
-	if ((enum_tc = malloc(sizeof(struct enum_type))) == NULL) {
+	if ((enum_tc = calloc(1, sizeof(struct enum_type))) == NULL) {
 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
 		return (NULL);
 	}
 
-	memset(enum_tc, 0, sizeof(struct enum_type));
-	if ((enum_tc->name = malloc(strlen(name) + 1)) == NULL) {
+	if (asprintf(&enum_tc->name, "%s", name) == -1) {
 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
 		free(enum_tc);
 		return (NULL);
 	}
-	strlcpy(enum_tc->name, name, sizeof(enum_tc->name));
 
 	return (enum_tc);
 }


More information about the svn-src-user mailing list