【问题标题】:try-with-resources Statement resource leakage and HttpServletRequestWrapper.getRead() resource leakagetry-with-resources 语句资源泄露和 HttpServletRequestWrapper.getRead() 资源泄露
【发布时间】:2020-10-23 05:13:27
【问题描述】:

在下面的代码中,我在 try 中使用了 BufferedReader 和 InputStreamReader,但 veracode 将安全性抱怨为 Improper Resource Shutdown or Release (CWE ID 404)

 try (final BufferedReader bsr = new BufferedReader(new InputStreamReader(Myutils.class.getClassLoader()
            .getResourceAsStream("fileName.txt")))) {

            String currentLine;
            while ((currentLine = bsr.readLine()) != null) {
           // doing some operations
            }

        } catch (final Exception e) {
            throw new IllegalStateException("exception occurres");
        }
    }

我还在另一个类中扩展 HttpServletRequestWrapper

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private BufferedReader reader;

    @Override
    public BufferedReader getReader() throws IOException {
        if (null == this.reader) {
            this.reader = new BufferedReader(new InputStreamReader(getInputStream(), getCharacterEncoding()));
        }
        return this.reader;
    }

    }

this.reader 行中,veracode 给出 Improper Resource Shutdown or Release (CWE ID 404)。我认为框架(tomcat/spring)正在处理这个问题。但不知道为什么veracode会这样说。

【问题讨论】:

    标签: java try-with-resources veracode resource-leak


    【解决方案1】:

    如果在打开InputStream 之后但在分配BufferedReader 之前抛出异常,InputStream 将保持打开状态。在您提供的示例中,只有在 InputStreamReader 构造函数抛出异常时才会发生这种情况。为避免这种情况,您可以使用以下代码:

    try (final InputStream is = Example.class.getClassLoader().getResourceAsStream("filename.txt");
                 final InputStreamReader inputStreamReader = new InputStreamReader(is);
                 final BufferedReader bsr = new BufferedReader(inputStreamReader);) {
    

    【讨论】:

    • 在我的例子中,如果 InputStreamReader 发生任何异常,InputStream 将不会被关闭。对吗?
    • 是的。如果 InputStreamReader 抛出异常,则 InputStream 可能不会关闭。如果您使用我在回答中提供的代码,那么如果出现异常,它将正确关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2022-08-15
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多