Date: Fri, 20 Nov 1998 21:37:21 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Archie Cobbs <archie@whistle.com>, grog@lemis.com, rnordier@nordier.com, freebsd-current@FreeBSD.ORG Subject: Re: snprintf() in the kernel Message-ID: <199811210537.VAA20822@apollo.backplane.com> References: <199811210312.TAA25314@bubba.whistle.com> <199811210407.UAA20321@apollo.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
I've gone through your diffs. I found what I believe to be one genuine bug, but read the notes and stuff below... you may have a problem with some of the strncpy()'s you converted to snprintf's. General comments: * found a few minor bugs. * noticed a number of 'scary uses' in original code were fixed, kudos! * noticed a few bugs in the original code were fixed, kudos! For example, a number of strncpy()'s assume zero-termination. strncpy() does not zero-terminate in the exact-length case. Notes: It should be noted that the FreeBSD strncpy() will zero-fill the destination. snprintf() does not. This may or may not matter. It didn't seem to be important in what I saw in my review but you should review the disklabel-related snprintf()'s. Also review zero-termination cases for disklabels... make sure disklabel isn't designed to allow a full-length string (without zero-termination) else your snprintf()'s have broke something. I noticed a number of strncpy()'s were using sizeof(the_buffer_name), which might have been on purpose! snprintf() will break that. -Matt alpha/alpha/db_disasm.c line 196, static char unk[8]; ... buffer is not big enough. Needs to be at least 11. The snprintf() prevents a possible overflow (a bug fixed!), but the buffer should probably be made larger anyway. cam/scsi/scsi_all.c line 1566, char holdstr[8] was totally broken anyway, it wasn't big enough (needs to be 10). Your patch removes it which is good. A second bug fixed! dev/buslogin/bt.c Boy, weren't we lucky that all BT model names were 4 characters! dev/dpt/dpt_control.c This doesn't look right, you forgot to remove the strncpy and replace it with the snprintf, but added the extra sizeof() argument as if you had. @@ -782,7 +783,8 @@ compat_softc.ha_npend = dpt->submitted_ccbs_coun t; compat_softc.ha_active_jobs = dpt->waiting_ccbs_ count; strncpy(compat_softc.ha_fw_version, - dpt->board_data.firmware, 4); + dpt->board_data.firmware, + sizeof(compat_softc.ha_fw_version)); compat_softc.ha_ccb = NULL; compat_softc.ha_cblist = NULL; i386/isa/mcd.c (Looks like you fixed a bug here... the strncpy was assuming zero termination) netatm/spans/spans_print.c (Hey, nice, you fixed another bug, at least if someone ever made saddr and daddr differently sized). - strncpy(daddr, spans_addr_print(&stind_p->stind_es_addr), - sizeof(daddr)); - strncpy(saddr, spans_addr_print(&stind_p->stind_sw_addr), - sizeof(daddr)); + snprintf(daddr, sizeof(daddr), + "%s", spans_addr_print(&stind_p->stind_es_addr)); + snprintf(saddr, sizeof(daddr), + "%s", spans_addr_print(&stind_p->stind_sw_addr)); printf("sw_epoch=0x%lx, es_addr=%s, sw_addr=0x%s", ... netatm/spans/spans_util.c: I'm not sure about these ntohl() calls. Some of the defines just macro the arguments through, others are routines, but historically ntohl() has operated on a 32 bit quantity so we should probably cast to ntohl() results to (long) in the s*printf() calls as well as do the sprintf()->snprintf() conversion. RCS file: /cvs/freebsd/src/sys/netatm/spans/spans_util.c,v retrieving revision 1.3 diff -u -r1.3 spans_util.c --- spans_util.c 1998/10/31 20:06:56 1.3 +++ spans_util.c 1998/11/21 03:03:09 @@ -441,7 +441,7 @@ /* * Print and return the string */ - sprintf(strbuff, "%lx.%lx", ntohl(u1.w), ntohl(u2.w)); + snprintf(strbuff, sizeof(strbuff), "%lx.%lx", ntohl(u1.w), ntohl(u2.w)); return(strbuff); } netinet/ip_divert.c: You might have to zero-fill unused space in sin_zero. I'm not sure. @@ -217,9 +216,9 @@ * this iface name will come along for the ride. * (see div_output for the other half of this.) */ - sprintf(name, "%s%d", - m->m_pkthdr.rcvif->if_name, m->m_pkthdr.rcvif->if_unit); - strncpy(divsrc.sin_zero, name, 7); + snprintf(divsrc.sin_zero, sizeof(divsrc.sin_zero), + "%s%d", m->m_pkthdr.rcvif->if_name, + m->m_pkthdr.rcvif->if_unit); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199811210537.VAA20822>