Подробности
[В начало]
Проблема в реализации № 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
[В начало]