/* * Class: com_oracle_avatar_js_os_Process * Method: _setGroups * Signature: ([Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_oracle_avatar_js_os_Process__1setGroups (JNIEnv *env, jclass cls, jobjectArray array) { jsize size = env->GetArrayLength(array); gid_t* groups = new gid_t[size]; for (size_t i = 0; i < (size_t)size; i++) { jstring str = (jstring) env->GetObjectArrayElement(array, i); const char *content = env->GetStringUTFChars(str, 0); gid_t gid = gid_by_name(content); env->ReleaseStringUTFChars(str, content); if (gid == gid_not_found) { delete[] groups; ThrowException(env, "gid_by_name"); return; } groups[i] = gid; } int rc = setgroups(size, groups); delete[] groups; if (rc == -1) { ThrowException(env, "setgroups"); } }
/** * Read data from config file */ static void read_config (void) { double t = 0; char dummy[1024]; INF_INT_KEY (checker_memory_limit, "Checker/Limits/RSS"); INF_FLOAT_KEY (t, "Checker/Limits/Time"); checker_time_limit = t * USEC_COUNT; INF_INT_KEY (t, "MaxThreads"); if (t > 0) { max_threads = t; } INF_PCHAR_KEY (testing_dir, "TestingDir"); INF_PCHAR_KEY (data_dir, "DataDir"); INF_PCHAR_KEY (problems_dir, "ProblemsDir"); INF_SAFE_PCHAR_KEY (source_file, "SourceFile", INFORMATICS_SOURCE); INF_SAFE_PCHAR_KEY (file_to_exec, "FileToExec", INFORMATICS_EXEC); /* Tests' files extensions */ INF_SAFE_PCHAR_KEY (tst_ext, "Tests/InputExtension", INFORMATICS_TSTEXT); INF_SAFE_PCHAR_KEY (ans_ext, "Tests/OutputExtension", INFORMATICS_ANSEXT); INF_SAFE_PCHAR_KEY (checker_cmd_template, "Checker/Command", ""); INF_INT_KEY (unlink_interval, "UnlinkInterval"); INF_INT_KEY (keep_alive_testdirs, "KeepAliveTestdirs"); INF_PCHAR_KEY (dummy, "ChRoot"); use_chroot = is_truth (dummy); /* Get security info */ INF_SAFE_PCHAR_KEY (solution_exec_user, "SolutionExec-User", ""); solution_exec_uid = uid_by_name (solution_exec_user); INF_SAFE_PCHAR_KEY (solution_exec_group, "SolutionExec-Group", ""); solution_exec_gid = gid_by_name (solution_exec_group); INF_SAFE_INT_KEY (max_output_store_size, "MaxOutputStoreSize", 0); }
/* * Class: com_oracle_avatar_js_os_Process * Method: _initGroups_S_S * Signature: ([Ljava/lang/String;Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_oracle_avatar_js_os_Process__1initGroups_1S_1S (JNIEnv *env, jclass cls, jstring user, jstring group) { const char* u = env->GetStringUTFChars(user, 0); const char* g = env->GetStringUTFChars(group, 0); gid_t extra_group = gid_by_name(g); if (extra_group == gid_not_found) { ThrowException(env, "gid_by_name"); env->ReleaseStringUTFChars(user, u); env->ReleaseStringUTFChars(group, g); return; } int rc = initgroups(u, extra_group); if (rc) { ThrowException(env, "initgroups"); } env->ReleaseStringUTFChars(user, u); env->ReleaseStringUTFChars(group, g); }
/* * Class: com_oracle_avatar_js_os_Process * Method: _initGroups_I_S * Signature: (I[Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_oracle_avatar_js_os_Process__1initGroups_1I_1S (JNIEnv *env, jclass cls, jint user, jstring group) { const char* u = name_by_uid(user); if (u == NULL) { ThrowException(env, "name_by_uid"); return; } const char* g = env->GetStringUTFChars(group, 0); gid_t extra_group = gid_by_name(g); if (extra_group == gid_not_found) { ThrowException(env, "gid_by_name"); return; } int rc = initgroups(u, extra_group); if (rc) { ThrowException(env, "initgroups"); return; } }