From 587444e2495acb3f4baba9449f3c2638fbaad471 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 5 May 2025 18:13:52 +0200 Subject: [PATCH] WW-5546 Fixes NPE when uploaded file is empty --- .../AbstractFileUploadInterceptor.java | 2 +- .../ActionFileUploadInterceptorTest.java | 63 +++++++++++++++++++ .../FileUploadInterceptorTest.java | 63 +++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/struts2/interceptor/AbstractFileUploadInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/AbstractFileUploadInterceptor.java index ecebd3748f..a905e00cb3 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/AbstractFileUploadInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/AbstractFileUploadInterceptor.java @@ -116,7 +116,7 @@ protected boolean acceptFile(Object action, UploadedFile file, String originalFi } // If it's null the upload failed - if (file == null) { + if (file == null || file.getContent() == null) { String errMsg = getTextMessage(action, STRUTS_MESSAGES_ERROR_UPLOADING_KEY, new String[]{inputName}); if (validation != null) { validation.addFieldError(inputName, errMsg); diff --git a/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java index 869deeed54..1e054753ec 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java @@ -98,6 +98,53 @@ public String getInputName() { } }; + public static final UploadedFile NULL_CONTENT = new UploadedFile() { + @Override + public Long length() { + return 0L; + } + + @Override + public String getName() { + return ""; + } + + @Override + public boolean isFile() { + return false; + } + + @Override + public boolean delete() { + return false; + } + + @Override + public String getAbsolutePath() { + return null; + } + + @Override + public File getContent() { + return null; + } + + @Override + public String getOriginalName() { + return null; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public String getInputName() { + return null; + } + }; + private ActionFileUploadInterceptor interceptor; private File tempDir; @@ -205,6 +252,22 @@ public void testAcceptFileWithNoFile() { assertTrue(msg.indexOf("inputName") > 0); } + public void testAcceptFileWithNoContent() { + interceptor.setAllowedTypes("text/plain"); + + ValidationAwareSupport validation = new ValidationAwareSupport(); + boolean notOk = interceptor.acceptFile(validation, NULL_CONTENT, "filename.html", "text/plain", "inputName"); + + assertFalse(notOk); + assertFalse(validation.getFieldErrors().isEmpty()); + assertTrue(validation.hasErrors()); + List errors = validation.getFieldErrors().get("inputName"); + assertEquals(1, errors.size()); + String msg = errors.get(0); + assertTrue(msg.startsWith("Error uploading:")); + assertTrue(msg.indexOf("inputName") > 0); + } + public void testAcceptFileWithMaxSize() throws Exception { interceptor.setMaximumSize(10L); diff --git a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java index c4b03ad0b1..8b64ccb43b 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java @@ -100,6 +100,53 @@ public String getInputName() { } }; + public static final UploadedFile NULL_CONTENT = new UploadedFile() { + @Override + public Long length() { + return 0L; + } + + @Override + public String getName() { + return ""; + } + + @Override + public boolean isFile() { + return false; + } + + @Override + public boolean delete() { + return false; + } + + @Override + public String getAbsolutePath() { + return null; + } + + @Override + public File getContent() { + return null; + } + + @Override + public String getOriginalName() { + return null; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public String getInputName() { + return null; + } + }; + private FileUploadInterceptor interceptor; private File tempDir; @@ -202,6 +249,22 @@ public void testAcceptFileWithNoFile() { assertTrue(msg.indexOf("inputName") > 0); } + public void testAcceptFileWithNoContent() { + interceptor.setAllowedTypes("text/plain"); + + ValidationAwareSupport validation = new ValidationAwareSupport(); + boolean notOk = interceptor.acceptFile(validation, NULL_CONTENT, "filename.html", "text/plain", "inputName"); + + assertFalse(notOk); + assertFalse(validation.getFieldErrors().isEmpty()); + assertTrue(validation.hasErrors()); + List errors = validation.getFieldErrors().get("inputName"); + assertEquals(1, errors.size()); + String msg = errors.get(0); + assertTrue(msg.startsWith("Error uploading:")); + assertTrue(msg.indexOf("inputName") > 0); + } + public void testAcceptFileWithMaxSize() throws Exception { interceptor.setMaximumSize(10L);