Fix bug with $_SERVER['PHP_SELF']

Currently we have bug where $_SERVER['PHP_SELF'] is "" a script is invoked
at the command line without using "-f" or "--file".

This diff fixes the problem by making more places use the adjusted version
of argc/argv built using prepare_args(). This also allows us to get rid of
a old hack we've had for a long time for supporting running scripts without
using "-f" or "--file" at the command line.

Github issue 730: https://github.com/facebook/hiphop-php/issues/730
Esse commit está contido em:
Drew Paroski
2013-05-17 23:26:16 -07:00
commit de Sara Golemon
commit 9b8b31b62a
2 arquivos alterados com 20 adições e 29 exclusões
+1 -19
Ver Arquivo
@@ -1036,25 +1036,7 @@ Variant invoke_file(CStrRef s, bool once, const char *currentDir) {
if (invoke_file_impl(r, s, once, currentDir)) {
return r;
}
if (!s.empty()) {
return throw_missing_file(s.c_str());
}
// The gross hack which follows is here so that "hhvm foo.php" works
// the same as "hhvm -f foo.php".
// TODO Task #2171414: Find a less hacky way to accomplish this; we probably
// should be handling this elsewhere at a higher level rather than within
// the bowels of the invoke/include machinery
SystemGlobals* g = (SystemGlobals*)get_global_variables();
Variant& v_argc = g->GV(argc);
Variant& v_argv = g->GV(argv);
if (!more(v_argc, int64_t(0))) {
return true;
}
String s2 = toString(v_argv.rvalAt(int64_t(0), AccessFlags::Error));
if (invoke_file_impl(r, s2, once, "")) {
return r;
}
return throw_missing_file(s2.c_str());
return throw_missing_file(s.c_str());
}
bool invoke_file_impl(Variant &res, CStrRef path, bool once,
+19 -10
Ver Arquivo
@@ -491,13 +491,17 @@ void execute_command_line_begin(int argc, char **argv, int xhprof) {
now = time(nullptr);
now_double = (double)now;
}
String file = empty_string;
if (argc > 0) {
file = NEW(StringData)(argv[0], AttachLiteral);
}
server.set(s_REQUEST_START_TIME, now);
server.set(s_REQUEST_TIME, now);
server.set(s_REQUEST_TIME_FLOAT, now_double);
server.set(s_DOCUMENT_ROOT, empty_string);
server.set(s_SCRIPT_FILENAME, argv[0]);
server.set(s_SCRIPT_NAME, argv[0]);
server.set(s_PHP_SELF, argv[0]);
server.set(s_SCRIPT_FILENAME, file);
server.set(s_SCRIPT_NAME, file);
server.set(s_PHP_SELF, file);
server.set(s_argv, g->GV(argv));
server.set(s_argc, g->GV(argc));
server.set(s_PWD, g_context->getCwd());
@@ -1031,13 +1035,18 @@ static int execute_program_impl(int argc, char **argv) {
if (!po.file.empty()) {
Repo::setCliFile(po.file);
} else if (new_argc >= 1) {
} else if (new_argc > 0) {
Repo::setCliFile(new_argv[0]);
}
int ret = 0;
hphp_process_init();
string file;
if (new_argc > 0) {
file = new_argv[0];
}
if (po.mode == "debug") {
StackTraceNoHeap::AddExtraLogging("IsDebugger", "True");
RuntimeOption::EnableDebugger = true;
@@ -1049,7 +1058,6 @@ static int execute_program_impl(int argc, char **argv) {
}
Eval::Debugger::RegisterSandbox(proxy->getDummyInfo());
Eval::Debugger::RegisterThread();
string file = po.file;
StringVecPtr client_args;
bool restart = false;
ret = 0;
@@ -1081,10 +1089,10 @@ static int execute_program_impl(int argc, char **argv) {
for (int i = 0; i < po.count; i++) {
execute_command_line_begin(new_argc, new_argv, po.xhprofFlags);
ret = 1;
if (hphp_invoke_simple(po.file)) {
if (hphp_invoke_simple(file)) {
ret = ExitException::ExitCode;
}
execute_command_line_end(po.xhprofFlags, true, new_argv[0]);
execute_command_line_end(po.xhprofFlags, true, file.c_str());
}
}
@@ -1296,9 +1304,10 @@ ExecutionContext *hphp_context_init() {
bool hphp_invoke_simple(const std::string &filename,
bool warmupOnly /* = false */) {
bool error; string errorMsg;
return hphp_invoke(g_context.getNoCheck(), filename, false, null_array, uninit_null(),
"", "", error, errorMsg, true, warmupOnly);
bool error;
string errorMsg;
return hphp_invoke(g_context.getNoCheck(), filename, false, null_array,
uninit_null(), "", "", error, errorMsg, true, warmupOnly);
}
bool hphp_invoke(ExecutionContext *context, const std::string &cmd,