x86-64汇编提取HTTP请求路径为空,open系统调用失败求助
问题分析与修复
你的汇编代码存在两个关键问题,直接导致提取的路径为空:
1. 未处理GET与路径之间的连续空格
HTTP请求中,方法(GET)与路径之间可能存在多个空格(比如用户输入或代理转发时的格式问题)。你的代码在找到第一个空格后仅将rcx加1就开始复制,若此时指向的仍是空格,copy_path会立即触发done_copy,导致没有任何字符被复制到path_buffer。
2. 潜在的未初始化指针问题
如果HTTP请求中不存在空格(尽管你确认请求正确,但代码鲁棒性不足),find_first_space会因遇到字符串结束符(NULL)直接跳转到done_copy,此时rdi未被赋值(仅在start_copy中初始化),执行mov byte ptr [rdi + rdx], 0会向未知内存地址写入NULL,可能引发崩溃或数据损坏。
修复后的代码
lea rsi, [read_buffer] ; <- HTTP request xor rcx, rcx find_first_space: mov al, byte [rsi + rcx] test al, al jz invalid_request ; 无空格的情况直接标记无效 cmp al, ' ' je skip_spaces inc rcx jmp find_first_space ; 跳过GET之后的所有连续空格 skip_spaces: inc rcx mov al, byte [rsi + rcx] test al, al jz invalid_request cmp al, ' ' je skip_spaces ; 开始复制路径 lea rdi, [path_buffer] xor rdx, rdx copy_path: mov al, byte [rsi + rcx] test al, al jz done_copy cmp al, ' ' je done_copy mov byte [rdi + rdx], al inc rdx inc rcx jmp copy_path done_copy: mov byte ptr [rdi + rdx], 0 jmp end_process invalid_request: ; 处理无效请求的逻辑,比如清空path_buffer lea rdi, [path_buffer] mov byte ptr [rdi], 0 end_process:
关键修正点
- 添加
skip_spaces循环:找到第一个空格后,持续跳过后续所有连续空格,直到遇到非空格字符(路径的起始)或字符串结束。 - 增加
invalid_request分支:处理无空格的异常情况,确保path_buffer被正确初始化,避免野指针操作。
内容的提问来源于stack exchange,提问作者S7AN




