]> granicus.if.org Git - apache/commitdiff
optimize this... Do strlen() ONLY if we need to check
authorJim Jagielski <jim@apache.org>
Sun, 8 Jan 2012 01:40:01 +0000 (01:40 +0000)
committerJim Jagielski <jim@apache.org>
Sun, 8 Jan 2012 01:40:01 +0000 (01:40 +0000)
for overflow.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1228766 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/proxy_util.c

index 2fa2d7e2f197f9fc411aff8cf25b733fd790c2df..5821aa93007f7a7fa2172979ddc5a34488bb0c2c 100644 (file)
@@ -81,15 +81,18 @@ APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, create_req,
 PROXY_DECLARE(apr_status_t) ap_proxy_strncpy(char *dst, const char *src,
                                              apr_size_t dlen)
 {
-    if ((strlen(src)+1) > dlen) {
-        /* XXX: APR_ENOSPACE would be better */
-        return APR_EGENERAL;
-    }
-    else {
-        /* XXX: Once slen and dlen are known, no excuse not to memcpy */
-        apr_cpystrn(dst, src, dlen);
+    char *thenil;
+    apr_size_t thelen;
+
+    thenil = apr_cpystrn(dst, src, dlen);
+    thelen = thenil - dst;
+    /* Assume the typical case is smaller copying into bigger
+       so we have a fast return */
+    if ((thelen < dlen-1) || ((strlen(src)) == thelen)) {
+        return APR_SUCCESS;
     }
-    return APR_SUCCESS;
+    /* XXX: APR_ENOSPACE would be better */
+    return APR_EGENERAL;
 }
 
 /* already called in the knowledge that the characters are hex digits */