[ 
https://issues.apache.org/jira/browse/ACCUMULO-4336?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15321469#comment-15321469
 ] 

Matt Peterson commented on ACCUMULO-4336:
-----------------------------------------

Hey Josh,

What do you think the patch should do?  A defensive approach could minimally 
prevent compactions when an empty string is detected, throwing an exception.  
That approach doesn't take into account non-empty endRows that would also be 
altered, like \"abcd being changed to abcd.  The stripping of leading and 
trailing quotes within the commons-cli dependency would need to be disabled 
(which does not seem to be an existing capability within that API) or Accumulo 
would need to do its own parsing/validation.  We could potentially replace any 
\" characters in the command with \x22 but that may deserve more thought.

Matt

> Command line interpreter escaping issues
> ----------------------------------------
>
>                 Key: ACCUMULO-4336
>                 URL: https://issues.apache.org/jira/browse/ACCUMULO-4336
>             Project: Accumulo
>          Issue Type: Bug
>          Components: shell
>            Reporter: Matt Peterson
>            Priority: Minor
>
> To see the problem, add the following unit test.  It will fail.
> {code:title=ShellTest.java|borderStyle=solid}
> Test
> public void scanEscapedQuote() throws Exception {
>   exec("createtable test", true);
>   exec("insert \\\" f q v", true);
>   exec("scan", true, "\" f: q []    v"); // passes
>   exec("scan -e \\\"", true, "\" f: q []    v"); // fails
>   exec("deletetable test -f", true, "Table: [test] has been deleted");
> }
> {code}
> It appears that the commons-cli library that is used for parsing commands 
> will strip the leading \" from the option's value and return an empty string. 
>  
> {code:title=Parser.java, line 332|borderStyle=solid}
> opt.addValueForProcessing(Util.stripLeadingAndTrailingQuotes(str));
> {code}
> For scans, an empty string as an end row will cause the scan to do nothing, 
> which is a reasonable way to fail.  
> For compactions, an empty string as an end row will cause the end row to be 
> ignored, which can lead to accidentally initiating a compaction over much of 
> a table.  It is not possible to test the compaction issue with ShellTest 
> because MockTableOperationsImpl does not do anything with compactions.  But 
> the problem code can be seen in the constructor for CompactRange:
> {code:title=CompactRange.java|borderStyle=solid}
> this.endRow = endRow.length == 0 ? null : endRow;
> {code}
> This code will treat an end row of \" as though there was no end row at all.
> The workaround for this is to use the \x22 instead of \".
> Additionally, some characters are not possible to include as either begin or 
> end rows.  For example, a ! character cannot be escaped but without escaping 
> will crash the shell.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to