On 08/22/2017 02:28 PM, Nadav Har'El wrote:

On Tue, Aug 22, 2017 at 2:48 PM, Justin Cinkelj <[email protected] <mailto:[email protected]>> wrote:

    > What does it not fix?
    The $892 mentions environ varibales with spaces or empty one. And
    command line parsing is done in loader.cc to get loader options,
    and in commands.cc, to get argv/argc for app, and to implement
    runscript. This one only touched loader.cc options, and ensured
    that commands.cc can get argv[i] with spaces. It didn't fix
    runcript. Also, when commands.cc re-assembles and re-parses
    cmdline, the initial "aa bb" argv[i] get incorrectly split on space.

    > everything else in the command line is glued together again into
    one string
    In
    https://github.com/cloudius-systems/osv/blob/master/loader.cc#L319
    <https://github.com/cloudius-systems/osv/blob/master/loader.cc#L319>
        // concatenate everything
        for (auto i = 0; i < ac; i++) {
            line += std::string(av[i]) + " ";
       }
    It doesn't expect av[i] to contain space. Also " or ' or \ inside
    would not work, I guess.

    > above parse_cmdline() there is an old (3 year old) comment saying it 
cannot use std::string.
    > I guess you checked and this is incorrect?
    I have not checked. I just blindly tried to use some existing
    parser, and not invent/write my own.
    So this code might be broken and problematic.
    PS:
    I also used not only debug_early, but also printf, and even
    std::cout, and it worked - for me.
    On the other side, Gregor complained in
    https://github.com/cloudius-systems/osv/issues/892#issuecomment-323910628
    <https://github.com/cloudius-systems/osv/issues/892#issuecomment-323910628>
    about
    std::cout not working (inside parse_cmdline, I think). So it might
    depend on gcc/boost/something version.

    > Why do we even need this argc/argv? We don't, really....
    And neither we don't really need this patch ? ;) I vote to abandon it.

    I was looking if there is way to get from boost::tokenizer both
    token and its start/end position in original string.
    Then, loader would consume first few tokes (the loader options,
    they all start with '-') from argv array.
    The remaining part would be consumed by commands.cc - end position
    of last loader option would be passed as commandline to it.

    --env=AAA="aa bb"
    is problematic case here, as it contains spaces.
    So we need to support quoting and spaces and escaping.
    Nothing from C++/std/boost can be used.



Why, because it is done early?
Or because you think nothing from C++/std/boost fits?
Things from std/boost would fit.
My problem/worry is it is done early, and I'm afraid that Gregor could not use std:cout because of that.
@Gergor
On what platform did you try to use std:cout in parse_cmdline (loader.cc)?
Was enough to add a single "cout << "blah" << endl;" to get well repeatable problems? I would like to be able to check for that problem, but fedora 25 as build system seems to produce immune image.


    strtok from C doesn't support quoting/escaping.
    Are you aware of any C alternative to strtok with quoting/escaping
    support? Just asking before trying to do it myself.

stresep would fit (I think), it has escape character. It is not in nm loader.elf output, but if I can find BSD licensed file (and it seems to be part of netbsd), then I will give it a try.

--
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to