gpt4 book ai didi

c - 处理内存时出错 - mremap_chunk : Assertion

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:54 25 4
gpt4 key购买 nike

这似乎是我以前的帖子,但这里的问题不同..

这是问题的 C 结构 -

typedef struct ip_esp_private {         /* keep track of things privately */
u_int32_t type;
u_int32_t ivlen;
u_int32_t icvlen;
u_int32_t keylen; /* length of "Encryption key */
u_int32_t akeylen; /*length of authn key */
u_int32_t key[0]; /* encryption key and authentication key both */

} esp_private;

这些值在运行时提供给结构内容,如下所示 -

  case 'k':       /* Key */
length = stringargument(arg, &temp);
priv->keylen = length;


priv = (esp_private *)realloc(priv,
sizeof(esp_private)+/*length*/priv->keylen);
/*This one is edited */


// if(priv->akeylen)
// memmove(&priv->key[priv->keylen],
// &priv->key[0],priv->akeylen);
/*These three are commented*/

memcpy(&priv->key[0], temp, priv->keylen);
pack->private = priv;
pack->modified |= ESP_MOD_KEY;
break;



case 'K': /* Authentication Key */
length = stringargument(arg, &temp);
priv->akeylen = length; // marked line(explained below)

priv = (esp_private *)realloc(priv,
sizeof(esp_private)+/*length*/priv->keylen+priv->akeylen);
/*this one edited too */


memcpy(&priv->key[priv->keylen/sizeof(u_int32_t)],
temp,priv->akeylen);
pack->private = priv;
pack->modified |= ESP_MOD_KEY;

现在有一个使用身份验证 key 值的函数。

函数的相关部分是-

    if (!epriv->akeylen) {
key = &fakekey;
keylen = 1;
} else {
key = (u_int8_t *)malloc(epriv->akeylen);
memcpy(key,&epriv->key[epriv->keylen/sizeof(u_int32_t)]
,epriv->akeylen);

现在,当我尝试运行以下程序时,出现了我不知道的错误。

     sendip: malloc.c:3574: mremap_chunk: Assertion `((size + offset)
& (mp_.pagesize-1)) == 0' failed.

我想可能是函数部分有错误,但我不确定到底是什么,因为当我评论标记行(上面提到的)时 akeylen 是空的所以采用该 fakekey 值和程序运行正常。

编辑 1:

我已经在三个地方编辑了代码(也在上面的代码中进行了编辑)。

现在程序可以运行,但会出现不一致的输出。

输入:

 Encryption key - qwerty

Authentication key - abcdef

输出:

  Encryption key - qwerab

Authentication key - abcdef

现在情况更清楚了。

它所指的问题肯定存在于realloc statements 。

请对此提出建议。

最初我在两个 realloc 语句中都添加了长度,但现在我首先将其更改为 priv->keylenpriv->keylen+priv-> akeylen 在第二个地方。

但还有一些地方需要改进

为什么这是覆盖???

最佳答案

由于 key[0] struct hack 似乎包含两个键的空间,因此您也需要为两者分配内存。在这两种情况下('k' 和 'K')

priv = realloc(priv, sizeof *priv +priv->keylen+priv->akeylen);

连接两个键时,最简单的方法是将 u_int32_t 键转换为字符指针并对其进行算术运算:

memcpy ( priv->key, source1, sizeofsource1);
/* and */
memcpy ( ((char*) priv->key) +priv->keylen, source2, sizeofsource2);

[和 memmove() 类似]可以删除程序中的其余强制转换。

关于c - 处理内存时出错 - mremap_chunk : Assertion ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7876273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com