强化安全问题“未发布的资源流”

时间:2017-02-16 10:14:04

标签: java security inputstream

我在下面的代码中找到了“Unreleased resource stream”的强化发现。

Resource[] l_objResource = resourceLoader.getResources(configErrorCode);
Properties l_objProperty = null;
for (int i = 0; i < l_objResource.length; i++) {
    l_objProperty = new Properties();
    l_objProperty.load(l_objResource[i].getInputStream());
}

loadErrorCode()中的函数BaseErrorParser.java有时无法释放由getInputStream();分配的系统资源

任何人都可以解释这个发现或帮助解决问题吗?

从下面的评论中,但背景不明确(JW):

ObjectInputStream l_objObjInputStream = null;
Map l_mapRet = null;
try {
    l_objObjInputStream = new ObjectInputStream(new FileInputStream(p_objFilename));
    Object l_objTemp = l_objObjInputStream.readObject();
    l_mapRet = (Map) l_objTemp;
} finally {
    if (l_objObjInputStream != null) {
        l_objObjInputStream.close();
    }
}

2 个答案:

答案 0 :(得分:3)

您没有关闭由下面的代码行打开的输入流

l_objResource[i].getInputStream();

通常强化扫描程序报告如果有任何输入或输出流在使用后打开但未关闭,则会发布未发布的资源流问题。处理这些问题的理想方法是关闭finally块中所有已打开的流,这样即使在异常情况下也不会产生任何问题。

您可以尝试 - 最后阻止代码并关闭流,如下所示。

Resource[] l_objResource = resourceLoader.getResources(configErrorCode);
Properties l_objProperty = null;
InputStream is = null;
for (int i = 0; i < l_objResource.length; i++) {
    l_objProperty = new Properties();
    try {
          is = l_objResource[i].getInputStream();
          l_objProperty.load(is);
    } finally {
          if(is!=null) {
              is.close();
          }
    }
}

请检查它是否适用于您的情况。

答案 1 :(得分:0)

您可以在此处对资源进行尝试。这将自动关闭您的流。

    private void showPopupMenu(View view) {
        // inflate menu
        PopupMenu popup = new PopupMenu(MainPage.this, view);
        for (int x = 0; x < Splash.main.getMenu().size(); x++) {
            popup.getMenu().add(Splash.main.getMenu().get(x).getText());
        }
        popup.setOnMenuItemClickListener(new MyMenuItemClickListener());
        popup.show(); // <<<<================  Error
    }


   View buttonAddProduct =  findViewById(R.id.action_menu);
   showPopupMenu(buttonAddProduct);
   return true;