小编xDa*_*ehh的帖子

如何在SecurityManager中检查呼叫者类的来源?

我有一个用于受信任的应用程序代码的ClassLoader和一个用于用户提交的(不受信任的)代码的单独的ClassLoader。

我希望安全管理器限制用户提交的代码。如何从SecurityManager中检查呼叫者的来历?参见伪代码:

System.setSecurityManager(new SecurityManager() {
    public void checkPermission(Permission permission) {
        if (/*caller class is not loaded by the trusted classloader*/) {
            throw new SecurityException("You do not have permissions.");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我已经尝试过的

  • StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass().getClassLoader() 首先检查权限,以便给出堆栈溢出异常。

  • Thread.currentThread().getStackTrace()[2].getClassLoaderName() 这是不安全的,因为它仅提供类加载器名称,而不提供类对象,如果不可信加载器的规范名称与可信加载器相同,则存在安全问题。

java java-security java-security-manager

9
推荐指数
1
解决办法
173
查看次数

gcc - 对“libusb_init”的未定义引用

我正在尝试编译一段使用 libusb 的代码:

#include <stdio.h>
#include <libusb-1.0/libusb.h>
#include <assert.h>

int main(void) {
    libusb_context *context = NULL;
    int rc = 0;

    rc = libusb_init(&context);
    assert(rc == 0);

    libusb_exit(context);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译后gcc -lusb -lusb-1.0 sample.c -o sample出现以下错误:

/tmp/ccr65JBT.o: In function `main':
sample.c:(.text+0x2e): undefined reference to `libusb_init'
sample.c:(.text+0x62): undefined reference to `libusb_exit'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

为了确保 libusb 在我的系统上可用:

raven@enforcer:~/sample$ pkg-config --libs libusb-1.0
-lusb-1.0
raven@enforcer:~/sample$ pkg-config --libs libusb
-lusb
Run Code Online (Sandbox Code Playgroud)

我正在运行带有 gcc 7.3.0-16ubuntu3 的 Ubuntu 18.04,如何修复?

c gcc libusb libusb-1.0

5
推荐指数
1
解决办法
7281
查看次数

AsyncTask没有零参数构造函数

假设我有一个名为UpdateInterfaceStatusesTask的Android AsyncTask :

private class UpdateInterfaceStatusesTask extends AsyncTask<Object, Object, Object> {

    public UpdateInterfaceStatusesTask() {
        ;
    }

    protected Object doInBackground(Object... params) {
        View header = ((NavigationView) findViewById(R.id.nav_view)).getHeaderView(0);
        ((TextView) header.findViewById(R.id.nav_head_status)).setText(ServerThread.getInstance().isInterrupted() ? "Offline" : "Online");
        return null;
    }

    @Override protected void onPostExecute(Object param) {
        ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想以编程方式创建它的新实例:

public void createNewInstance(Class<? extends AsyncTask<?, ?, ?>> clazz) {
    try {
        clazz.newInstance().execute();
    } catch (Exception x) {
        x.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

W/System.err: java.lang.InstantiationException: java.lang.Class<nl.hypothermic.offthegrid.ChatActivity$UpdateInterfaceStatusesTask> has no zero argument constructor
W/System.err:     at java.lang.Class.newInstance(Native Method) …
Run Code Online (Sandbox Code Playgroud)

android android-asynctask

1
推荐指数
1
解决办法
47
查看次数

如何在不知道其长度的情况下遍历char **

GLib库给了我无限的char**篇幅。如何遍历它,打印数组中的每个字符串?

我已经尝试了以下代码,但是即使数组包含多个字符串,它也只会给我第一个字符串。

#include <stdio.h>
#include <glib.h>

static gchar** input_files = NULL;

static const GOptionEntry command_entries[] = {
        {"input", 'i', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING_ARRAY, &input_files, "Input files", NULL},
        {NULL}
};

int main(int argc, char **argv) {
    GOptionContext* option_context;
    GError* error;

    option_context = g_option_context_new(NULL);
    g_option_context_add_main_entries(option_context, command_entries, NULL);
    if (!g_option_context_parse(option_context, &argc, &argv, &error)) {
        g_printerr("%s: %s\n", argv[0], error->message);
        return 1;
    }
    g_option_context_free(option_context);

    if (input_files) {
        for (int i = 0; input_files[i]; i++) {
            printf("%s", input_files[i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
$ ./a.out -i One Two …
Run Code Online (Sandbox Code Playgroud)

c glib

1
推荐指数
1
解决办法
72
查看次数

使用类型比记录有优势吗?

我想在我的应用程序中存储坐标。坐标由三个浮点数组成:x、y 和 z。定义一个类型来将它们组合在一起或定义一个记录是更好的做法吗?Erlang 用户指南说它们在编译期间都被翻译成元组表达式。一种方法比另一种方法有优势吗?

-type coordinate() :: {X, Y, Z}.

-record(coordinate, {x, y, z}).
Run Code Online (Sandbox Code Playgroud)

erlang

1
推荐指数
1
解决办法
56
查看次数

包含java异常的方法

我试图查看抛出的异常是否包含特定单词,如下面的代码所示,但我的 IDE 说“contains()”方法对于 Exception 类型未定义。我该怎么做呢?

public static void main(String[] args) throws Exception {
  try {
     // blah blah
  } catch (Exception z) {
     if (z.contains("UnknownHostException")) {
       System.out.print("Unknown Host");
     }
     // blah blah
  }
}
Run Code Online (Sandbox Code Playgroud)

java exception

-2
推荐指数
1
解决办法
3833
查看次数