gpt4 book ai didi

c - strrchr() 只会改变干草堆并忽略针,并且不会返回任何内容

转载 作者:行者123 更新时间:2023-11-30 15:19:15 26 4
gpt4 key购买 nike

我需要编写一个函数,该函数将从 HTTP 1.0 中的授权 header 获取 base64 字符串。因此,我写了这个函数:

char* getAuthenticate(char* buffer) {
const char* AuthorizationLine = calloc(1, sizeof(char));
char* BasePtr;
char* CodePtr = calloc(1, sizeof(char));

//Get Authoriztaion Header
if(strstr(buffer, "Authorization: ") != NULL) {
AuthorizationLine = strstr(buffer, "Authorization: ");
char Copy[strlen(AuthorizationLine)];
strcpy(Copy, AuthorizationLine);
AuthorizationLine = strtok(Copy, "\r\n");
}
else {
printf("Error - no valid Authorization Header");
return NULL;
}
//Set CodePtr to the base64 String
CodePtr = strrchr(AuthorizationLine, " ");
CodePtr = CodePtr +1;
return CodePtr;
}

通过在调试器中运行此函数,我发现在到达 CodePtr 部分之前一切都很好。一旦我执行CodePtr = strstr(AuthorizationLine, " ") ,我的授权行将充满废话,例如“\020Õÿÿÿ\177”。还有CodePtr甚至不受影响:它的地址仍然是 0x0直到我这样做+1 ,但那就只有 0x1并且 Eclipse 无法访问该地址处的内存。

那我做错了什么?我也尝试过strstr() ,但也没有成功。

最佳答案

你的函数泄漏了内存。它为一个 char 分配空间,并将指向该空间的指针分配给变量 AuthorizationLine,但随后为 AuthorizationLine 分配一个新值,而不释放分配的内存。您似乎不需要在这里分配任何内存。

您没有声明数组Copy足够大。您还需要为字符串终止符留出空间。因此,当您复制到该数组时,您会得到未定义的行为。

您将 AuthorizationLine 设置为指向数组 Copy 部分的指针,但该 Copy 之后立即超出范围,留下 AuthorizationLine 无效指针。

很有可能,strrchr()(或strstr())会覆盖 AuthorizationLine 指向的任何内存(堆栈上的某个位置)其局部变量的值。 strrchr() 返回一个 NULL 指针,因为当找不到指定的字符时它会执行此操作。

此外,您还返回一个指向局部变量的指针。这与 Copy 超出范围时出现的问题相同。

更新:

这个版本可以解决问题。请注意,它返回一个指向已分配内存的指针,调用者有义务在不再需要时释放该内存。

char* getAuthenticate(char* buffer) {
/* Get Authoriztaion Header */
const char* AuthorizationLine = strstr(buffer, "Authorization: ");

if (AuthorizationLine) {
/* extract the authorization token */
char* EndPtr = strstr(AuthorizationLine, "\r\n");
char* CodePtr;

if (!EndPtr) {
/* the header is the last thing in the buffer */
EndPtr = AuthorizationLine + strlen(AuthorizationLine) - 1;
}

/* ignore trailing whitespace */
while (isspace(*EndPtr)) {
EndPtr -= 1;
}
/* find the start of the authorization token */
for (CodePtr = EndPtr; !isspace(*CodePtr); CodePtr -= 1 ) {
if (CodePtr == AuthorizationLine) {
printf("Error - invalid authorization header\n");
return NULL;
}
}

/* allocate space and copy the token into it */
ptrdiff_t value_length = ++EndPtr - CodePtr++;
char *Copy = malloc(value_length + 1);

if (Copy) {
strncpy(Copy, CodePtr, value_length);
Copy[value_length] = '\0';
} else {
printf("Error - memory allocation failure\n");
}
return Copy;
} else {
printf("Error - no Authorization Header\n");
return NULL;
}
}

关于c - strrchr() 只会改变干草堆并忽略针,并且不会返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811537/

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