Sha256: ea1a7e6f470af2590691120bdbbe55c1f46b11adaf5bce2a717e8e6fc8ee10e5

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

/* Copyright (c) 2020 Contrast Security, Inc.  See
 * https://www.contrastsecurity.com/enduser-terms-0317a for more details. */

#include "cs__protect_kernel.h"
#include "../cs__common/cs__common.h"
#include <ruby.h>

static VALUE contrast_protect_fork(const int argc, const VALUE *argv,
                                   const VALUE self) {
    VALUE ret;
    if (rb_block_given_p()) {
        /* We call our hook, but it's a little complicated.
         * We wrap the fork block with our own lambda in 
         * order to instrument it.  There are no public
         * methods in the Ruby C API to set the prevailing
         * block, so we have to use rb_funcall_with_block.
         * Also, rb_funcall_with_block does a public call,
         * and our method is private.
         * So we (as a hack) temporarily set it to public.
         */
        VALUE wrapper;
        wrapper =
            rb_funcall_with_block(rb_mKernel, rb_sym_protect_kernel_wrapper, 0,
                                   NULL, rb_block_proc());
        rb_funcall(rb_mKernel, rb_intern("public"), 1, ID2SYM(rb_sym_protect_kernel_fork));
        ret = rb_funcall_with_block(self, rb_sym_protect_kernel_fork, argc,
                                    argv, wrapper);
        rb_funcall(rb_mKernel, rb_intern("private"), 1, ID2SYM(rb_sym_protect_kernel_fork));
    } else {
        ret = rb_funcall2(self, rb_sym_protect_kernel_fork, argc, argv);
    }
    return ret;
}

void Init_cs__protect_kernel(void) {
    rb_sym_protect_kernel_wrapper = rb_intern("cs__protect_build_wrapper");

    rb_sym_protect_kernel_fork = contrast_register_patch("Kernel",
                                                         "fork",
                                                         &contrast_protect_fork);

    rb_sym_protect_kernel_fork = contrast_register_singleton_patch("Kernel",
                                                                   "fork",
                                                                   &contrast_protect_fork);

}

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
contrast-agent-3.11.0 ext/cs__protect_kernel/cs__protect_kernel.c