Подробности

[В начало]

Проблема в реализации № S0522

Краткое описание

Функция mmap() не сигнализирует об ошибке при попытке установить отображение нулевой длины

Подробное описание

Функция mmap() отображает данные, специфицированные дескриптором, в память процесса. Длина отображения устанавливается параметром функции.

Согласно POSIX, если этот параметр 0, то функция должна вернуть специальное значение, сигнализирующее об ошибке, и установить errno в EINVAL. Но в реализации функции на Linux этого не происходит.

Раздел стандарта

Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.4. Data Definitions for libc, description of mmap() function, который ссылается на The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition (SUS 3.0), System Interfaces, description of function mmap().

Пример

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

void * printResAndErrno( void * res, const char * funcName, const char * funcArgs ) {
    int savedErrno = errno;
    printf( "%s%s is %p\n", funcName, funcArgs, res );
    printf( "after %s( ... ) errno is %d ( %s )\n", funcName, savedErrno, strerror( savedErrno ) );
    return res;
}

#define callPrintResAndErrno( func, pars ) printResAndErrno( ( errno = 0, func pars ), #func, #pars )

int main( int argc, char ** argv ) {
    void * res;
    int savedErrno;
    // prepare file bug522.data
    int file = open( "bug522.data", O_WRONLY | O_CREAT );
    int i;
    for ( i = 0; i < 1024; i += 16 ) { write( file, "0123456789ABCDEF", 16 ); }
    close( file );
    if ( ( file = open( "bug522.data", O_RDWR ) ) == -1 ) {
        printf( "can not create and open file bug522.data\n" );
    } else {
        // find error
        if ( callPrintResAndErrno( mmap, ( 0, 0, PROT_READ, MAP_PRIVATE, file, 0 ) ) != MAP_FAILED ) {
            // error found
            printf( "error : mmap( ... ) is not MAP_FAILED\n" );
        } else {
            // error not found
            printf( "no error : mmap( ... ) is MAP_FAILED\n" );
        }
    } // if ( ( file = open( "bug522.data", O_RDWR ) ) == -1 )
    return 0;
}

Компонент

linux-kernel 2.6.12-rc1 or early

Ссылки

Summary of changes from v2.6.12-rc1 to v2.6.12-rc2, [PATCH] fix mmap() return value to conform POSIX

Статус

Исправлено в kernel 2.6.12-rc2

[В начало]