Tag: 缓冲区

为什么此代码中的缓冲区溢出与我的预期不同?

我有这个程序: #include #include #include void main(void) { char *buffer1 = malloc(sizeof(char)); char *buffer2 = malloc(sizeof(char)); strcpy(buffer2, “AA”); printf(“before: buffer1 %s\n”, buffer1); printf(“before: buffer2 %s\n”, buffer2); printf(“address, buffer1 %p\n”, &buffer1); printf(“address, buffer2 %p\n”, &buffer2); strcpy(buffer1, “BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB”); printf(“after: buffer1 %s\n”, buffer1); printf(“after: buffer2 %s\n”, buffer2); } 哪个印刷品: before: buffer1 before: buffer2 AA address, buffer1 0x7ffc700460d8 address, buffer2 […]

C中va_list可能存在缓冲区溢出漏洞?

我有以下代码: int ircsocket_print(char *message, …) { char buffer[512]; int iError; va_list va; va_start(va, message); vsprintf(buffer, message, va); va_end(va); send(ircsocket_connection, buffer, strlen(buffer), 0); return 1; } 我想知道这个代码是否通过向变量列表提供大小> 512的char数组来缓冲溢出? 如果是这样 – 我该如何解决这个问题? 谢谢。

如何使用Android NDK将整数颜色的像素数组绑定到纹理?

我正在尝试将Android上的Java OpenGL代码移植到Native SDK,我需要一个IntBuffer实现。 基本上我在Java中将任意整数RGBA像素颜色数组加载到纹理中是: // pixel array pixelIntArray = new int[width * height]; bb = ByteBuffer.allocateDirect(pixelIntArray.length * 4); bb.order(ByteOrder.nativeOrder()); // native buffer pixelBuffer = bb.asIntBuffer(); // push integer array of pixels into buffer pixelBuffer.put(pixelIntArray); pixelBuffer.position(0); // bind buffer to texture gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, width, height, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer); 在C中,我可以使用缓冲区将纹理推送到四边形。 目前我只是将它绑定到C中的pixelIntArray,纹理变形。 基本上我需要能够通过类似于Java的NIO类的缓冲区将整数像素数组中的一系列颜色绑定到纹理。

为什么使用4096个元素作为char数组缓冲区?

我找到了一个接受标准输入的程序 int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, “Usage: %s \n”, argv[0]); return 2; } /* we’re not going to worry about long lines */ char buf[4096]; // 4kibi while (!feof(stdin) && !ferror(stdin)) { // when given a file through input redirection, file becomes stdin if (!fgets(buf, sizeof(buf), stdin)) { […]

在程序中检测到缓冲区溢出,运行完美(显然)

在包含as,bs和cs的字符串上,我们可以执行以下操作。 我们可以取任意两个相邻的不同字符,并用第三个替换它们。 例如,’ab’减少为’c’,’ba’也减少为等等。 我写了这段代码,对t字符串执行以下操作(t <= 100),字符串的最大长度= 100 #include #include #include int redlen(char string[100][100], int x) { int g, checker; checker = 1; for(; checker; ) { checker = 0; for(int i = 0;string[x][i]!=’\0′; i++) { if((string[x][i]==’a’ && string[x][i+1]==’b’) || (string[x][i]==’b’ && string[x][i+1]==’a’)) { string[x][i]=’c’; checker = 1; for(g = i+1; string[x][g]!=’\0′; g++) { string[x][g]=string[x][g+1]; } […]

mmap vs O_DIRECT用于随机读取(涉及的缓冲区是什么?)

我正在实现一个支持大量密钥(2600万)的基于磁盘的哈希表。 该值被反序列化。 读取在整个文件中基本上是随机的,值小于页面大小,我正在针对SSD进行优化。 安全性/一致性不是那么大的问题(性能问题)。 我目前的解决方案涉及使用带有MADV_RANDOM | MADV_DONTNEED的mmap()文件 MADV_RANDOM | MADV_DONTNEED设置为禁用内核预取,仅根据需要按需加载数据。 我认为内核从磁盘读取到内存缓冲区,我从那里反序列化。 O_DIRECT怎么样? 如果我调用read() ,我仍然会复制到缓冲区(我反序列化),那么我可以获得任何优势吗? 在哪里可以找到有关mmap()文件所涉及的缓冲区的更多信息,并在使用O_DIRECT打开的文件上调用read() ? 我对提前读取或缓存不感兴趣。 它对我的用例没有任何帮助。

从套接字读取缓冲区

我在c中编写简单的服务器/客户端,其中server临时存储来自客户端的消息,并在客户端请求时检索它。 问题是当客户端从服务器接收消息时,缓冲区行为有点奇怪。 我所做的只是从服务器接收并在屏幕上打印它,但不知何故缓冲区被覆盖超过最大缓冲区大小 在客户端 while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0) { if(byteRead <= 0) break; printf("%s", buffer); } 其中MAXBUF是256.它保留了一些垃圾,所以我检查了缓冲区中的字符串大小,令人惊讶 printf(“%d READ vs %d buffer strlen \n”, byteRead, strlen(buffer)) 告诉我byteRead是256但缓冲区的字符串长度是262。 任何的想法?? 服务器端的Ps,它正确读取文件并将其发送到套接字。

C – 直接从键盘缓冲区读取

这是C编程语言中的一个问题。 如何直接读取键盘缓冲区中的数据? 我想直接访问数据并将其存储在变量中。 变量应该是什么数据类型? 我需要它用于我们研究所正在开发的操作系统。 它被称为ICS-OS,我不太清楚具体细节。 它运行在x86,32位机器上(我们在Linux机器上的QEMU上运行它)。 以下是Google Code http://code.google.com/p/ics-os/的链接。 我希望这些信息足够充分。 操作系统不支持conio.h库,因此kbhit不是一个选项。

fopen’d文件的默认输入和输出缓冲?

因此,FILE流可以同时具有输入和输出缓冲区。 您可以使用setvbuf调整输出流(我不知道任何使用输入缓冲区大小和行为的方法)。 此外,默认情况下缓冲区是BUFSIZ (不确定这是POSIX还是C的东西)。 很明显这对stdin / stdout / stderr意味着什么,但新打开文件的默认值是什么? 它们是否针对输入和输出进行缓冲? 或者也许只有一个? 如果它是缓冲的,输出默认为阻塞或行模式吗? 编辑:我已经做了一些测试,看看Jonathan Leffler的回答如何影响现实世界的节目。 看来,如果你做了一个读,那么写。 写入将导致输入缓冲区的未使用部分完全丢弃。 事实上,将会有一些寻求将事物保持在正确的文件偏移量。 我用这个简单的测试程序: /* input file contains “ABCDEFGHIJKLMNOPQRSTUVWXYZ” */ #include #include int main() { FILE *f = fopen(“test.txt”, “r+b”); char ch; fread(&ch, 1, 1, f); fwrite(“test”, 4, 1, f); fclose(f); return 0; } 导致以下系统调用: read(3, “ABCDEFGHIJKLMNOPQRSTUVWXYZ\n”, 4096) = 27 // […]

黑客挑战 – 在代码中查找漏洞

我的朋友最近完成了一次黑客挑战并将其发送给我(二进制和源代码)。 我之前想问他提示,因为我想自己做:) 我一直在经历它,但我正在努力找到这个漏洞。 #include #include #include #include static void usage(const char *argv0) { printf(“Build your own string!\n”); printf(“\n”); printf(“Usage:\n”); printf(” %s length command…\n”, argv0); printf(“\n”); printf(“Each command consist of a single character followed by it’s index.\n”); printf(“\n”); printf(“Example:\n”); printf(” %s 11 h0 e1 l2 l3 o4 w6 o7 r8 l9 d10\n”, argv0); exit(1); } int […]