diff options
author | 2023-09-20 22:50:10 -0300 | |
---|---|---|
committer | 2023-09-20 18:50:10 -0700 | |
commit | b65862e23b255d2ebf6df8cd32481e5162c7f978 (patch) | |
tree | 1d8bbbef70f3a46b3e290d0e9832ee2f97455b71 /test | |
parent | 5f66b4e729105286863a13955b1ed8897b45210e (diff) | |
download | bun-b65862e23b255d2ebf6df8cd32481e5162c7f978.tar.gz bun-b65862e23b255d2ebf6df8cd32481e5162c7f978.tar.zst bun-b65862e23b255d2ebf6df8cd32481e5162c7f978.zip |
fix(ffi) fix size limit for dlopen (#5516)
* fix size limit
* 63
* throw error
* ffi.test.js
* add macos tests
* oops
Diffstat (limited to 'test')
-rw-r--r-- | test/js/bun/ffi/ffi.test.js | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/test/js/bun/ffi/ffi.test.js b/test/js/bun/ffi/ffi.test.js index 80367e555..b0fe58d77 100644 --- a/test/js/bun/ffi/ffi.test.js +++ b/test/js/bun/ffi/ffi.test.js @@ -1,5 +1,7 @@ import { afterAll, describe, expect, it } from "bun:test"; import { existsSync } from "fs"; +import { platform } from "os"; + import { CFunction, CString, @@ -641,3 +643,287 @@ it(".ptr is not leaked", () => { expect(fn.ptr).toBeUndefined(); } }); + +const lib_path = + platform() === "darwin" + ? "/usr/lib/libSystem.B.dylib" + : existsSync("/lib/x86_64-linux-gnu/libc.so.6") + ? "/lib/x86_64-linux-gnu/libc.so.6" + : null; +const test = lib_path ? it : it.skip; +test("can open more than 63 symbols", () => { + const lib = dlopen(lib_path, { + memchr: { + returns: "ptr", + args: ["ptr", "int", "usize"], + }, + strcpy: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + strcat: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + strncat: { + returns: "ptr", + args: ["ptr", "ptr", "usize"], + }, + strcmp: { + returns: "int", + args: ["ptr", "ptr"], + }, + strncmp: { + returns: "int", + args: ["ptr", "ptr", "usize"], + }, + strcoll: { + returns: "int", + args: ["ptr", "ptr"], + }, + strxfrm: { + returns: "int", + args: ["ptr", "ptr", "usize"], + }, + strchr: { + returns: "ptr", + args: ["ptr", "int"], + }, + strrchr: { + returns: "ptr", + args: ["ptr", "int"], + }, + strcspn: { + returns: "usize", + args: ["ptr", "ptr"], + }, + strspn: { + returns: "usize", + args: ["ptr", "ptr"], + }, + strpbrk: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + strstr: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + strtok: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + strerror: { + returns: "ptr", + args: ["int"], + }, + strerror_r: { + returns: "ptr", + args: ["int", "ptr", "usize"], + }, + strsep: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + strsignal: { + returns: "ptr", + args: ["int"], + }, + stpcpy: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + stpncpy: { + returns: "ptr", + args: ["ptr", "ptr", "usize"], + }, + basename: { + returns: "ptr", + args: ["ptr"], + }, + bcmp: { + returns: "int", + args: ["ptr", "ptr", "usize"], + }, + getdate: { + returns: "ptr", + args: ["ptr"], + }, + gmtime: { + returns: "ptr", + args: ["ptr"], + }, + localtime: { + returns: "ptr", + args: ["ptr"], + }, + ctime: { + returns: "ptr", + args: ["ptr"], + }, + asctime: { + returns: "ptr", + args: ["ptr"], + }, + strftime: { + returns: "usize", + args: ["ptr", "usize", "ptr", "ptr"], + }, + strptime: { + returns: "ptr", + args: ["ptr", "ptr", "ptr"], + }, + asctime_r: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + ctime_r: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + gmtime_r: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + localtime_r: { + returns: "ptr", + args: ["ptr", "ptr"], + }, + bcopy: { + returns: "int", + args: ["ptr", "ptr", "usize"], + }, + bzero: { + returns: "void", + args: ["ptr", "usize"], + }, + index: { + returns: "ptr", + args: ["ptr", "int"], + }, + rindex: { + returns: "ptr", + args: ["ptr", "int"], + }, + ffs: { + returns: "int", + args: ["int"], + }, + strcasecmp: { + returns: "int", + args: ["ptr", "ptr"], + }, + strncasecmp: { + returns: "int", + args: ["ptr", "ptr", "usize"], + }, + pthread_attr_init: { + returns: "int", + args: ["ptr"], + }, + pthread_attr_destroy: { + returns: "int", + args: ["ptr"], + }, + pthread_attr_getdetachstate: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setdetachstate: { + returns: "int", + args: ["ptr", "int"], + }, + pthread_attr_getguardsize: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setguardsize: { + returns: "int", + args: ["ptr", "usize"], + }, + pthread_attr_getschedparam: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setschedparam: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_getschedpolicy: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setschedpolicy: { + returns: "int", + args: ["ptr", "int"], + }, + pthread_attr_getinheritsched: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setinheritsched: { + returns: "int", + args: ["ptr", "int"], + }, + pthread_attr_getscope: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setscope: { + returns: "int", + args: ["ptr", "int"], + }, + pthread_attr_getstackaddr: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setstackaddr: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_getstacksize: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setstacksize: { + returns: "int", + args: ["ptr", "usize"], + }, + pthread_attr_getstack: { + returns: "int", + args: ["ptr", "ptr", "ptr"], + }, + pthread_attr_setstack: { + returns: "int", + args: ["ptr", "ptr", "usize"], + }, + pthread_attr_getguardsize: { + returns: "int", + args: ["ptr", "ptr"], + }, + pthread_attr_setguardsize: { + returns: "int", + args: ["ptr", "usize"], + }, + login_tty: { + returns: "int", + args: ["int"], + }, + login: { + returns: "int", + args: ["ptr"], + }, + logout: { + returns: "int", + args: ["ptr"], + }, + strlen: { + returns: "usize", + args: ["ptr"], + }, + }); + + expect(Object.keys(lib.symbols).length).toBe(65); + expect(lib.symbols.strcasecmp(Buffer.from("ciro"), Buffer.from("CIRO"))).toBe(0); + expect(lib.symbols.strlen(Buffer.from("bunbun", "ascii"))).toBe(6n); +}); |