Index: /trunk/include/iprt/cpp/ministring.h
===================================================================
--- /trunk/include/iprt/cpp/ministring.h	(revision 30319)
+++ /trunk/include/iprt/cpp/ministring.h	(revision 30320)
@@ -328,14 +328,31 @@
 
     /**
-     * Returns true if the member string has no length.
-     * This is true for instances created from both NULL and "" input strings.
+     * Returns @c true if the member string has no length.
+     *
+     * This is @c true for instances created from both NULL and "" input
+     * strings.
      *
      * This states nothing about how much memory might be allocated.
      *
-     * @returns true if empty, false if not.
+     * @returns @c true if empty, @c false if not.
      */
     bool isEmpty() const
     {
         return length() == 0;
+    }
+
+    /**
+     * Returns @c false if the member string has no length.
+     *
+     * This is @c false for instances created from both NULL and "" input
+     * strings.
+     *
+     * This states nothing about how much memory might be allocated.
+     *
+     * @returns @c false if empty, @c true if not.
+     */
+    bool isNotEmpty() const
+    {
+        return length() != 0;
     }
 
Index: /trunk/include/iprt/string.h
===================================================================
--- /trunk/include/iprt/string.h	(revision 30319)
+++ /trunk/include/iprt/string.h	(revision 30320)
@@ -1195,4 +1195,52 @@
 RTDECL(int) RTStrNLenEx(const char *pszString, size_t cchMax, size_t *pcch);
 
+RT_C_DECLS_END
+
+/** The maximum size argument of a memchr call. */
+#define RTSTR_MEMCHR_MAX            (~(size_t)0x10000)
+
+/**
+ * Find the zero terminator in a string with a limited length.
+ *
+ * @returns Pointer to the zero terminator.
+ * @returns NULL if the zero terminator was not found.
+ *
+ * @param   pszString   The string.
+ * @param   cchMax      The max string length.  RTSTR_MAX is fine.
+ */
+#if defined(__cplusplus) && !defined(DOXYGEN_RUNNING)
+DECLINLINE(char const *) RTStrEnd(char const *pszString, size_t cchMax)
+{
+    /* Avoid potential issues with memchr seen in glibc. */
+    if (cchMax > RTSTR_MEMCHR_MAX)
+    {
+        char const *pszRet = (char const *)memchr(pszString, '\0', RTSTR_MEMCHR_MAX);
+        if (RT_LIKELY(pszRet))
+            return pszRet;
+        pszString += RTSTR_MEMCHR_MAX;
+        cchMax    -= RTSTR_MEMCHR_MAX;
+    }
+    return (char const *)memchr(pszString, '\0', cchMax);
+}
+
+DECLINLINE(char *) RTStrEnd(char *pszString, size_t cchMax)
+#else
+DECLINLINE(char *) RTStrEnd(const char *pszString, size_t cchMax)
+#endif
+{
+    /* Avoid potential issues with memchr seen in glibc. */
+    if (cchMax > RTSTR_MEMCHR_MAX)
+    {
+        char *pszRet = (char *)memchr(pszString, '\0', RTSTR_MEMCHR_MAX);
+        if (RT_LIKELY(pszRet))
+            return pszRet;
+        pszString += RTSTR_MEMCHR_MAX;
+        cchMax    -= RTSTR_MEMCHR_MAX;
+    }
+    return (char *)memchr(pszString, '\0', cchMax);
+}
+
+RT_C_DECLS_BEGIN
+
 /**
  * Matches a simple string pattern.
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp	(revision 30319)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp	(revision 30320)
@@ -329,5 +329,5 @@
     {
         /* Validate / skip 'Name'. */
-        char *pszFlags = (char *)memchr(pvBuf, '\0', cbBuf) + 1;
+        char *pszFlags = RTStrEnd((char *)pvBuf, cbBuf) + 1;
         AssertPtrReturn(pszFlags, VERR_TOO_MUCH_DATA);
         if (ppszValue)
@@ -337,6 +337,6 @@
         {
             /* Validate 'Flags'. */
-            void *pvEos = memchr(pszFlags, '\0', cbBuf - (pszFlags - (char *)pvBuf));
-            AssertPtrReturn(pvEos, VERR_TOO_MUCH_DATA);
+            char *pszEos = RTStrEnd(pszFlags, cbBuf - (pszFlags - (char *)pvBuf));
+            AssertPtrReturn(pszEos, VERR_TOO_MUCH_DATA);
             *ppszFlags = pszFlags;
         }
@@ -685,11 +685,11 @@
 
     char *pszName      = pchNext;
-    char *pszValue     = pchNext = (char *)memchr(pchNext, '\0', pchEnd - pchNext) + 1;
+    char *pszValue     = pchNext = RTStrEnd(pchNext, pchEnd - pchNext) + 1;
     AssertPtrReturn(pchNext, VERR_PARSE_ERROR);  /* 0x1 is also an invalid pointer :) */
 
-    char *pszTimestamp = pchNext = (char *)memchr(pchNext, '\0', pchEnd - pchNext) + 1;
+    char *pszTimestamp = pchNext = RTStrEnd(pchNext, pchEnd - pchNext) + 1;
     AssertPtrReturn(pchNext, VERR_PARSE_ERROR);
 
-    char *pszFlags     = pchNext = (char *)memchr(pchNext, '\0', pchEnd - pchNext) + 1;
+    char *pszFlags     = pchNext = RTStrEnd(pchNext, pchEnd - pchNext) + 1;
     AssertPtrReturn(pchNext, VERR_PARSE_ERROR);
 
@@ -701,5 +701,5 @@
     if (*pszName != '\0')
     {
-        pchNext = (char *)memchr(pchNext, '\0', pchEnd - pchNext) + 1;
+        pchNext = RTStrEnd(pchNext, pchEnd - pchNext) + 1;
         AssertPtrReturn(pchNext, VERR_PARSE_ERROR);
 
@@ -880,5 +880,5 @@
     {
         /* Validate / skip 'Name'. */
-        char *pszValue = (char *)memchr(pvBuf, '\0', cbBuf) + 1;
+        char *pszValue = RTStrEnd((char *)pvBuf, cbBuf) + 1;
         AssertPtrReturn(pszValue, VERR_TOO_MUCH_DATA);
         if (ppszName)
@@ -886,6 +886,5 @@
 
         /* Validate / skip 'Value'. */
-        char *pszFlags = (char *)memchr(pszValue, '\0',
-                                        cbBuf - (pszValue - (char *)pvBuf)) + 1;
+        char *pszFlags = RTStrEnd(pszValue, cbBuf - (pszValue - (char *)pvBuf)) + 1;
         AssertPtrReturn(pszFlags, VERR_TOO_MUCH_DATA);
         if (ppszValue)
@@ -895,6 +894,6 @@
         {
             /* Validate 'Flags'. */
-            void *pvEos = memchr(pszFlags, '\0', cbBuf - (pszFlags - (char *)pvBuf));
-            AssertPtrReturn(pvEos, VERR_TOO_MUCH_DATA);
+            char *pszEos = RTStrEnd(pszFlags, cbBuf - (pszFlags - (char *)pvBuf));
+            AssertPtrReturn(pszEos, VERR_TOO_MUCH_DATA);
             *ppszFlags = pszFlags;
         }
Index: /trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp	(revision 30319)
+++ /trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp	(revision 30320)
@@ -5289,5 +5289,5 @@
 
     AssertPtrReturn(pszNetwork, VERR_INVALID_PARAMETER);
-    const char *pszNetworkEnd = (const char *)memchr(pszNetwork, '\0', INTNET_MAX_NETWORK_NAME);
+    const char *pszNetworkEnd = RTStrEnd(pszNetwork, INTNET_MAX_NETWORK_NAME);
     AssertReturn(pszNetworkEnd, VERR_INVALID_PARAMETER);
     size_t cchNetwork = pszNetworkEnd - pszNetwork;
@@ -5297,5 +5297,5 @@
     {
         AssertPtrReturn(pszTrunk, VERR_INVALID_PARAMETER);
-        const char *pszTrunkEnd = (const char *)memchr(pszTrunk, '\0', INTNET_MAX_TRUNK_NAME);
+        const char *pszTrunkEnd = RTStrEnd(pszTrunk, INTNET_MAX_TRUNK_NAME);
         AssertReturn(pszTrunkEnd, VERR_INVALID_PARAMETER);
     }
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrv.c
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrv.c	(revision 30319)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrv.c	(revision 30320)
@@ -1218,7 +1218,7 @@
             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.cbImageBits < pReq->u.In.cbImageWithTabs);
             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, pReq->u.In.szName[0]);
-            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, memchr(pReq->u.In.szName, '\0', sizeof(pReq->u.In.szName)));
+            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, RTStrEnd(pReq->u.In.szName, sizeof(pReq->u.In.szName)));
             REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, !supdrvCheckInvalidChar(pReq->u.In.szName, ";:()[]{}/\\|&*%#@!~`\"'"));
-            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, memchr(pReq->u.In.szFilename, '\0', sizeof(pReq->u.In.szFilename)));
+            REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, RTStrEnd(pReq->u.In.szFilename, sizeof(pReq->u.In.szFilename)));
 
             /* execute */
@@ -1256,5 +1256,5 @@
                     REQ_CHECK_EXPR_FMT(paSyms[i].offName < pReq->u.In.cbStrTab,
                                        ("SUP_IOCTL_LDR_LOAD: sym #%ld: name off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImageWithTabs));
-                    REQ_CHECK_EXPR_FMT(memchr(&pReq->u.In.abImage[pReq->u.In.offStrTab + paSyms[i].offName], '\0', pReq->u.In.cbStrTab - paSyms[i].offName),
+                    REQ_CHECK_EXPR_FMT(RTStrEnd(&pReq->u.In.abImage[pReq->u.In.offStrTab + paSyms[i].offName], pReq->u.In.cbStrTab - paSyms[i].offName),
                                        ("SUP_IOCTL_LDR_LOAD: sym #%ld: unterminated name! (%#lx / %#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImageWithTabs));
                 }
@@ -1282,5 +1282,5 @@
             PSUPLDRGETSYMBOL pReq = (PSUPLDRGETSYMBOL)pReqHdr;
             REQ_CHECK_SIZES(SUP_IOCTL_LDR_GET_SYMBOL);
-            REQ_CHECK_EXPR(SUP_IOCTL_LDR_GET_SYMBOL, memchr(pReq->u.In.szSymbol, '\0', sizeof(pReq->u.In.szSymbol)));
+            REQ_CHECK_EXPR(SUP_IOCTL_LDR_GET_SYMBOL, RTStrEnd(pReq->u.In.szSymbol, sizeof(pReq->u.In.szSymbol)));
 
             /* execute */
@@ -1493,5 +1493,5 @@
                 REQ_CHECK_SIZES_EX(SUP_IOCTL_CALL_SERVICE, SUP_IOCTL_CALL_SERVICE_SIZE_IN(pSrvReq->cbReq), SUP_IOCTL_CALL_SERVICE_SIZE_OUT(pSrvReq->cbReq));
             }
-            REQ_CHECK_EXPR(SUP_IOCTL_CALL_SERVICE, memchr(pReq->u.In.szName, '\0', sizeof(pReq->u.In.szName)));
+            REQ_CHECK_EXPR(SUP_IOCTL_CALL_SERVICE, RTStrEnd(pReq->u.In.szName, sizeof(pReq->u.In.szName)));
 
             /* execute */
@@ -3287,5 +3287,5 @@
     AssertPtrReturn(pFactory, VERR_INVALID_POINTER);
     AssertPtrReturn(pFactory->pfnQueryFactoryInterface, VERR_INVALID_POINTER);
-    psz = (const char *)memchr(pFactory->szName, '\0', sizeof(pFactory->szName));
+    psz = RTStrEnd(pFactory->szName, sizeof(pFactory->szName));
     AssertReturn(psz, VERR_INVALID_PARAMETER);
 
@@ -3426,10 +3426,10 @@
 
     AssertPtrReturn(pszName, VERR_INVALID_POINTER);
-    pszEnd = memchr(pszName, '\0', RT_SIZEOFMEMB(SUPDRVFACTORY, szName));
+    pszEnd = RTStrEnd(pszName, RT_SIZEOFMEMB(SUPDRVFACTORY, szName));
     AssertReturn(pszEnd, VERR_INVALID_PARAMETER);
     cchName = pszEnd - pszName;
 
     AssertPtrReturn(pszInterfaceUuid, VERR_INVALID_POINTER);
-    pszEnd = memchr(pszInterfaceUuid, '\0', RTUUID_STR_LENGTH);
+    pszEnd = RTStrEnd(pszInterfaceUuid, RTUUID_STR_LENGTH);
     AssertReturn(pszEnd, VERR_INVALID_PARAMETER);
 
@@ -4139,5 +4139,5 @@
      */
     AssertPtrReturn(pszSymbol, VERR_INVALID_POINTER);
-    pszEnd = (char *)memchr(pszSymbol, '\0', 512);
+    pszEnd = RTStrEnd(pszSymbol, 512);
     AssertReturn(pszEnd, VERR_INVALID_PARAMETER);
     cbSymbol = pszEnd - pszSymbol + 1;
@@ -4146,5 +4146,5 @@
     {
         AssertPtrReturn(pszModule, VERR_INVALID_POINTER);
-        pszEnd = (char *)memchr(pszModule, '\0', 64);
+        pszEnd = RTStrEnd(pszModule, 64);
         AssertReturn(pszEnd, VERR_INVALID_PARAMETER);
     }
Index: /trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp	(revision 30319)
+++ /trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp	(revision 30320)
@@ -365,5 +365,5 @@
         case IOCBASECMD(VBOXNETADP_CTL_REMOVE):
         {
-            if (!memchr(pReq->szName, '\0', RT_MIN(cbReq, sizeof(pReq->szName))))
+            if (!RTStrEnd(pReq->szName, RT_MIN(cbReq, sizeof(pReq->szName))))
                 return EINVAL;
 
Index: /trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c	(revision 30319)
+++ /trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c	(revision 30320)
@@ -170,5 +170,5 @@
 
         case VBOXNETADP_CTL_REMOVE:
-            if (!memchr(pReq->szName, '\0', RT_MIN(sizeof(pReq->szName), IOCPARM_LEN(iCmd))))
+            if (!RTStrEnd(pReq->szName, RT_MIN(sizeof(pReq->szName), IOCPARM_LEN(iCmd))))
                 return EINVAL;
 
Index: /trunk/src/VBox/Runtime/common/path/RTPathAppend.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/path/RTPathAppend.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/common/path/RTPathAppend.cpp	(revision 30320)
@@ -107,5 +107,5 @@
 RTDECL(int) RTPathAppend(char *pszPath, size_t cbPathDst, const char *pszAppend)
 {
-    char *pszPathEnd = (char *)memchr(pszPath, '\0', cbPathDst);
+    char *pszPathEnd = RTStrEnd(pszPath, cbPathDst);
     AssertReturn(pszPathEnd, VERR_INVALID_PARAMETER);
 
Index: /trunk/src/VBox/Runtime/common/string/RTStrCopyEx.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/RTStrCopyEx.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/common/string/RTStrCopyEx.cpp	(revision 30320)
@@ -35,5 +35,5 @@
 RTDECL(int) RTStrCopyEx(char *pszDst, size_t cbDst, const char *pszSrc, size_t cchMaxSrc)
 {
-    const char *pszSrcEol = (const char *)memchr(pszSrc, '\0', cchMaxSrc);
+    const char *pszSrcEol = RTStrEnd(pszSrc, cchMaxSrc);
     size_t      cchSrc    = pszSrcEol ? (size_t)(pszSrcEol - pszSrc) : cchMaxSrc;
     if (RT_LIKELY(cchSrc < cbDst))
Index: /trunk/src/VBox/Runtime/common/string/RTStrNLen.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/RTStrNLen.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/common/string/RTStrNLen.cpp	(revision 30320)
@@ -35,5 +35,5 @@
 RTDECL(size_t) RTStrNLen(const char *pszString, size_t cchMax)
 {
-    const char *pchEnd = (const char *)memchr(pszString, '\0', cchMax);
+    const char *pchEnd = RTStrEnd(pszString, cchMax);
     return pchEnd ? pchEnd - pszString : cchMax;
 }
Index: /trunk/src/VBox/Runtime/common/string/RTStrNLenEx.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/RTStrNLenEx.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/common/string/RTStrNLenEx.cpp	(revision 30320)
@@ -34,5 +34,5 @@
 RTDECL(int) RTStrNLenEx(const char *pszString, size_t cchMax, size_t *pcch)
 {
-    const char *pchEnd = (const char *)memchr(pszString, '\0', cchMax);
+    const char *pchEnd = RTStrEnd(pszString, cchMax);
     if (!pchEnd)
     {
Index: /trunk/src/VBox/Runtime/common/string/strcache.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/strcache.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/common/string/strcache.cpp	(revision 30320)
@@ -153,5 +153,5 @@
     AssertPtr(pchString);
     AssertReturn(cchString < _1G, NULL);
-    Assert(!memchr(pchString, '\0', cchString));
+    Assert(!RTStrEnd(pchString, cchString));
 
     return (const char *)RTMemPoolDupEx((RTMEMPOOL)hStrCache, pchString, cchString, 1);
Index: /trunk/src/VBox/Runtime/common/string/stringalloc.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/stringalloc.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/common/string/stringalloc.cpp	(revision 30320)
@@ -132,7 +132,7 @@
 {
     AssertPtr(pszString);
-    char  *pszEnd = (char *)memchr(pszString, '\0', cchMax);
-    size_t cch    = pszEnd ? (uintptr_t)pszEnd - (uintptr_t)pszString : cchMax;
-    char  *pszDst = (char *)RTMemAlloc(cch + 1);
+    char const *pszEnd = RTStrEnd(pszString, cchMax);
+    size_t      cch    = pszEnd ? (uintptr_t)pszEnd - (uintptr_t)pszString : cchMax;
+    char       *pszDst = (char *)RTMemAlloc(cch + 1);
     if (pszDst)
     {
@@ -262,5 +262,6 @@
     {
         AssertPtrReturn(pszOld, VERR_OUT_OF_RANGE);
-        char *pszZero = (char *)memchr(pszOld, '\0', cchNew + 63);
+        AssertPtrReturn(cchNew < ~(size_t)64, VERR_OUT_OF_RANGE);
+        char *pszZero = RTStrEnd(pszOld, cchNew + 63);
         AssertReturn(!pszZero || (size_t)(pszZero - pszOld) >= cchNew, VERR_OUT_OF_RANGE);
         pszOld[cchNew] = '\0';
Index: /trunk/src/VBox/Runtime/generic/strcache-stubs-generic.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/strcache-stubs-generic.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/generic/strcache-stubs-generic.cpp	(revision 30320)
@@ -64,5 +64,5 @@
     AssertPtr(pchString);
     AssertReturn(cchString < _1G, NULL);
-    Assert(!memchr(pchString, '\0', cchString));
+    Assert(!RTStrEnd(pchString, cchString));
 
     return (const char *)RTMemPoolDupEx((RTMEMPOOL)hStrCache, pchString, cchString, 1);
Index: /trunk/src/VBox/Runtime/testcase/tstNoCrt-1.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstNoCrt-1.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/testcase/tstNoCrt-1.cpp	(revision 30320)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2008 Oracle Corporation
+ * Copyright (C) 2008-2010 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -427,6 +427,9 @@
     pv = RT_NOCRT(memchr)(&s_szTest1[0x00], 'f', sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0xf]);
     pv = RT_NOCRT(memchr)(&s_szTest1[0x0f], 'f', sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0xf]);
-    pv = RT_NOCRT(memchr)(&s_szTest1[0x03], 0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
-    pv = RT_NOCRT(memchr)(&s_szTest1[0x10], 0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
+    pv = RT_NOCRT(memchr)(&s_szTest1[0x03],   0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
+    pv = RT_NOCRT(memchr)(&s_szTest1[0x10],   0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
+    pv = RT_NOCRT(memchr)(&s_szTest1,         0, ~(size_t)0);        CHECK_PV(&s_szTest1[0x10]);
+    pv = RT_NOCRT(memchr)(&s_szTest1,         0, ~(size_t)1);        CHECK_PV(&s_szTest1[0x10]);
+    pv = RT_NOCRT(memchr)(&s_szTest1,         0, ~(size_t)16);       CHECK_PV(&s_szTest1[0x10]);
     for (unsigned i = 0; i < sizeof(s_szTest1); i++)
         for (unsigned j = 0; j <= i; j++)
Index: /trunk/src/VBox/Runtime/testcase/tstRTSystemQueryDmi.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstRTSystemQueryDmi.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/testcase/tstRTSystemQueryDmi.cpp	(revision 30320)
@@ -74,5 +74,5 @@
             RTTestIFailed("level=%d; unterminated buffer on VERR_NOT_SUPPORTED\n", i);
         else if (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW)
-            RTTESTI_CHECK(memchr(szInfo, '\0', sizeof(szInfo)) != NULL);
+            RTTESTI_CHECK(RTStrEnd(szInfo, sizeof(szInfo)) != NULL);
         else if (rc != VERR_NOT_SUPPORTED && rc != VERR_ACCESS_DENIED)
             RTTestIFailed("level=%d unexpected rc=%Rrc\n", i, rc);
@@ -109,5 +109,5 @@
 
             /* check for zero terminator. */
-            if (!memchr(szInfo, '\0', cch))
+            if (!RTStrEnd(szInfo, cch))
                 RTTestIFailed("level=%d, rc=%Rrc, cch=%zu: Buffer not terminated!\n", i, rc, cch);
         }
Index: /trunk/src/VBox/Runtime/testcase/tstRTSystemQueryOsInfo.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstRTSystemQueryOsInfo.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/testcase/tstRTSystemQueryOsInfo.cpp	(revision 30320)
@@ -77,5 +77,5 @@
             RTTestIFailed("level=%d; unterminated buffer on VERR_NOT_SUPPORTED\n", i);
         else if (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW)
-            RTTESTI_CHECK(memchr(szInfo, '\0', sizeof(szInfo)) != NULL);
+            RTTESTI_CHECK(RTStrEnd(szInfo, sizeof(szInfo)) != NULL);
         else if (rc != VERR_NOT_SUPPORTED)
             RTTestIFailed("level=%d unexpected rc=%Rrc\n", i, rc);
@@ -112,5 +112,5 @@
 
             /* check for zero terminator. */
-            if (!memchr(szInfo, '\0', cch))
+            if (!RTStrEnd(szInfo, cch))
                 RTTestIFailed("level=%d, rc=%Rrc, cch=%zu: Buffer not terminated!\n", i, rc, cch);
         }
Index: /trunk/src/VBox/Runtime/testcase/tstUtf8.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstUtf8.cpp	(revision 30319)
+++ /trunk/src/VBox/Runtime/testcase/tstUtf8.cpp	(revision 30320)
@@ -844,4 +844,20 @@
 
     RTTestSubDone(hTest);
+}
+
+
+/**
+ * Tests RTStrEnd
+ */
+static void testStrEnd(RTTEST hTest)
+{
+    RTTestSub(hTest, "RTStrEnd");
+
+    static char const s_szEmpty[1] = "";
+    RTTESTI_CHECK(RTStrEnd(s_szEmpty, 0) == NULL);
+    RTTESTI_CHECK(RTStrEnd(s_szEmpty, 1) == &s_szEmpty[0]);
+    for (size_t i = 0; i < _1M; i++)
+        RTTESTI_CHECK(RTStrEnd(s_szEmpty, ~i) == &s_szEmpty[0]);
+
 }
 
@@ -1222,4 +1238,5 @@
     test3(hTest);
     TstRTStrXCmp(hTest);
+    testStrEnd(hTest);
     testStrStr(hTest);
     testMinistring(hTest);
Index: /trunk/src/VBox/VMM/DBGFMem.cpp
===================================================================
--- /trunk/src/VBox/VMM/DBGFMem.cpp	(revision 30319)
+++ /trunk/src/VBox/VMM/DBGFMem.cpp	(revision 30320)
@@ -244,5 +244,5 @@
      * This may look a bit reckless with the rc but, it should be fine.
      */
-    if (!memchr(pszBuf, '\0', cchBuf))
+    if (!RTStrEnd(pszBuf, cchBuf))
     {
         pszBuf[cchBuf - 1] = '\0';
Index: /trunk/src/VBox/VMM/DBGFOS.cpp
===================================================================
--- /trunk/src/VBox/VMM/DBGFOS.cpp	(revision 30319)
+++ /trunk/src/VBox/VMM/DBGFOS.cpp	(revision 30320)
@@ -143,5 +143,5 @@
     AssertReturn(pReg->cbData < _2G, VERR_INVALID_PARAMETER);
     AssertReturn(pReg->szName[0], VERR_INVALID_NAME);
-    AssertReturn(memchr(&pReg->szName[0], '\0', sizeof(pReg->szName)), VERR_INVALID_NAME);
+    AssertReturn(RTStrEnd(&pReg->szName[0], sizeof(pReg->szName)), VERR_INVALID_NAME);
     AssertPtrReturn(pReg->pfnConstruct, VERR_INVALID_POINTER);
     AssertPtrNullReturn(pReg->pfnDestruct, VERR_INVALID_POINTER);
@@ -229,5 +229,5 @@
     AssertReturn(pReg->u32Magic == DBGFOSREG_MAGIC, VERR_INVALID_MAGIC);
     AssertReturn(pReg->u32EndMagic == DBGFOSREG_MAGIC, VERR_INVALID_MAGIC);
-    AssertReturn(memchr(&pReg->szName[0], '\0', sizeof(pReg->szName)), VERR_INVALID_NAME);
+    AssertReturn(RTStrEnd(&pReg->szName[0], sizeof(pReg->szName)), VERR_INVALID_NAME);
 
     DBGF_OS_READ_LOCK(pVM);
Index: /trunk/src/VBox/VMM/PDMDriver.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMDriver.cpp	(revision 30319)
+++ /trunk/src/VBox/VMM/PDMDriver.cpp	(revision 30320)
@@ -263,15 +263,15 @@
                     VERR_PDM_UNKNOWN_DRVREG_VERSION);
     AssertReturn(pReg->szName[0], VERR_PDM_INVALID_DRIVER_REGISTRATION);
-    AssertMsgReturn(memchr(pReg->szName, '\0', sizeof(pReg->szName)),
+    AssertMsgReturn(RTStrEnd(pReg->szName, sizeof(pReg->szName)),
                     (".*s\n", sizeof(pReg->szName), pReg->szName),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
     AssertMsgReturn(    !(pReg->fFlags & PDM_DRVREG_FLAGS_R0)
                     ||  (   pReg->szR0Mod[0]
-                         && memchr(pReg->szR0Mod, '\0', sizeof(pReg->szR0Mod))),
+                         && RTStrEnd(pReg->szR0Mod, sizeof(pReg->szR0Mod))),
                     ("%s: %.*s\n", pReg->szName, sizeof(pReg->szR0Mod), pReg->szR0Mod),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
     AssertMsgReturn(    !(pReg->fFlags & PDM_DRVREG_FLAGS_RC)
                     ||  (   pReg->szRCMod[0]
-                         && memchr(pReg->szRCMod, '\0', sizeof(pReg->szRCMod))),
+                         && RTStrEnd(pReg->szRCMod, sizeof(pReg->szRCMod))),
                     ("%s: %.*s\n", pReg->szName, sizeof(pReg->szRCMod), pReg->szRCMod),
                     VERR_PDM_INVALID_DRIVER_REGISTRATION);
Index: /trunk/src/VBox/VMM/VMMAll/VMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/VMAll.cpp	(revision 30319)
+++ /trunk/src/VBox/VMM/VMMAll/VMAll.cpp	(revision 30320)
@@ -242,7 +242,7 @@
     AssertPtr(pszErrorId);
     Assert(*pszErrorId);
-    Assert(memchr(pszErrorId, '\0', 128) != NULL);
+    Assert(RTStrEnd(pszErrorId, 128) != NULL);
     AssertPtr(pszFormat);
-    Assert(memchr(pszFormat, '\0', 512) != NULL);
+    Assert(RTStrEnd(pszFormat, 512) != NULL);
 
 #ifdef IN_RING3
Index: /trunk/src/bldprogs/scm.cpp
===================================================================
--- /trunk/src/bldprogs/scm.cpp	(revision 30319)
+++ /trunk/src/bldprogs/scm.cpp	(revision 30320)
@@ -724,5 +724,5 @@
 bool ScmStreamIsText(PSCMSTREAM pStream)
 {
-    if (memchr(pStream->pch, '\0', pStream->cb))
+    if (RTStrEnd(pStream->pch, pStream->cb))
         return false;
     if (!pStream->cb)
