dos.library: Fix C:AddDataTypes on OS 3.9
authorjmcmullan <jmcmullan@fb15a70f-31f2-0310-bbcc-cdcc74a49acc>
Sun, 21 Jul 2013 15:03:06 +0000 (21 15:03 +0000)
committerjmcmullan <jmcmullan@fb15a70f-31f2-0310-bbcc-cdcc74a49acc>
Sun, 21 Jul 2013 15:03:06 +0000 (21 15:03 +0000)
C:AddDataTypes on OS 3.9 was not passing a FH to InternalLoadSeg,
which was causing NameFromFH() in our internal segtracker to
die.

Resolved by using fh_Func2 to hold a 'this is a filehandle' marker.

Signed-off-by: Jason S. McMullan <jason.mcmullan@gmail.com>
git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@47747 fb15a70f-31f2-0310-bbcc-cdcc74a49acc

rom/dos/allocdosobject.c
rom/dos/dos_intern.h
rom/dos/internalloadseg_support.c

index fab282d..ea99c0d 100644 (file)
@@ -66,6 +66,8 @@
 
             fh->fh_Pos = -1;
             fh->fh_End = -1;
+
+            fh->fh_Func2 = DOS_FH_MAGIC;
         }
         return mem;
 
index 45b3b1e..b2b0efb 100644 (file)
@@ -89,6 +89,10 @@ struct vfp
  ((struct FileHandle *)BADDR(f))->fh_Pos<((struct FileHandle *)BADDR(f))->fh_End? \
 *((struct FileHandle *)BADDR(f))->fh_Pos++=c,0:FPutC(f,c))
 
+#define DOS_FH_MAGIC    AROS_MAKE_ID('F','h','n','d')
+#define ISFILEHANDLE(f) \
+    ((((struct FileHandle *)BADDR(f))->fh_Func2) == DOS_FH_MAGIC)
+
 /* Softlink handling */
 STRPTR ResolveSoftlink(BPTR cur, struct DevProc *dvp, CONST_STRPTR name, struct DosLibrary *DOSBase);
 LONG RootDir(struct DevProc *dvp, struct DosLibrary *DOSBase);
index 37a5cd1..51c99f5 100644 (file)
@@ -9,7 +9,14 @@
 
 static char *getname(BPTR file, char **bufferp, struct DosLibrary *DOSBase)
 {
-    if (DOSBase) {
+    /* Some applications pass a non-filehandle to
+     * Dos/InternalLoadSeg, so don't try to register
+     * the hunks if this is not a real FileHandle
+     *
+     * A real-life example of this is C:AddDataTypes
+     * from AmigaOS 3.9
+     */
+    if (ISFILEHANDLE(file) && DOSBase) {
         char *buffer = AllocMem(512, MEMF_ANY);
         if (buffer) {
             *bufferp = buffer;