PerlIO_find_layer should not be using memEQ() off the end of the layer name.
authorNicholas Clark <nick@ccl4.org>
Mon, 25 Mar 2013 09:20:05 +0000 (10:20 +0100)
committerNicholas Clark <nick@ccl4.org>
Mon, 25 Mar 2013 16:34:31 +0000 (17:34 +0100)
PerlIO_find_layer was using memEQ() to compare the name of the desired layer
with each layer in the array of known layers. However, it was always using
the length of the desired layer for the comparison, whatever the length of
the name it was comparing it with, resulting in out-of-bounds reads.

perlio.c

index d356a7b..2e5a77d 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -811,7 +811,8 @@ PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
        len = strlen(name);
     for (i = 0; i < PL_known_layers->cur; i++) {
        PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
-       if (memEQ(f->name, name, len) && f->name[len] == 0) {
+        const STRLEN this_len = strlen(f->name);
+        if (this_len == len && memEQ(f->name, name, len)) {
            PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
            return f;
        }