Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

swoole_client 异步开启open_length_check 时在极端情况下会出现core问题 #828

Closed
badxpgy opened this issue Aug 23, 2016 · 1 comment

Comments

@badxpgy
Copy link

badxpgy commented Aug 23, 2016

core信息:

#0  0x0000003154230265 in raise () from /lib64/libc.so.6
#1  0x0000003154231d10 in abort () from /lib64/libc.so.6
#2  0x0000003154229706 in __assert_fail () from /lib64/libc.so.6
#3  0x00002b1cbba7b736 in swProtocol_recv_check_length (protocol=0x2b1cb8265620, conn=0x2b1cb8007520, buffer=0x6815620)
    at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/protocol/Base.c:241
#4  0x00002b1cbba6fc2e in swClient_onStreamRead (reactor=<value optimized out>, event=0x7fff2f135020)
    at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/network/Client.c:640
#5  0x00002b1cbba6a3ae in swReactorEpoll_wait (reactor=0x6804fd0, timeo=<value optimized out>) at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/reactor/ReactorEpoll.c:258
#6  0x00002b1cbba7827b in swWorker_loop (factory=<value optimized out>, worker_id=<value optimized out>)
    at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/network/Worker.c:496
#7  0x00002b1cbba75690 in swManager_spawn_worker (factory=0x67f4e60, worker_id=0) at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/network/Manager.c:679
#8  0x00002b1cbba76159 in swManager_start (factory=0x67f4e60) at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/network/Manager.c:143
#9  0x00002b1cbba676c2 in swFactoryProcess_start (factory=0x67f4e60) at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/factory/FactoryProcess.c:86
#10 0x00002b1cbba6cb6e in swServer_start (serv=0x67f4a30) at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/network/Server.c:645
#11 0x00002b1cbba40efe in zim_swoole_server_start (execute_data=<value optimized out>, return_value=0x2b1cb8213180)
    at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/swoole_server.c:1799
#12 0x000000000089f888 in ZEND_DO_FCALL_SPEC_HANDLER (execute_data=0x2b1cb8213030) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/Zend/zend_vm_execute.h:842
#13 0x00000000008680d0 in execute_ex (ex=<value optimized out>) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/Zend/zend_vm_execute.h:417
#14 0x00000000008ba75b in zend_execute (op_array=0x2b1cb826b0e0, return_value=<value optimized out>) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/Zend/zend_vm_execute.h:458
#15 0x0000000000826e23 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/Zend/zend.c:1427
#16 0x00000000007c85c0 in php_execute_script (primary_file=0x7fff2f138760) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/main/main.c:2484
#17 0x00000000008bedf9 in do_cli (argc=2, argv=0x662ec90) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/sapi/cli/php_cli.c:974
#18 0x00000000008bf55a in main (argc=2, argv=0x662ec90) at /data/wwwroot/swoole_server/extensions/online/php-7.0.4/sapi/cli/php_cli.c:1345
(gdb) f 3
#3  0x00002b1cbba7b736 in swProtocol_recv_check_length (protocol=0x2b1cb8265620, conn=0x2b1cb8007520, buffer=0x6815620)
    at /data/wwwroot/swoole_server/extensions/online/swoole-src-1.8.7-stable-bydev/src/protocol/Base.c:241
241                     assert(remaining_length < sizeof(swap));
(gdb) list
236 
237                     printf("3package_length=%d,buffer=%d\n",package_length,buffer->length);
238                 int remaining_length = buffer->length - buffer->offset;
239                 if (remaining_length > 0)
240                 {
241                     assert(remaining_length < sizeof(swap));
242                     memcpy(swap, buffer->str + buffer->offset, remaining_length);
243                     memcpy(buffer->str, swap, remaining_length);
244                     buffer->offset = 0;
245                     buffer->length = remaining_length;`

重现代码:

$client = false;
$serv = new swoole_server("0.0.0.0", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$serv->set(array('worker_num' => 1));
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    $data1 = str_repeat('B', 5) . pack('s', 1) . str_repeat('B', 1);
    $data2 = str_repeat('B', 5) . pack('s', 30000) . str_repeat('B', 30000);
    $serv->send($fd, $data1 . $data2 . $data2);
});
$serv->on('close', function ($serv, $fd) {

});
$serv->on('connect', function ($serv, $fd) {

});

$serv->on('WorkerStart', function ($serv, $worker_id) {
    $serv->after(1000, function() {
        global $client;
        if (!$client) {
            $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
            $client->set(
                    ['open_length_check' => true,
                        'package_length_type' => 's',
                        'package_length_offset' => 5,
                        'package_body_offset' => 7]
            );
            $client->on('connect', function (swoole_client $socket) {
                $data1 = str_repeat('B', 5) . pack('s', 1) . str_repeat('B', 1);
                $socket->send($data1);
            });
            $client->on('receive', function (swoole_client $socket, $data) {
                var_dump(strlen($data));
            });
            $client->on('close', function (swoole_client $socket) {

            });
            $client->on('error', function (swoole_client $socket) {

            });
            $client->connect("127.0.0.1", 9501);
        }
    });
});
$serv->start();
@badxpgy
Copy link
Author

badxpgy commented Aug 23, 2016

应该是我的问题,忽略

@badxpgy badxpgy closed this as completed Aug 23, 2016
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant