Hi,
In message "[ruby-talk:02624] Few unrelated C-source questions"
on 00/05/08, Aleksi Niemel<aleksi.niemela / cinnober.com> writes:
|Should class.c's rb_scan_args initialize not provided optional arguments
|to NoValue (subclass of Nil and/or evaluates like nil). Now it's impossible
|to differentiate was optional argument passed as Nil or was it missing
|and it was initialized automagically to Nil.
Currently use argc (or return value from rb_scan_args) to check number
of arguments. I'd like to provide richer (but maybe slower) scan
function in the future.
|variable.c rb_autoload_load
|Untaints auto*magically*. Possible security problem?
No. `autoload' cannot be called from untrusted code (see
rb_autoload_id(); rb_secure(4)). So the file name can be trusted
anyway . I explicitly untaint the string here because the loaded
filename string object may be tainted automatically.
|-----
|eval.c rb_provided
|Q: why rb_f_require treats libfile.so and libfile.o equal but rb_provided
|checks only for libfile.so.
Treating libfile.o specially is for backward compatibility. After
requiring "socket.o" for example, feature name "socket.so" will be
registered. Oops, I found a bug. I want to register "*.so" uniformly
for all platforms but rb_f_require() uses native DLEXT extension to
provide().
|Could this be (not important) optimization?:
| if (strcmp(f, feature) == 0) return Qtrue;
| len = strlen(feature);
| if (strncmp(f, feature, len) == 0
| && (strcmp(f+len, ".rb") == 0 ||strcmp(f+len, ".so") == 0)) {
| return Qtrue;
| }
|
|Isn't first strncmp(f, feature, len) == 0 only if strcmp(f,feature) == 0.
|And in that case we have returned already.
No. If you remove first strncmp(), "foo" will match "bar.rb".
|eval.c dln.c dln_load
| char real_name[1024];
| strcpy(real_name, initfuncname);
| strcat(real_name, "__Fv");
|
|initfuncname is now always "Init_%200s", but maybe not in the future. So
|real_name could be to small for strcpy and strcat could cause overflow.
|real_name should probably be char real_name[MAXPATHLEN] which is used for
|initfuncname everywhere else.
Agreed. I'll change it.
matz.