mirror of
				https://github.com/coturn/coturn.git
				synced 2025-11-04 00:41:02 +01:00 
			
		
		
		
	Fix memcpy len checks stun_is_challenge_response_str (#1280)
Add missing checks for length of realm/nonce/server_name before copying those values to the buffer passed to stun_is_challenge_response_str. The function stun_is_challenge_response_str is only used in uclient test application. Thank you very much @0xdea Co-authored-by: Gustavo Garcia <gustavogb@mail.com>
This commit is contained in:
		
							parent
							
								
									17e3b81a36
								
							
						
					
					
						commit
						4e0d21e1b5
					
				@ -96,6 +96,10 @@ int is_secure_string(const uint8_t *string, int sanitizesql);
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#if !defined(min)
 | 
			
		||||
#define min(a, b) ((a) <= (b) ? (a) : (b))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,7 @@
 | 
			
		||||
///////////// Security functions implementation from ns_turn_msg.h ///////////
 | 
			
		||||
 | 
			
		||||
#include "ns_turn_openssl.h"
 | 
			
		||||
#include "ns_turn_utils.h"
 | 
			
		||||
 | 
			
		||||
///////////
 | 
			
		||||
 | 
			
		||||
@ -546,24 +547,23 @@ int stun_is_challenge_response_str(const uint8_t *buf, size_t len, int *err_code
 | 
			
		||||
  int ret = stun_is_error_response_str(buf, len, err_code, err_msg, err_msg_size);
 | 
			
		||||
 | 
			
		||||
  if (ret && (((*err_code) == 401) || ((*err_code) == 438))) {
 | 
			
		||||
 | 
			
		||||
    stun_attr_ref sar = stun_attr_get_first_by_type_str(buf, len, STUN_ATTRIBUTE_REALM);
 | 
			
		||||
    if (sar) {
 | 
			
		||||
 | 
			
		||||
      int found_oauth = 0;
 | 
			
		||||
 | 
			
		||||
      const uint8_t *value = stun_attr_get_value(sar);
 | 
			
		||||
      if (value) {
 | 
			
		||||
        size_t vlen = (size_t)stun_attr_get_len(sar);
 | 
			
		||||
        vlen = min(vlen, STUN_MAX_REALM_SIZE);
 | 
			
		||||
        memcpy(realm, value, vlen);
 | 
			
		||||
        realm[vlen] = 0;
 | 
			
		||||
 | 
			
		||||
        {
 | 
			
		||||
          sar = stun_attr_get_first_by_type_str(buf, len, STUN_ATTRIBUTE_THIRD_PARTY_AUTHORIZATION);
 | 
			
		||||
          if (sar) {
 | 
			
		||||
            value = stun_attr_get_value(sar);
 | 
			
		||||
            if (value) {
 | 
			
		||||
              vlen = (size_t)stun_attr_get_len(sar);
 | 
			
		||||
              vlen = min(vlen, STUN_MAX_SERVER_NAME_SIZE);
 | 
			
		||||
              if (vlen > 0) {
 | 
			
		||||
                if (server_name) {
 | 
			
		||||
                  memcpy(server_name, value, vlen);
 | 
			
		||||
@ -579,6 +579,7 @@ int stun_is_challenge_response_str(const uint8_t *buf, size_t len, int *err_code
 | 
			
		||||
          value = stun_attr_get_value(sar);
 | 
			
		||||
          if (value) {
 | 
			
		||||
            vlen = (size_t)stun_attr_get_len(sar);
 | 
			
		||||
            vlen = min(vlen, STUN_MAX_NONCE_SIZE);
 | 
			
		||||
            memcpy(nonce, value, vlen);
 | 
			
		||||
            nonce[vlen] = 0;
 | 
			
		||||
            if (oauth) {
 | 
			
		||||
 | 
			
		||||
@ -3165,10 +3165,6 @@ static int create_challenge_response(ts_ur_super_session *ss, stun_tid *tid, int
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(min)
 | 
			
		||||
#define min(a, b) ((a) <= (b) ? (a) : (b))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void resume_processing_after_username_check(int success, int oauth, int max_session_time, hmackey_t hmackey,
 | 
			
		||||
                                                   password_t pwd, turn_turnserver *server, uint64_t ctxkey,
 | 
			
		||||
                                                   ioa_net_data *in_buffer, uint8_t *realm) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user