Comments (21)
谢谢报告,稍晚看一下。
from cinatra.
hi,我在使用cinatra的時候會遇到一些問題,在http read request的時候body會有髒數據,檢查了一下發現發生問題的地方出在details::resize中,gcc的resize_and_overwrite貌似會返回capacity,在stackoverflow中有討論,并且gcc bugzilla也有提到。 我使用的環境爲ubuntu 22.04 / gcc 13.2/ cinatra 0.8.3 感謝。
我们现在没有用到这个函数提供的sz啊
from cinatra.
有测试代码?需要复现查问题。
from cinatra.
cinatra這裏用到了resize,裏面是用std::base_string::resize_and_overwrite進行string的内存擴展(std=c++23),作者的blog也有提到,測試代碼
from cinatra.
问题是我们不会用到返回值
from cinatra.
所以问题出在别的地方。
你能否提供一段测试代码?
from cinatra.
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
from cinatra.
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
實際上設置成了30-> 指的是string的容量?
from cinatra.
是的,string.size()是大於body_len的,但是後面沒有/0,所以外面可能讀出髒數據
from cinatra.
是的,string.size()是大於body_len的,但是後面沒有/0,所以外面可能讀出髒數據
你指的是string::size()大于body_len还是string::capacity()大于body_len
from cinatra.
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
我理解,代码期望的行为可能是,
1.body_len==25, size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
如果出问题,可能是:
2. body_len==25, size()==25, capacity()==30,但是data[25]是脏数据而不是\0
3. body_len==25, size()==30, capacity()==30.
在你的测试代码中是哪种情况呢?
from cinatra.
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。
現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。
不知道我是否描述清楚了。
from cinatra.
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。 現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。 不知道我是否描述清楚了。
from cinatra.
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。 現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。 不知道我是否描述清楚了。
這時候的size預期設置爲25,但是實際上設置成了30,在後面使用memcpy沒有#0,導致多出來的内存可能被外面讀成髒數據。
我理解,代码期望的行为可能是,size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
是的這個行爲是正常的,但是在使用memcpy的時候僅拷貝了body_len爲25的字節,後面沒有\0,就變成了5個字節的髒數據。 現在是bodylen是25,size()是30,capacity()是30,使用memcpy拷貝了25字節,應該是拷貝25+1個字節,把\0算上。 不知道我是否描述清楚了。
所以是这三种情况的哪一种呢?
from cinatra.
1.body_len==25, size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。
2. body_len==25, size()==25, capacity()==30,但是data[25]是脏数据而不是\0
3. body_len==25, size()==30, capacity()==30.
from cinatra.
1.body_len==25, size()==25, capacity()==30,然后data[25]=='\0',后面跟4个字节的脏数据。这是正常的。 2. body_len==25, size()==25, capacity()==30,但是data[25]是脏数据而不是\0 3. body_len==25, size()==30, capacity()==30.
- body_len==25, size()==30, capacity()==30, 但是data[25]是脏数据而不是\0
from cinatra.
能给个测试cinara的代码吗,先不纠结resize这里,我希望有个实际的例子能复现问题。@hoskylucky
from cinatra.
我懂了,等下会提一个pr fix
from cinatra.
https://godbolt.org/z/EefoE751z
我理解问题以及修复方案是这样的
from cinatra.
用这个pr #512
验证一下
@hoskylucky
from cinatra.
這樣就沒問題了,感謝。
from cinatra.
Related Issues (20)
- refactor cinatra server to support c++20 coroutine HOT 4
- 编译报错,‘_M_set_length’ is not a member of ‘std::string’ HOT 5
- 如何使用已有的io_context运行cinatra HOT 1
- 如何获取coro_http_client调接口 耗时 HOT 3
- Highly concurrent downloading of 2m js files will increase memory usage HOT 1
- websocket,1分钟没有消息交互,服务端会主动把链接掐断 HOT 2
- Windows visit Chinese filename not found
- 请问下,考虑支持unix套接字吗. HOT 10
- 是否可以让server对象的listen函数支持设置连接队列的长度? HOT 6
- fatal error: 'asio/dispatch.hpp' file not found HOT 2
- https question HOT 18
- Failed to connect websocket with `Connection: upgrade` HOT 3
- [需求] 处理程序相关 HOT 12
- client URL 检测 的奇怪 bug HOT 7
- 上传二进制文件无法使用 HOT 2
- async_download 没有写入内容到文件 HOT 5
- 请问下,当链接断开时,如何获取到具体原因? HOT 3
- 【错误与需求】Nginx与chunked模式 HOT 16
- Access-Control-Allow-Origin
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cinatra.