svn commit: r283584 - in head: contrib/netbsd-tests/lib/libc/string lib/libc/string

Ed Maste emaste at FreeBSD.org
Tue May 26 21:16:09 UTC 2015


Author: emaste
Date: Tue May 26 21:16:07 2015
New Revision: 283584
URL: https://svnweb.freebsd.org/changeset/base/283584

Log:
  memmem(3): empty little string matches the beginning of the big string
  
  This function originated in glibc, and this matches their behaviour
  (and NetBSD, OpenBSD, and musl).
  
  An empty big string (arg "l") is handled by the existing
  l_len < s_len test.
  
  Reviewed by:	bapt, ngie
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D2657

Modified:
  head/contrib/netbsd-tests/lib/libc/string/t_memmem.c
  head/lib/libc/string/memmem.3
  head/lib/libc/string/memmem.c

Modified: head/contrib/netbsd-tests/lib/libc/string/t_memmem.c
==============================================================================
--- head/contrib/netbsd-tests/lib/libc/string/t_memmem.c	Tue May 26 21:12:02 2015	(r283583)
+++ head/contrib/netbsd-tests/lib/libc/string/t_memmem.c	Tue May 26 21:16:07 2015	(r283584)
@@ -75,7 +75,7 @@ ATF_TC_HEAD(memmem_basic, tc)
 ATF_TC_BODY(memmem_basic, tc)
 {
 
-#if defined(__darwin__) || defined(__FreeBSD__)
+#if defined(__darwin__)
 	expect(memmem(b2, lb2, p0, lp0) == NULL);
 	expect(memmem(b0, lb0, p0, lp0) == NULL);
 #else

Modified: head/lib/libc/string/memmem.3
==============================================================================
--- head/lib/libc/string/memmem.3	Tue May 26 21:12:02 2015	(r283583)
+++ head/lib/libc/string/memmem.3	Tue May 26 21:16:07 2015	(r283584)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 24, 2005
+.Dd May 26, 2015
 .Dt MEMMEM 3
 .Os
 .Sh NAME
@@ -51,14 +51,12 @@ in the byte string
 .Fa big .
 .Sh RETURN VALUES
 If
-.Fa big_len
-is smaller than
-.Fa little_len ,
-if
 .Fa little_len
-is 0, if
-.Fa big_len
-is 0 or if
+is zero
+.Fa big
+is returned (that is, an empty little is deemed to match at the beginning of
+big);
+if
 .Fa little
 occurs nowhere in
 .Fa big ,
@@ -84,3 +82,11 @@ function first appeared in
 .Sh BUGS
 This function was broken in Linux libc up to and including version 5.0.9
 and in GNU libc prior to version 2.1.
+Prior to
+.Fx 11.0
+.Nm
+returned
+.Dv NULL
+when
+.Fa little_len
+equals 0.

Modified: head/lib/libc/string/memmem.c
==============================================================================
--- head/lib/libc/string/memmem.c	Tue May 26 21:12:02 2015	(r283583)
+++ head/lib/libc/string/memmem.c	Tue May 26 21:16:07 2015	(r283584)
@@ -42,9 +42,9 @@ memmem(const void *l, size_t l_len, cons
 	const char *cl = (const char *)l;
 	const char *cs = (const char *)s;
 
-	/* we need something to compare */
-	if (l_len == 0 || s_len == 0)
-		return NULL;
+	/* empty "s" matches the beginning of "l" */
+	if (s_len == 0)
+		return (void *)cl;
 
 	/* "s" must be smaller or equal to "l" */
 	if (l_len < s_len)


More information about the svn-src-all mailing list