Given that S_feature_is_enabled() is a static function, we can know all
Nicholas Clark [Tue, 16 Oct 2007 09:48:48 +0000 (09:48 +0000)]
the possible strings that can be passed to it, and their lengths. So we
can avoid my_strlcpy() and instead use memcpy().
Brought to you by the Campaign for the Elimination of strlen().

p4raw-id: //depot/perl@32114

toke.c

diff --git a/toke.c b/toke.c
index 48340f9..eb785cc 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -559,6 +559,9 @@ S_missingterm(pTHX_ char *s)
 #define FEATURE_IS_ENABLED(name)                                       \
        ((0 != (PL_hints & HINT_LOCALIZE_HH))                           \
            && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
+/* The longest string we pass in.  */
+#define MAX_FEATURE_LEN (sizeof("switch")-1)
+
 /*
  * S_feature_is_enabled
  * Check whether the named feature is enabled.
@@ -568,8 +571,9 @@ S_feature_is_enabled(pTHX_ const char *name, STRLEN namelen)
 {
     dVAR;
     HV * const hinthv = GvHV(PL_hintgv);
-    char he_name[32] = "feature_";
-    (void) my_strlcpy(&he_name[8], name, 24);
+    char he_name[8 + MAX_FEATURE_LEN] = "feature_";
+    assert(namelen <= MAX_FEATURE_LEN);
+    memcpy(&he_name[8], name, namelen);
 
     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
 }