Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Is this a bug? #1

Open
masaoliou opened this issue Jan 26, 2013 · 0 comments
Open

Is this a bug? #1

masaoliou opened this issue Jan 26, 2013 · 0 comments

Comments

@masaoliou
Copy link

Use gcc to compile the following code and run it with command ./a.out -t, decode_85() goes to:
say1("invalid base85 alphabet (%c)\n",ch); return -1;

#include <string.h>
#include <stdio.h>
//#undef DEBUG_85
#define DEBUG_85

#ifdef DEBUG_85
#define say(a) fprintf(stderr, a)
#define say1(a,b) fprintf(stderr, a, b)
#define say2(a,b,c) fprintf(stderr, a, b, c)
#else
#define say(a) do { /* nothing */ } while (0)
#define say1(a,b) do { /* nothing */ } while (0)
#define say2(a,b,c) do { /* nothing */ } while (0)
#endif


static const char en85[] = {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
    'U', 'V', 'W', 'X', 'Y', 'Z',
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y', 'z',
    '!', '#', '$', '%', '&', '(', ')', '*', '+', '-',
    ';', '<', '=', '>', '?', '@', '^', '_', '`', '{',
    '|', '}', '~'
};

static char de85[256];
static void prep_base85(void)
{
    if (de85['Z'])
        return;
    int i;
    for (i = 0; i < sizeof(en85); i++) {
        int ch = en85[i];
        de85[ch] = i + 1;
    }
}


int decode_85(char *dst, const char *buffer, int len)
{
const char *start=buffer;
    prep_base85();
    say2("decoding=>(given len=%d,converted len=%d)",len,len/4*5);
    say2(" decoding str:(%.*s)", len/4*5, buffer);
    while (len) {
say1("\n(loop len=%d) ",len);
        unsigned acc = 0;
        int de, cnt = 4;
        unsigned char ch;
        do {
            ch = *buffer++;
say1("%c",ch);
            de = de85[ch];
            if (--de < 0){
                //return error("invalid base85 alphabet %c", ch);
                say1("invalid base85 alphabet (%c)\n",ch); return -1;
            }
            acc = acc * 85 + de;
        } while (--cnt);
        ch = *buffer++;
say1("%c",ch);
        de = de85[ch];
        if (--de < 0){
            //return error("invalid base85 alphabet %c", ch);
            say("error -2\n"); return -2;
        }
        /* Detect overflow. */
        if (0xffffffff / 85 < acc || 0xffffffff - de < (acc *= 85)){
            //return error("invalid base85 sequence %.5s", buffer-5);
            say("error -3\n"); return -3;
        }
        acc += de;
        say1(" %08X", acc);
        cnt = (len < 4) ? len : 4;
        len -= cnt;
        do {
            acc = (acc << 8) | (acc >> 24);
            *dst++ = acc;
        } while (--cnt);
    }
    say1("\n",len);
    //return 0;
return buffer-start;
}

//#ifdef DEBUG_85
int main(int ac, char **av)
{
    char buf[1024];

    if (!strcmp(av[1], "-e")) {
        int len = strlen(av[2]);
        encode_85(buf, av[2], len);
        if (len <= 26) len = len + 'A' - 1;
        else len = len + 'a' - 26 - 1;
        printf("encoded:%c%s\n", len, buf);
        return 0;
    }
    if (!strcmp(av[1], "-d")) {
        int len = *av[2];
        if ('A' <= len && len <= 'Z') len = len - 'A' + 1;
        else len = len - 'a' + 26 + 1;
        decode_85(buf, av[2]+1, len);
        printf("decoded:%.*s\n", len, buf);
        return 0;
    }
    if (!strcmp(av[1], "-t")) {
        /*
        char t[4] = { -1,-1,-1,-1 };
        encode_85(buf, t, 4);
        printf("encoded: D%s\n", buf);
        return 0;
        */
        char encoded[1024];
        char decoded[1024];
        const char instring[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZa";
        int encoded_len=encode_85(encoded,instring,strlen(instring));
        decode_85(decoded,encoded,encoded_len);
say2("inlen=%d,outlen=%d",strlen(instring),encoded_len);
say1("\n%s\n",decoded);
        return 0;
    }
}
//#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant