Re: [AD] Mac OS X: file_exists bus error

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


I think this is not Mac specific.
file_exists uses al_findfirst, and al_findfirst takes a shortcut if
there are no wildcards in the path specified (src/unix/ufile.c:336) In
this case, the 'dir' member of the find info is unused. (If there are
wildcards, it holds the opendir structure)
The problem is that al_findclose calls closedir regardless.
Patch attached.

Pete


On 5/31/06, Jay Bernardo <allegrolist@xxxxxxxxxx> wrote:

In the latest revision of the 4.2 branch of Allegro code (5817 at time of
writing) there is a problem with the file_exists function. Apparently, if
the specific file you're looking for does not exist, nothing bad happens (it
operates as intended). However, if it does exist, we get a bus error. I'm
going to paste in the test program I wrote to ensure that it's broken in
general (and not just in my project) as well as a backtrace after running it
through GDB and making it produce the bus error as this information is
probably useful.

Some notes about the code: currently it just looks for the directory
"hello." I also tried nesting directories in the form of "hello/foo." If foo
did not exist, the program worked fine. If foo did exist, but was not a
directory, the program ran fine. If foo existed and was a directory, we get
the bus error. The same symptoms happen when searching for normal files
using the attribute of "~FA_DIREC" (anything but a directory)


Running PPC Mac OS X 10.4.6. I did a fresh update/depend/make/install/etc.
If you need any more information, let me know

-Jay

CODE:
---
#include <allegro.h>

int main()
{
        allegro_init();
        if(file_exists("hello", FA_DIREC, NULL) == 0)
        {
                fprintf(stderr, "The directory doesn't exist!\n");
        }
        else
        {
                printf("Directory found!\n");
        }
        return 0;
}
END_OF_MAIN()
---

GDB Backtrace:
---
(gdb) file a.out
Reading symbols for shared libraries .... done
Reading symbols from /Users/jay/Desktop/test/a.out...done.
(gdb) run
Starting program: /Users/jay/Desktop/test/a.out
Reading symbols for shared libraries
................................................................................
done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000020
[Switching to process 3641 thread 0x3503]
0x900017dc in pthread_mutex_lock ()
(gdb) backtrace
#0  0x900017dc in pthread_mutex_lock ()
#1  0x9001b258 in closedir ()
#2  0x300cc0ac in al_findclose ()
#3  0x30027fb4 in file_exists ()
#4  0x00002a70 in _mangled_main ()
#5  0x00002f8c in call_user_main ()
#6  0x00002fcc in +[AllegroAppDelegate app_main:] ()
#7  0x92976194 in forkThreadForFunction ()
#8  0x9002ba68 in _pthread_body ()


--
https://lists.sourceforge.net/lists/listinfo/alleg-developers


Index: src/unix/ufile.c
===================================================================
--- src/unix/ufile.c	(revision 5817)
+++ src/unix/ufile.c	(working copy)
@@ -468,7 +468,9 @@
    struct FF_DATA *ff_data = (struct FF_DATA *) info->ff_data;
 
    if (ff_data) {
-      closedir(ff_data->dir);
+      if (ff_data->dir) {
+         closedir(ff_data->dir);
+      }
       _AL_FREE(ff_data);
       info->ff_data = NULL;
 


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/