You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动