@@ -358,37 +358,26 @@ reader_parse_frame_table(BinaryReader *reader, const uint8_t *data, size_t file_
358358}
359359
360360BinaryReader *
361- binary_reader_open (const char * filename )
361+ binary_reader_open (PyObject * path )
362362{
363363 BinaryReader * reader = PyMem_Calloc (1 , sizeof (BinaryReader ));
364364 if (!reader ) {
365365 PyErr_NoMemory ();
366366 return NULL ;
367367 }
368368
369- #if USE_MMAP
370- reader -> fd = -1 ; /* Explicit initialization for cleanup safety */
371- #endif
372-
373- reader -> filename = PyMem_Malloc (strlen (filename ) + 1 );
374- if (!reader -> filename ) {
375- PyMem_Free (reader );
376- PyErr_NoMemory ();
377- return NULL ;
378- }
379- strcpy (reader -> filename , filename );
380-
381369#if USE_MMAP
382370 /* Open with mmap on Unix */
383- reader -> fd = open (filename , O_RDONLY );
384- if (reader -> fd < 0 ) {
385- PyErr_SetFromErrnoWithFilename (PyExc_IOError , filename );
371+ FILE * fp = Py_fopen (path , "rb" );
372+ if (!fp ) {
386373 goto error ;
387374 }
375+ int fd = fileno (fp );
388376
389377 struct stat st ;
390- if (fstat (reader -> fd , & st ) < 0 ) {
378+ if (fstat (fd , & st ) < 0 ) {
391379 PyErr_SetFromErrno (PyExc_IOError );
380+ Py_fclose (fp );
392381 goto error ;
393382 }
394383 reader -> mapped_size = st .st_size ;
@@ -400,14 +389,15 @@ binary_reader_open(const char *filename)
400389 */
401390#ifdef __linux__
402391 reader -> mapped_data = mmap (NULL , reader -> mapped_size , PROT_READ ,
403- MAP_PRIVATE | MAP_POPULATE , reader -> fd , 0 );
392+ MAP_PRIVATE | MAP_POPULATE , fd , 0 );
404393#else
405394 reader -> mapped_data = mmap (NULL , reader -> mapped_size , PROT_READ ,
406- MAP_PRIVATE , reader -> fd , 0 );
395+ MAP_PRIVATE , fd , 0 );
407396#endif
408397 if (reader -> mapped_data == MAP_FAILED ) {
409398 reader -> mapped_data = NULL ;
410399 PyErr_SetFromErrno (PyExc_IOError );
400+ Py_fclose (fp );
411401 goto error ;
412402 }
413403
@@ -428,19 +418,20 @@ binary_reader_open(const char *filename)
428418
429419 /* Add file descriptor-level hints for better kernel I/O scheduling */
430420#if defined(__linux__ ) && defined(POSIX_FADV_SEQUENTIAL )
431- (void )posix_fadvise (reader -> fd , 0 , 0 , POSIX_FADV_SEQUENTIAL );
421+ (void )posix_fadvise (fd , 0 , 0 , POSIX_FADV_SEQUENTIAL );
432422 if (reader -> mapped_size > (64 * 1024 * 1024 )) {
433- (void )posix_fadvise (reader -> fd , 0 , 0 , POSIX_FADV_WILLNEED );
423+ (void )posix_fadvise (fd , 0 , 0 , POSIX_FADV_WILLNEED );
434424 }
435425#endif
436426
427+ (void )Py_fclose (fp );
428+
437429 uint8_t * data = reader -> mapped_data ;
438430 size_t file_size = reader -> mapped_size ;
439431#else
440432 /* Use stdio on Windows */
441- reader -> fp = fopen ( filename , "rb" );
433+ reader -> fp = Py_fopen ( path , "rb" );
442434 if (!reader -> fp ) {
443- PyErr_SetFromErrnoWithFilename (PyExc_IOError , filename );
444435 goto error ;
445436 }
446437
@@ -1263,8 +1254,6 @@ binary_reader_close(BinaryReader *reader)
12631254 return ;
12641255 }
12651256
1266- PyMem_Free (reader -> filename );
1267-
12681257#if USE_MMAP
12691258 if (reader -> mapped_data ) {
12701259 munmap (reader -> mapped_data , reader -> mapped_size );
@@ -1274,13 +1263,9 @@ binary_reader_close(BinaryReader *reader)
12741263 /* Clear sample_data which may point into the now-unmapped region */
12751264 reader -> sample_data = NULL ;
12761265 reader -> sample_data_size = 0 ;
1277- if (reader -> fd >= 0 ) {
1278- close (reader -> fd );
1279- reader -> fd = -1 ; /* Mark as closed */
1280- }
12811266#else
12821267 if (reader -> fp ) {
1283- fclose (reader -> fp );
1268+ Py_fclose (reader -> fp );
12841269 reader -> fp = NULL ;
12851270 }
12861271 if (reader -> file_data ) {
0 commit comments