Previously it was static and defined for Darwin, FreeBSD and Linux.
Now it is global VG_(args_the_exename) and has a length check.
Also fixed a nasty bug related to VG_(args_the_exename).
Initially this is set to point to the name of the client command
in Valgrinds own arguments. Later when checking for scripts or binaries
VG_(load_script) may get called recursively. If it gets called more than
once it sets VG_(args_the_exename) to point to the new name.
But that is on the stack. Later, if the stack grows too much the
name will get overwritten. I was seeing that with my first versions
of this code in the recursive tests in none/tests/scripts.
Now I'm allocating VG_(args_the_exename) on the heap.
/* Should now be looking at the exe name. */
if (i < argc) {
vg_assert(argv[i]);
- VG_(args_the_exename) = argv[i];
+ VG_(args_the_exename) = VG_(strdup)("commandline.sua.4", argv[i]);
i++;
}
return orig;
}
-/*
- * @todo PJF Make this multi-platform
- */
-static Bool try_get_interp(const HChar* args_exe, HChar* interp_out)
-{
- HChar hdr[4096];
- Int len = sizeof hdr;
- SysRes res;
- Int fd;
- HChar* end;
- HChar* cp;
- HChar* interp;
-
- res = VG_(open)(args_exe, VKI_O_RDONLY, 0);
- if (sr_isError(res)) {
- return False;
- } else {
- fd = sr_Res(res);
- }
-
- res = VG_(pread)(fd, hdr, len, 0);
-
- if (sr_isError(res)) {
- VG_(close)(fd);
- return False;
- } else {
- len = sr_Res(res);
- }
-
- if (0 != VG_(memcmp)(hdr, "#!", 2)) {
- VG_(close)(fd);
- return False;
- }
-
- end = hdr + len;
- interp = hdr + 2;
- while (interp < end && (*interp == ' ' || *interp == '\t'))
- interp++;
-
- for (cp = interp; cp < end && !VG_(isspace)(*cp); cp++)
- ;
-
- *cp = '\0';
-
- VG_(sprintf)(interp_out, "%s", interp);
-
- VG_(close)(fd);
- return True;
-}
-
-
-
/* ----------------------------------------------------------------
This sets up the client's initial stack, containing the args,
if (VG_(resolved_exename) == NULL) {
const HChar *exe_name = VG_(find_executable)(VG_(args_the_exename));
HChar interp_name[VKI_PATH_MAX];
- if (try_get_interp(exe_name, interp_name)) {
+ if (VG_(try_get_interp)(exe_name, interp_name, VKI_PATH_MAX)) {
exe_name = interp_name;
}
HChar resolved_name[VKI_PATH_MAX];
/*
* @todo PJF Make this multi-platform
*/
-static Bool try_get_interp(const HChar* args_exe, HChar* interp_out)
-{
- HChar hdr[4096];
- Int len = sizeof hdr;
- SysRes res;
- Int fd;
- HChar* end;
- HChar* cp;
- HChar* interp;
-
- res = VG_(open)(args_exe, VKI_O_RDONLY, 0);
- if (sr_isError(res)) {
- return False;
- } else {
- fd = sr_Res(res);
- }
-
- res = VG_(pread)(fd, hdr, len, 0);
-
- if (sr_isError(res)) {
- VG_(close)(fd);
- return False;
- } else {
- len = sr_Res(res);
- }
-
- if (0 != VG_(memcmp)(hdr, "#!", 2)) {
- VG_(close)(fd);
- return False;
- }
-
- end = hdr + len;
- interp = hdr + 2;
- while (interp < end && (*interp == ' ' || *interp == '\t'))
- interp++;
-
- for (cp = interp; cp < end && !VG_(isspace)(*cp); cp++)
- ;
-
- *cp = '\0';
-
- VG_(sprintf)(interp_out, "%s", interp);
-
- VG_(close)(fd);
- return True;
-}
/* ----------------------------------------------------------------
const HChar *exe_name = VG_(find_executable)(VG_(args_the_exename));
HChar interp_name[VKI_PATH_MAX];
- if (try_get_interp(exe_name, interp_name)) {
+ if (VG_(try_get_interp)(exe_name, interp_name, VKI_PATH_MAX)) {
exe_name = interp_name;
}
HChar resolved_name[VKI_PATH_MAX];
return (struct auxv *)sp;
}
-/*
- * @todo PJF Make this multi-platform
- */
-static Bool try_get_interp(const HChar* args_exe, HChar* interp_out)
-{
- HChar hdr[4096];
- Int len = sizeof hdr;
- SysRes res;
- Int fd;
- HChar* end;
- HChar* cp;
- HChar* interp;
-
- res = VG_(open)(args_exe, VKI_O_RDONLY, 0);
- if (sr_isError(res)) {
- return False;
- } else {
- fd = sr_Res(res);
- }
-
- res = VG_(pread)(fd, hdr, len, 0);
-
- if (sr_isError(res)) {
- VG_(close)(fd);
- return False;
- } else {
- len = sr_Res(res);
- }
-
- if (0 != VG_(memcmp)(hdr, "#!", 2)) {
- VG_(close)(fd);
- return False;
- }
-
- end = hdr + len;
- interp = hdr + 2;
- while (interp < end && (*interp == ' ' || *interp == '\t'))
- interp++;
-
- for (cp = interp; cp < end && !VG_(isspace)(*cp); cp++)
- ;
-
- *cp = '\0';
-
- VG_(sprintf)(interp_out, "%s", interp);
-
- VG_(close)(fd);
- return True;
-}
-
static
Addr setup_client_stack( void* init_sp,
HChar** orig_envp,
if (VG_(resolved_exename) == NULL) {
const HChar *exe_name = VG_(find_executable)(VG_(args_the_exename));
HChar interp_name[VKI_PATH_MAX];
- if (try_get_interp(exe_name, interp_name)) {
+ if (VG_(try_get_interp)(exe_name, interp_name, VKI_PATH_MAX)) {
exe_name = interp_name;
}
HChar resolved_name[VKI_PATH_MAX];
return executable_name_out;
}
+Bool VG_(try_get_interp)(const HChar* args_exe, HChar* interp_out, SizeT max_interp_len)
+{
+ HChar hdr[4096];
+ SysRes res;
+ Int fd;
+ HChar* end;
+ HChar* cp;
+ HChar* interp;
+
+ res = VG_(open)(args_exe, VKI_O_RDONLY, 0);
+ if (sr_isError(res))
+ return False;
+ fd = sr_Res(res);
+
+ res = VG_(pread)(fd, hdr, sizeof(hdr), 0);
+ VG_(close)(fd);
+ if (sr_isError(res))
+ return False;
+
+ Int len = sr_Res(res);
+ if (len < 2 || VG_(memcmp)(hdr, "#!", 2) != 0)
+ return False;
+
+ end = hdr + len;
+ interp = hdr + 2;
+ while (interp < end && (*interp == ' ' || *interp == '\t'))
+ interp++;
+ for (cp = interp; cp < end && !VG_(isspace)(*cp); cp++)
+ ;
+
+ SizeT interp_len = cp - interp;
+ if (interp_len >= max_interp_len)
+ return False;
+
+ VG_(memcpy)(interp_out, interp, interp_len);
+ interp_out[interp_len] = '\0';
+
+ return True;
+}
+
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
if (info->argv && info->argv[0] != NULL)
info->argv[0] = name;
- VG_(args_the_exename) = name;
+ vg_assert(VG_(args_the_exename));
+ if (name) {
+ if (name != VG_(args_the_exename)) {
+ VG_(free)((void*)VG_(args_the_exename));
+ VG_(args_the_exename) = VG_(strdup)("ume.ls.3", name);
+ }
+ } else {
+ VG_(args_the_exename) = name;
+ }
if (0)
VG_(printf)("#! script: interp_name=\"%s\" interp_args=\"%s\"\n",
extern const HChar* VG_(find_executable) ( const HChar* exec );
-#endif // ndef __PUB_CORE_PATHSCAN_H
+extern Bool VG_(try_get_interp)(const HChar* args_exe, HChar* interp_out, SizeT max_interp_len);
+
+#endif // __PUB_CORE_PATHSCAN_H