[
https://issues.apache.org/jira/browse/MAPREDUCE-4368?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13401863#comment-13401863
]
John Gordon commented on MAPREDUCE-4368:
----------------------------------------
Good catch, Bikas. Thank you. Yes, this function in particular function would
probably need a broader rewrite to handle all the escaping mechanisms and
special characters on Linux. For instance, a string with
-Djava.library.path=/home/jgordon/hadoop\ lib;/usr/lib64 would also have
problems with surrounding quotes, because the \ would be interpreted literally.
touch this\ file
is different from:
touch "this\ file"
In that case, the more ideal solution would be to not pass javaopts as one
string, but as an array of options or a hash a-priori to improve the ability to
reason about them at all layers in the stack. Then we could have a check for
non-escaped problem characters like ;|&\,whitespace,#,etc and quote escape the
whole option only when we see those.
> TaskRunner fails to start jars when the java.library.path contains a quoted
> path with embedded spaces
> -----------------------------------------------------------------------------------------------------
>
> Key: MAPREDUCE-4368
> URL: https://issues.apache.org/jira/browse/MAPREDUCE-4368
> Project: Hadoop Map/Reduce
> Issue Type: Bug
> Components: tasktracker
> Affects Versions: 1-win
> Environment: on Windows:
> set PATH=%PATH%;"C:\this memorable place".
> Reporter: John Gordon
> Labels: newbie, patch
> Attachments: TaskRunner.patch
>
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> TaskRunner splits arguments by space before it adds them back to the vargs
> list, so it loses all context of quote escaped strings with embedded spaces.
> This gets fixed up later by wrapping all arguments with " -- so you get
> something like java "-D<opt>=<value>". This is problematic for paths with
> embedded spaces, where we end up creating "-D<opt>=<first part" "last part>".
> To java, the jar being run is last part. So with the environment above, you
> will see "ClassNoDefFoundError: memorable" and the jar will fail to start.
> In this particular case, we know that java.libarary.path contains paths and
> the tests often use %PATH% to seed this, so the fix is to remove embedded
> quotes in listed path elements because we know the aggregate will be quoted
> when the JVM is started.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira