@@ -155,7 +155,7 @@ export function ArthasMBeanTab({ sessionId }: { sessionId: string }) {
155155 queryKey : [ "arthas" , sessionId , "mbean" , "detail" , selected ?? "" ] ,
156156 enabled : ! ! selected ,
157157 queryFn : async ( ) => {
158- const cmd = `mbean ' ${ selected ! . replace ( / ' / g , "\\'" ) } ' ` ;
158+ const cmd = `mbean ${ quoteArg ( selected ! ) } ` ;
159159 const { results } = await execArthas ( sessionId , cmd ) ;
160160 for ( const r of results as Array < { mbeanAttribute ?: Record < string , MBeanAttribute [ ] > } > ) {
161161 if ( r ?. mbeanAttribute ) return r . mbeanAttribute [ selected ! ] ?? [ ] ;
@@ -169,7 +169,7 @@ export function ArthasMBeanTab({ sessionId }: { sessionId: string }) {
169169 enabled : ! ! selected ,
170170 staleTime : 60_000 ,
171171 queryFn : async ( ) => {
172- const cmd = `mbean -m ' ${ selected ! . replace ( / ' / g , "\\'" ) } ' ` ;
172+ const cmd = `mbean -m ${ quoteArg ( selected ! ) } ` ;
173173 const { results } = await execArthas ( sessionId , cmd ) ;
174174 for ( const r of results as Array < { mbeanMetadata ?: Record < string , MBeanMetadata > } > ) {
175175 if ( r ?. mbeanMetadata ) return r . mbeanMetadata [ selected ! ] ?? null ;
@@ -608,7 +608,15 @@ function coerceLiteral(raw: string, type: string): string {
608608 return / ^ - ? \d + ( \. \d + ) ? $ / . test ( raw . trim ( ) ) ? raw . trim ( ) : "0.0" ;
609609 }
610610 // Strings and everything else: quote as Java string literal.
611- return `"${ raw . replace ( / \\ / g, "\\\\" ) . replace ( / " / g, '\\"' ) } "` ;
611+ return javaString ( raw ) ;
612+ }
613+
614+ function javaString ( value : string ) : string {
615+ return `"${ value . replace ( / \\ / g, "\\\\" ) . replace ( / " / g, '\\"' ) } "` ;
616+ }
617+
618+ function quoteArg ( value : string ) : string {
619+ return `'${ value . replace ( / \\ / g, "\\\\" ) . replace ( / ' / g, "\\'" ) } '` ;
612620}
613621
614622async function writeMBeanAttribute (
@@ -621,11 +629,11 @@ async function writeMBeanAttribute(
621629 const literal = coerceLiteral ( value , attributeType ) ;
622630 const expr = [
623631 `(#server=@java.lang.management.ManagementFactory@getPlatformMBeanServer(),` ,
624- ` #name=new javax.management.ObjectName(" ${ objectName . replace ( / " / g , '\\"' ) } " ),` ,
625- ` #attr=new javax.management.Attribute(" ${ attribute } " , ${ literal } ),` ,
632+ ` #name=new javax.management.ObjectName(${ javaString ( objectName ) } ),` ,
633+ ` #attr=new javax.management.Attribute(${ javaString ( attribute ) } , ${ literal } ),` ,
626634 ` #server.setAttribute(#name, #attr))` ,
627635 ] . join ( "" ) ;
628- const { results } = await execArthas ( sessionId , `ognl ' ${ expr . replace ( / ' / g , "\\'" ) } ' ` ) ;
636+ const { results } = await execArthas ( sessionId , `ognl ${ quoteArg ( expr ) } ` ) ;
629637 throwIfOgnlError ( results ) ;
630638}
631639
@@ -636,15 +644,15 @@ async function invokeMBeanOperation(
636644 rawParams : string [ ] ,
637645) : Promise < unknown > {
638646 const literals = op . signature . map ( ( p , i ) => coerceLiteral ( rawParams [ i ] ?? "" , p . type ) ) ;
639- const types = op . signature . map ( ( p ) => `" ${ p . type } "` ) ;
647+ const types = op . signature . map ( ( p ) => javaString ( p . type ) ) ;
640648 const expr = [
641649 `(#server=@java.lang.management.ManagementFactory@getPlatformMBeanServer(),` ,
642- ` #name=new javax.management.ObjectName(" ${ objectName . replace ( / " / g , '\\"' ) } " ),` ,
650+ ` #name=new javax.management.ObjectName(${ javaString ( objectName ) } ),` ,
643651 ` #args=new Object[]{${ literals . join ( ", " ) } },` ,
644652 ` #sig=new String[]{${ types . join ( ", " ) } },` ,
645- ` #server.invoke(#name, " ${ op . name } " , #args, #sig))` ,
653+ ` #server.invoke(#name, ${ javaString ( op . name ) } , #args, #sig))` ,
646654 ] . join ( "" ) ;
647- const { results } = await execArthas ( sessionId , `ognl ' ${ expr . replace ( / ' / g , "\\'" ) } ' ` ) ;
655+ const { results } = await execArthas ( sessionId , `ognl ${ quoteArg ( expr ) } ` ) ;
648656 throwIfOgnlError ( results ) ;
649657 for ( const r of results as Array < { value ?: unknown ; type ?: string } > ) {
650658 if ( r ?. type === "ognl" && "value" in r ) return r . value ;
0 commit comments