Module Name: src Committed By: christos Date: Wed Aug 24 12:15:45 UTC 2011
Modified Files: src/sbin/sysctl: sysctl.c Log Message: Instead of using strncat and re-scanning the strings all the time, use and append printf function. To generate a diff of this commit: cvs rdiff -u -r1.136 -r1.137 src/sbin/sysctl/sysctl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/sysctl/sysctl.c diff -u src/sbin/sysctl/sysctl.c:1.136 src/sbin/sysctl/sysctl.c:1.137 --- src/sbin/sysctl/sysctl.c:1.136 Tue Aug 2 21:58:30 2011 +++ src/sbin/sysctl/sysctl.c Wed Aug 24 08:15:44 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sysctl.c,v 1.136 2011/08/03 01:58:30 christos Exp $ */ +/* $NetBSD: sysctl.c,v 1.137 2011/08/24 12:15:44 christos Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ #if 0 static char sccsid[] = "@(#)sysctl.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: sysctl.c,v 1.136 2011/08/03 01:58:30 christos Exp $"); +__RCSID("$NetBSD: sysctl.c,v 1.137 2011/08/24 12:15:44 christos Exp $"); #endif #endif /* not lint */ @@ -554,6 +554,21 @@ rnode->sysctl_desc = NULL; } +static void __attribute__((__format__(__printf__, 3, 4))) +appendprintf(char **bp, size_t *lbp, const char *fmt, ...) +{ + int r; + va_list ap; + + va_start(ap, fmt); + r = vsnprintf(*bp, *lbp, fmt, ap); + va_end(ap); + if (r < 0 || (size_t)r > *lbp) + r = *lbp; + *bp += r; + *lbp -= r; +} + /* * ******************************************************************** * print this node and any others underneath it @@ -565,35 +580,31 @@ { struct sysctlnode *node; int rc; - size_t ni, sz; - char *sp, *dp, n[20]; + size_t ni, sz, ldp, lsp; + char *sp, *dp, *tsp, *tdp; const struct handlespec *p; - sp = &gsname[strlen(gsname)]; - dp = &gdname[strlen(gdname)]; + sp = tsp = &gsname[strlen(gsname)]; + dp = tdp = &gdname[strlen(gdname)]; + ldp = sizeof(gdname) - (dp - gdname); + lsp = sizeof(gsname) - (sp - gsname); if (sp != &gsname[0] && dp == &gdname[0]) { /* * aw...shucks. now we must play catch up */ - for (ni = 0; ni < namelen; ni++) { - (void)snprintf(n, sizeof(n), "%d", name[ni]); - if (ni > 0) - strncat(gdname, ".", sizeof(gdname)); - strncat(gdname, n, sizeof(gdname)); - } + for (ni = 0; ni < namelen; ni++) + appendprintf(&tdp, &ldp, "%s%d", ni > 0 ? "." : "", + name[ni]); } if (pnode == NULL) pnode = &my_root; else if (add) { - snprintf(n, sizeof(n), "%d", pnode->sysctl_num); - if (namelen > 1) { - strncat(gsname, sep, sizeof(gsname)); - strncat(gdname, ".", sizeof(gdname)); - } - strncat(gsname, pnode->sysctl_name, sizeof(gsname)); - strncat(gdname, n, sizeof(gdname)); + appendprintf(&tsp, &lsp, "%s%s", namelen > 1 ? sep : "", + pnode->sysctl_name); + appendprintf(&tdp, &ldp, "%s%d", namelen > 1 ? "." : "", + pnode->sysctl_num); } if (Mflag && pnode != &my_root) {