Skip to content

Instantly share code, notes, and snippets.

@agladysh
Created November 21, 2011 18:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agladysh/1383473 to your computer and use it in GitHub Desktop.
Save agladysh/1383473 to your computer and use it in GitHub Desktop.
LJ2 lua_tolstring issue
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#define MAXARGS (256)
static int load_args(
lua_State * L,
int idx, /* index of first argument */
const char ** argv,
size_t * argvlen
)
{
int nargs = lua_gettop(L) - idx + 1;
int i = 0;
if (nargs > MAXARGS)
{
return luaL_error(L, "too many arguments");
}
for (i = 0; i < nargs; ++i)
{
size_t len = 0;
const char * str = lua_tolstring(L, idx + i, &len);
if (str == NULL)
{
return luaL_argerror(L, idx + i, "expected a string or number value");
}
argv[i] = str;
argvlen[i] = len;
}
return nargs;
}
static int test(lua_State * L)
{
void * pContext = NULL;
const char * argv[MAXARGS];
size_t argvlen[MAXARGS];
int nargs = load_args(L, 1, argv, argvlen);
int i = 0, j = 0;
for (i = 0; i < nargs; ++i)
{
printf("--> %d: strlen: %d len: %d string: `%s' hex:", i, strlen(argv[i]), argvlen[i], argv[i]);
/* '<=' intentional, want to print \0 */
for (j = 0; j <= strlen(argv[i]); ++j)
{
printf(" 0x%X", argv[i][j]);
}
printf("\n");
if (strlen(argv[i]) != argvlen[i])
{
return luaL_error(L, "oops! at #%d: expected %d, got %d `%s'", i, strlen(argv[i]), argvlen[i], argv[i]);
}
}
return 0;
}
static const luaL_Reg R[] =
{
{"test", test},
{NULL, NULL},
};
LUALIB_API int luaopen_load_args(lua_State * L)
{
/*
* Register module
*/
luaL_register(L, "load_args", R);
return 1;
}
#!/bin/sh -e
gcc -g3 -c load_args.c -I/usr/include/lua5.1
gcc -g -o load_args.so -shared load_args.o
$ uname -a
Linux ubuntu 2.6.35-30-generic #59-Ubuntu SMP Tue Aug 30 15:58:00 UTC 2011 i686 GNU/Linux
$ luajit2 -v
LuaJIT 2.0.0-beta8 -- Copyright (C) 2005-2011 Mike Pall. http://luajit.org/
$ lua test.lua
1: 1
--> 0: strlen: 1 len: 1 string: `1' hex: 0x31 0x0
2: 2 4
--> 0: strlen: 1 len: 1 string: `2' hex: 0x32 0x0
--> 1: strlen: 1 len: 1 string: `4' hex: 0x34 0x0
3: 3 6 9
--> 0: strlen: 1 len: 1 string: `3' hex: 0x33 0x0
--> 1: strlen: 1 len: 1 string: `6' hex: 0x36 0x0
--> 2: strlen: 1 len: 1 string: `9' hex: 0x39 0x0
4: 4 8 12 16
<...>
--> 254: strlen: 5 len: 5 string: `65280' hex: 0x36 0x35 0x32 0x38 0x30 0x0
--> 255: strlen: 5 len: 5 string: `65536' hex: 0x36 0x35 0x35 0x33 0x36 0x0
$ luajit2 test.lua
1: 1
--> 0: strlen: 1 len: 1 string: `1' hex: 0x31 0x0
2: 2 4
--> 0: strlen: 1 len: 1 string: `2' hex: 0x32 0x0
--> 1: strlen: 1 len: 1 string: `4' hex: 0x34 0x0
<...>
38: 38 76 114 152 190 228 266 304 342 380 418 456 494 532 570 608 646 684 722 760 798 836 874 912 950 988 1026 1064 1102 1140 1178 1216 1254 1292 1330 1368 1406 1444
--> 0: strlen: 2 len: 2 string: `38' hex: 0x33 0x38 0x0
--> 1: strlen: 1 len: 2 string: `' hex: 0x18 0x0
luajit2: test.lua:13: oops! at #1: expected 1, got 2 `'
stack traceback:
[C]: in function 'test'
test.lua:13: in main chunk
[C]: ?
# If c = c + 1 is commented out, fails here instead:
179: 179 358 537 716 895 1074 1253 1432 1611 1790 1969 2148 2327 2506 2685 2864 3043 3222 3401 3580 3759 3938 4117 4296 4475 4654 4833 5012 5191 5370 5549 5728 5907 6086 6265 6444 6623 6802 6981 7160 7339 7518 7697 7876 8055 8234 8413 8592 8771 8950 9129 9308 9487 9666 9845 10024 10203 10382 10561 10740 10919 11098 11277 11456 11635 11814 11993 12172 12351 12530 12709 12888 13067 13246 13425 13604 13783 13962 14141 14320 14499 14678 14857 15036 15215 15394 15573 15752 15931 16110 16289 16468 16647 16826 17005 17184 17363 17542 17721 17900 18079 18258 18437 18616 18795 18974 19153 19332 19511 19690 19869 20048 20227 20406 20585 20764 20943 21122 21301 21480 21659 21838 22017 22196 22375 22554 22733 22912 23091 23270 23449 23628 23807 23986 24165 24344 24523 24702 24881 25060 25239 25418 25597 25776 25955 26134 26313 26492 26671 26850 27029 27208 27387 27566 27745 27924 28103 28282 28461 28640 28819 28998 29177 29356 29535 29714 29893 30072 30251 30430 30609 30788 30967 31146 31325 31504 31683 31862 32041
--> 0: strlen: 3 len: 3 string: `179' hex: 0x31 0x37 0x39 0x0
--> 1: strlen: 3 len: 3 string: `358' hex: 0x33 0x35 0x38 0x0
--> 2: strlen: 3 len: 3 string: `537' hex: 0x35 0x33 0x37 0x0
--> 3: strlen: 3 len: 3 string: `716' hex: 0x37 0x31 0x36 0x0
--> 4: strlen: 3 len: 3 string: `895' hex: 0x38 0x39 0x35 0x0
--> 5: strlen: 4 len: 4 string: `1074' hex: 0x31 0x30 0x37 0x34 0x0
--> 6: strlen: 4 len: 4 string: `1253' hex: 0x31 0x32 0x35 0x33 0x0
--> 7: strlen: 4 len: 4 string: `1432' hex: 0x31 0x34 0x33 0x32 0x0
--> 8: strlen: 4 len: 4 string: `1611' hex: 0x31 0x36 0x31 0x31 0x0
--> 9: strlen: 4 len: 4 string: `1790' hex: 0x31 0x37 0x39 0x30 0x0
--> 10: strlen: 4 len: 4 string: `1969' hex: 0x31 0x39 0x36 0x39 0x0
--> 11: strlen: 4 len: 4 string: `2148' hex: 0x32 0x31 0x34 0x38 0x0
--> 12: strlen: 4 len: 4 string: `2327' hex: 0x32 0x33 0x32 0x37 0x0
--> 13: strlen: 4 len: 4 string: `2506' hex: 0x32 0x35 0x30 0x36 0x0
--> 14: strlen: 4 len: 4 string: `2685' hex: 0x32 0x36 0x38 0x35 0x0
--> 15: strlen: 4 len: 4 string: `2864' hex: 0x32 0x38 0x36 0x34 0x0
--> 16: strlen: 4 len: 4 string: `3043' hex: 0x33 0x30 0x34 0x33 0x0
--> 17: strlen: 4 len: 4 string: `3222' hex: 0x33 0x32 0x32 0x32 0x0
--> 18: strlen: 4 len: 4 string: `3401' hex: 0x33 0x34 0x30 0x31 0x0
--> 19: strlen: 4 len: 4 string: `3580' hex: 0x33 0x35 0x38 0x30 0x0
--> 20: strlen: 4 len: 4 string: `3759' hex: 0x33 0x37 0x35 0x39 0x0
--> 21: strlen: 4 len: 4 string: `3938' hex: 0x33 0x39 0x33 0x38 0x0
--> 22: strlen: 4 len: 4 string: `4117' hex: 0x34 0x31 0x31 0x37 0x0
--> 23: strlen: 4 len: 4 string: `4296' hex: 0x34 0x32 0x39 0x36 0x0
--> 24: strlen: 4 len: 4 string: `4475' hex: 0x34 0x34 0x37 0x35 0x0
--> 25: strlen: 4 len: 4 string: `4654' hex: 0x34 0x36 0x35 0x34 0x0
--> 26: strlen: 4 len: 4 string: `4833' hex: 0x34 0x38 0x33 0x33 0x0
--> 27: strlen: 4 len: 4 string: `5012' hex: 0x35 0x30 0x31 0x32 0x0
--> 28: strlen: 5 len: 4 string: `31504' hex: 0x33 0x31 0x35 0x30 0x34 0x0
luajit2: test.lua:13: oops! at #28: expected 5, got 4 `31504'
stack traceback:
[C]: in function 'test'
test.lua:13: in main chunk
[C]: ?
$ uname -a
Linux ubuntu 2.6.32-34-generic #77-Ubuntu SMP Tue Sep 13 19:39:17 UTC 2011 x86_64 GNU/Linux
$ luajit -v
LuaJIT 2.0.0-beta8 -- Copyright (C) 2005-2011 Mike Pall. http://luajit.org/
luajit$ git describe
v2.0.0-beta8-fixed-127-g726dc42
$ luajit test.lua
--> 62: strlen: 4 len: 4 string: `4158' hex: 0x34 0x31 0x35 0x38 0x0
--> 63: strlen: 4 len: 4 string: `4224' hex: 0x34 0x32 0x32 0x34 0x0
--> 64: strlen: 4 len: 4 string: `4290' hex: 0x34 0x32 0x39 0x30 0x0
--> 65: strlen: 4 len: 4 string: `4356' hex: 0x34 0x33 0x35 0x36 0x0
67: 67 134 201 268 335 402 469 536 603 670 737 804871 938 1005 1072 1139 1206 1273 1340 1407 1474 1541 1608 16751742 1809 1876 1943 2010 2077 2144 2211 2278 2345 2412 2479 25462613 2680 2747 2814 2881 2948 3015 3082 3149 3216 3283 3350 34173484 3551 3618 3685 3752 3819 3886 3953 4020 4087 4154 4221 42884355 4422 4489
--> 0: strlen: 1 len: 2 string: ` ' hex: 0x20 0x0
luajit: test.lua:13: oops! at #0: expected 1, got 2 ` '
stack traceback:
[C]: in function 'test'
test.lua:13: in main chunk
[C]: ?
require 'load_args'
test = load_args.test
local c = 1 -- try commenting this out
for t = 1, 256 do
local args = { }
for i = 1, t do
args[i] = i * t
c = c + 1 -- try commenting this out
end
print(t .. ":", unpack(args))
local n, nargs, len1, len2 = test(unpack(args))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment