Missing byte reordering when transferring data

Различный порядок байтов хоста и сети

Описание

Этот дефект происходит, когда вы не используете функцию порядка байтов:

  • Перед передающими данными к сетевому сокету.

  • После получения данных из сетевого сокета.

Риск

Некоторые архитектуры системы реализуют порядок байтов с прямым порядком байтов (младший значащий байт сначала), и другие системы реализуют обратный порядок байтов (старший значащий байт сначала). Если порядок байтов отправленных данных не совпадает с порядком байтов системы получения, значение, возвращенное, когда чтение данных является неправильным.

Фиксация

После получения данных из сокета используйте функцию порядка байтов, такую как ntohl(). Перед передающими данными к сокету используйте функцию порядка байтов, такую как htonl() .

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>


unsigned int func(int sock, int server)
{
    unsigned int num;   /* assume int is 32-bits */
    if (server)
    {
        /* Server side */
        num = 0x17;
		/* Endianness of server host may not match endianness of network. */
        if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num)) 
        {
            /* Handle error */
        }
        return 0;
    }
    else {
        /* Endianness of client host may not match endianness of network. */
        if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num))  
        {
            /* Handle error */
        }
		
		/* Comparison may be inaccurate */
        if (num> 255)  
        {
            return 255;
        }
        else
        {
            return num;
        }
    }
}
        
      

В этом примере, переменной num присвоен шестнадцатеричное значение 0x17 и отправляется по сети клиенту с сервера. Если хост сервера является прямым порядком байтов, и сеть является обратным порядком байтов, num передается как 0x17000000. Клиент затем читает неправильное значение для num и сравнивает его с локальным числовым значением.

Коррекция — использует функцию порядка байтов

Прежде, чем отправить num от хоста сервера используйте htonl() преобразовывать от хоста до сетевого порядка байтов. Точно так же прежде, чем считать num на хосте клиента используйте ntohl() преобразовывать от сети, чтобы разместить порядок байтов.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>

unsigned int func(int sock, int server)
{
    unsigned int num;   /* assume int is 32-bits */
    if (server)
    {
        /* Server side */
        num = 0x17;
		
		/* Convert to network byte order. */
        num = htonl(num); 
        if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num)) 
        {
            /* Handle error */
        }
        return 0;
    }
    else {
        if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num)) 
        {
            /* Handle error */
        }
		
		/* Convert to host byte order. */
        num = ntohl(num); 
        if (num > 255) 
        {
            return 255;
        }
        else
        {
            return num;
        }
    }
} 

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: MISSING_BYTESWAP
Удар: носитель
ID CWE: 188, 198

Введенный в R2017b