繁体   English   中英

用openssl进行base64解码的一个非常奇怪的错误

[英]A really strange bug for base64 decoding with openssl

我使用此代码执行base64解码工作,但发生了一个奇怪的错误。 像这样的短代码:

#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <string.h>
#include <stdint.h>
int main()
{
        char *str = "aGVsbG8=";
        char *xa_en = NULL;
        int xa_en_len = 0;
        int q=1, sid=1;

        printf("q:%d; sid:%d;\n", q, sid);
        Base64Decode(str, &xa_en, &xa_en_len);

        printf("q:%d; sid:%d; xa_en:%s;\n", q, sid, xa_en);
}

size_t calcDecodeLength(const char* b64input) { //Calculates the length of a decoded string
        size_t len = strlen(b64input),
                padding = 0;

        if (b64input[len-1] == '=' && b64input[len-2] == '=') //last two chars are =
                padding = 2;
        else if (b64input[len-1] == '=') //last char is =
                padding = 1;

        return (size_t)len*0.75 - padding;
}

int Base64Decode(char* b64message, uint8_t** buffer, size_t* length) { //Decodes a base64 encoded string
        BIO *bio, *b64;

        int decodeLen = calcDecodeLength(b64message);
        *buffer = (uint8_t*)malloc(decodeLen);

        bio = BIO_new_mem_buf(b64message, -1);
        b64 = BIO_new(BIO_f_base64());
        bio = BIO_push(b64, bio);

        BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer
        *length = BIO_read(bio, *buffer, strlen(b64message));
        BIO_free_all(bio);

        return (0); //success
}

用以下代码编译此代码:

gcc -g -o Base64 Base64.c  -lssl -lcrypto

并运行:

./Base64

预期产量

q:1; sid:1; q:1; sid:1; xa_en:hello;

到达输出

q:1; sid:1; q:0; sid:1; xa_en:hello;

我的问题

怎么会这样 Base64Decode函数如何影响q的值?

我猜应该是一些缓冲区溢出错误,但无法弄清楚。 这是openssl的错误还是什么? 有人帮助我,谢谢。

如果sizeof(size_t)大于sizeof(int),则可能会解释该行为,因为当您分配给*length时,您将覆盖堆栈的一部分。 您的编译器应该已经能够给您有关该问题的警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM