Changeset 2287 for research


Ignore:
Timestamp:
Apr 16, 2008, 12:11:35 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Better error reporting and argument passing from/to the bytecode.
Location:
research/2008-displacement
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • research/2008-displacement/main-cpushare

    r2286 r2287  
    1818    sys.exit(-1)
    1919mode = sys.argv[2][1]
     20done = 0
    2021source = sys.argv[3:]
    2122result = [False] * len(source)
     
    3536        global todo, source
    3637        if todo >= len(source):
    37             return # We're finished... FIXME: a process is stuck
     38            return # We're finished... FIXME: is the transaction kept stuck?
    3839        self.index = todo
    3940        todo += 1
    4041        gd.gdMaxColors = 256 * 256 * 256
    4142        im = gd.image(source[self.index])
    42         # Send mode
    43         self.protocol.sendString(PROTO_SECCOMP_FORWARD + mode)
     43        # Send argument count
     44        self.protocol.sendString(PROTO_SECCOMP_FORWARD + chr(3))
     45        # Send arguments
     46        msg = chr(3)
     47        msg += "bytecode\0"
     48        msg += "-1\0"
     49        msg += source[self.index] + "\0"
     50        self.protocol.sendString(PROTO_SECCOMP_FORWARD + msg)
    4451        # Send image size
    4552        (self.w, self.h) = (w, h) = im.size()
     
    6572            if ord(self.answer[-1]) != 0:
    6673                return
    67             global result
     74            global done, result
    6875            result[self.index] = self.answer[:-1]
    6976            print self.answer[:-1],
    7077            self.protocol.sendString(PROTO_SECCOMP_SUCCESS)
    71             # the PROTO_SECCOMP_SUCCESS probably won't have a chance
    72             # to go out but it doesn't matter because we'll disconnect
    73             # not just this but all other seccomp state machines too
     78            done += 1
     79            if done < len(source):
     80                return
    7481            from twisted.internet import reactor
    7582            reactor.stop()
  • research/2008-displacement/main.c

    r2286 r2287  
    4040void bytecode(unsigned char * mem, int heap_size, int stack_size)
    4141{
    42     char mode[] = "-0";
    43     char *argv[] = { "program", mode, "arg" };
     42    char args[10][1024];
     43    char *argv[] = { args[0], args[1], args[2], args[3], args[4],
     44                     args[5], args[6], args[7], args[8], args[9] };
     45    int i, argc;
    4446    char c;
    4547
    46     if(sys_read(0, mode + 1, 1) != 1)
     48    if(sys_read(0, &c, 1) != 1)
    4749        sys_exit(-5);
    48 
    49     main(sizeof(argv)/sizeof(*argv), argv);
     50    argc = (unsigned char)c;
     51
     52    for(i = 0; i < argc; i++)
     53    {
     54        char *p = argv[i];
     55        do
     56            if(sys_read(0, p, 1) != 1)
     57                sys_exit(-5);
     58        while(*p++);
     59    }
     60
     61    main(argc, argv);
    5062
    5163    c = 0;
     
    8193    } while(0)
    8294
    83 static void msg(const char *f, ...)
    84 {
    85     va_list args;
    86     va_start(args, f);
     95static void out(FILE *stream, const char *f, va_list args)
     96{
    8797#ifdef BYTECODE
    8898    static char const *hex2char = "0123456789abcdef";
     
    142152        else if(f[0] == 'g')
    143153        {
    144             double g = va_arg(args, double), h = 9.9f;
    145             int i;
    146             if(g < 0.f)
    147             {
    148                 sys_write(1, "-", 1);
    149                 g = -g;
    150             }
     154            double g = va_arg(args, double), h = 0.0000001;
     155            int i = g;
     156            WRITE_INT(i, 10);
    151157            for(i = 0; i < 7; i++)
    152158            {
    153                 sys_write(1, hex2char + (int)g, 1);
     159                g = (g - (int)g) * 10;
     160                h *= 10;
     161                if(g < h)
     162                    break;
    154163                if(i == 0)
    155164                    sys_write(1, ".", 1);
    156                 g = (g - (int)g) * 10;
    157                 h = h / 10.f;
    158                 if(g < h)
    159                     break;
     165                sys_write(1, hex2char + (int)g, 1);
    160166            }
    161167        }
     
    197203    }
    198204#else
    199     vprintf(f, args);
    200     fflush(stdout);
    201 #endif
     205    vfprintf(stream, f, args);
     206    fflush(stream);
     207#endif
     208}
     209
     210static void err(const char *f, ...)
     211{
     212    va_list args;
     213    va_start(args, f);
     214    out(stderr, f, args);
     215    va_end(args);
     216}
     217
     218static void msg(const char *f, ...)
     219{
     220    va_list args;
     221    va_start(args, f);
     222    out(stdout, f, args);
    202223    va_end(args);
    203224}
     
    753774        }
    754775
    755         fprintf(stderr, "did %i changes\n", changes);
     776        err("did %i changes\n", changes);
    756777
    757778        if(changes == 0)
     
    829850static void usage(char *argv[])
    830851{
    831     fprintf(stderr, "Usage: %s <mode> [ARGS...]\n", argv[0]);
    832     fprintf(stderr, "Allowed modes:\n");
    833     fprintf(stderr, " -1 <src>           raster FS displacement study on src\n");
    834     fprintf(stderr, " -2 <src1> <src2>   raster FS displacement study on blends of src1 and src2\n");
    835     fprintf(stderr, " -3 <src>           quick (a,b,c,d) ED kernel analysis on src\n");
    836     fprintf(stderr, " -4 <src>           exhaustive (a,b,c,d) ED kernel analysis on src\n");
    837     fprintf(stderr, " -5 <src>           exhaustive displacement study on src\n");
     852    msg("Usage: %s <mode> [ARGS...]\n", argv[0]);
     853    msg("Allowed modes:\n");
     854    msg(" -1 <src>           raster FS displacement study on src\n");
     855    msg(" -2 <src1> <src2>   raster FS displacement study on blends of src1 and src2\n");
     856    msg(" -3 <src>           quick (a,b,c,d) ED kernel analysis on src\n");
     857    msg(" -4 <src>           exhaustive (a,b,c,d) ED kernel analysis on src\n");
     858    msg(" -5 <src>           exhaustive displacement study on src\n");
     859    msg(" -6 <src>           restrained (a,b,c,d) ED kernel analysis on src\n");
     860    msg(" -7 <src>           restrained displacement study on src\n");
    838861}
    839862
     
    845868    if(argc < 2)
    846869    {
    847         fprintf(stderr, "%s: too few arguments\n", argv[0]);
     870        err("%s: too few arguments\n", argv[0]);
    848871        usage(argv);
    849872        return EXIT_FAILURE;
     
    852875    if(argv[1][0] != '-' || !(mode = atoi(argv[1] + 1)))
    853876    {
    854         fprintf(stderr, "%s: invalid mode `%s'\n", argv[0], argv[1]);
     877        err("%s: invalid mode `%s'\n", argv[0], argv[1]);
    855878        usage(argv);
    856879        return EXIT_FAILURE;
Note: See TracChangeset for help on using the changeset viewer.