mirror of
				https://github.com/zeromq/libzmq.git
				synced 2025-10-30 05:29:43 +01:00 
			
		
		
		
	Fixed issue with req assertions (issue 252)
Signed-off-by: Mikko Koppanen <mkoppanen@php.net> Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
This commit is contained in:
		 Mikko Koppanen
					Mikko Koppanen
				
			
				
					committed by
					
						 Martin Sustrik
						Martin Sustrik
					
				
			
			
				
	
			
			
			 Martin Sustrik
						Martin Sustrik
					
				
			
						parent
						
							e191e806ea
						
					
				
				
					commit
					8f8bfcaba0
				
			| @@ -89,8 +89,13 @@ int zmq::req_t::xrecv (msg_t *msg_, int flags_) | |||||||
|         int rc = xreq_t::xrecv (msg_, flags_); |         int rc = xreq_t::xrecv (msg_, flags_); | ||||||
|         if (rc != 0) |         if (rc != 0) | ||||||
|             return rc; |             return rc; | ||||||
|         zmq_assert (msg_->flags () & msg_t::label); |  | ||||||
|         zmq_assert (msg_->size () == 4); |         // TODO: This should also close the connection with the peer! | ||||||
|  |         if (unlikely (!(msg_->flags () & msg_t::label) || msg_->size () != 4)) { | ||||||
|  |             errno = EAGAIN; | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |          | ||||||
|         unsigned char *data = (unsigned char*) msg_->data (); |         unsigned char *data = (unsigned char*) msg_->data (); | ||||||
|         if (unlikely (get_uint32 (data) != request_id)) { |         if (unlikely (get_uint32 (data) != request_id)) { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ noinst_PROGRAMS = test_pair_inproc \ | |||||||
|                   test_hwm \ |                   test_hwm \ | ||||||
|                   test_reqrep_device \ |                   test_reqrep_device \ | ||||||
|                   test_reqrep_drop \ |                   test_reqrep_drop \ | ||||||
|                   test_sub_forward |                   test_sub_forward \ | ||||||
|  |                   test_invalid_rep | ||||||
|  |  | ||||||
| if !ON_MINGW | if !ON_MINGW | ||||||
| noinst_PROGRAMS += test_shutdown_stress \ | noinst_PROGRAMS += test_shutdown_stress \ | ||||||
| @@ -25,6 +26,7 @@ test_hwm_SOURCES = test_hwm.cpp | |||||||
| test_reqrep_device_SOURCES = test_reqrep_device.cpp | test_reqrep_device_SOURCES = test_reqrep_device.cpp | ||||||
| test_reqrep_drop_SOURCES = test_reqrep_drop.cpp | test_reqrep_drop_SOURCES = test_reqrep_drop.cpp | ||||||
| test_sub_forward_SOURCES = test_sub_forward.cpp | test_sub_forward_SOURCES = test_sub_forward.cpp | ||||||
|  | test_invalid_rep_SOURCES = test_invalid_rep.cpp | ||||||
|  |  | ||||||
| if !ON_MINGW | if !ON_MINGW | ||||||
| test_shutdown_stress_SOURCES = test_shutdown_stress.cpp | test_shutdown_stress_SOURCES = test_shutdown_stress.cpp | ||||||
|   | |||||||
							
								
								
									
										85
									
								
								tests/test_invalid_rep.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								tests/test_invalid_rep.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | /* | ||||||
|  |     Copyright (c) 2007-2011 iMatix Corporation | ||||||
|  |     Copyright (c) 2007-2011 Other contributors as noted in the AUTHORS file | ||||||
|  |  | ||||||
|  |     This file is part of 0MQ. | ||||||
|  |  | ||||||
|  |     0MQ is free software; you can redistribute it and/or modify it under | ||||||
|  |     the terms of the GNU Lesser General Public License as published by | ||||||
|  |     the Free Software Foundation; either version 3 of the License, or | ||||||
|  |     (at your option) any later version. | ||||||
|  |  | ||||||
|  |     0MQ is distributed in the hope that it will be useful, | ||||||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |     GNU Lesser General Public License for more details. | ||||||
|  |  | ||||||
|  |     You should have received a copy of the GNU Lesser General Public License | ||||||
|  |     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #include "../include/zmq.h" | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
|  | int main (int argc, char *argv []) | ||||||
|  | { | ||||||
|  |     //  Create REQ/XREP wiring. | ||||||
|  |     void *ctx = zmq_init (1); | ||||||
|  |     assert (ctx); | ||||||
|  |     void *xrep_socket = zmq_socket (ctx, ZMQ_XREP); | ||||||
|  |     assert (xrep_socket); | ||||||
|  |     void *req_socket = zmq_socket (ctx, ZMQ_REQ); | ||||||
|  |     assert (req_socket); | ||||||
|  |     int linger = 0; | ||||||
|  |     int rc = zmq_setsockopt (xrep_socket, ZMQ_LINGER, &linger, sizeof (int)); | ||||||
|  |     assert (rc == 0); | ||||||
|  |     rc = zmq_setsockopt (req_socket, ZMQ_LINGER, &linger, sizeof (int)); | ||||||
|  |     assert (rc == 0); | ||||||
|  |     rc = zmq_bind (xrep_socket, "inproc://hi"); | ||||||
|  |     assert (rc == 0); | ||||||
|  |     rc = zmq_connect (req_socket, "inproc://hi"); | ||||||
|  |     assert (rc == 0); | ||||||
|  |  | ||||||
|  |     //  Initial request. | ||||||
|  |     rc = zmq_send (req_socket, "r", 1, 0); | ||||||
|  |     assert (rc == 1); | ||||||
|  |  | ||||||
|  |     //  Receive the request. | ||||||
|  |     char addr [4]; | ||||||
|  |     char seqn [4]; | ||||||
|  |     char body [1]; | ||||||
|  |     rc = zmq_recv (xrep_socket, addr, sizeof (addr), 0); | ||||||
|  |     assert (rc == 4); | ||||||
|  |     rc = zmq_recv (xrep_socket, seqn, sizeof (seqn), 0); | ||||||
|  |     assert (rc == 4); | ||||||
|  |     rc = zmq_recv (xrep_socket, body, sizeof (body), 0); | ||||||
|  |     assert (rc == 1); | ||||||
|  |  | ||||||
|  |     //  Send invalid reply. | ||||||
|  |     rc = zmq_send (xrep_socket, addr, 4, 0); | ||||||
|  |     assert (rc == 4); | ||||||
|  |  | ||||||
|  |     //  Send valid reply. | ||||||
|  |     rc = zmq_send (xrep_socket, addr, 4, ZMQ_SNDLABEL); | ||||||
|  |     assert (rc == 4); | ||||||
|  |     rc = zmq_send (xrep_socket, seqn, 4, ZMQ_SNDLABEL); | ||||||
|  |     assert (rc == 4); | ||||||
|  |     rc = zmq_send (xrep_socket, "b", 1, 0); | ||||||
|  |     assert (rc == 1); | ||||||
|  |  | ||||||
|  |     //  Check whether we've got the valid reply. | ||||||
|  |     rc = zmq_recv (req_socket, body, sizeof (body), 0); | ||||||
|  |     assert (rc == 1); | ||||||
|  | 	assert (body [0] == 'b'); | ||||||
|  |  | ||||||
|  |     //  Tear down the wiring. | ||||||
|  |     rc = zmq_close (xrep_socket); | ||||||
|  |     assert (rc == 0); | ||||||
|  |     rc = zmq_close (req_socket); | ||||||
|  |     assert (rc == 0); | ||||||
|  |     rc = zmq_term (ctx); | ||||||
|  |     assert (rc == 0); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user