#include "sysfile.h"
#include "console-stream.h"
#include "dumper.h"
+#include "sysdep.h"
#ifdef WIN32_NATIVE
#include "nt.h"
static void *pdump_buf;
static FILE *pdump_out;
+#ifdef UTF2000
+#define PDUMP_HASHSIZE 20000001
+#else
#define PDUMP_HASHSIZE 200001
+#endif
static pdump_entry_list_elt **pdump_hash;
stderr_out ("Unsupported count type : %d (line = %d, code=%ld)\n",
idesc[line].type, line, (long)code);
pdump_backtrace ();
- abort ();
+ ABORT ();
}
count += delta;
return count;
default:
stderr_out ("Unsupported dump type : %d\n", desc[pos].type);
pdump_backtrace ();
- abort ();
+ ABORT ();
};
}
}
if (imp->description)
{
int me = depth++;
- if (me>65536)
+ if (me>=65536)
{
stderr_out ("Backtrace overflow, loop ?\n");
- abort ();
+ ABORT ();
}
backtrace[me].obj = objh;
backtrace[me].position = 0;
{
int me = depth++;
int i;
- if (me>65536)
+ if (me>=65536)
{
stderr_out ("Backtrace overflow, loop ?\n");
- abort ();
+ ABORT ();
}
backtrace[me].obj = 0;
backtrace[me].position = 0;
}
default:
stderr_out ("Unsupported dump type : %d\n", desc[pos].type);
- abort ();
+ ABORT ();
}
}
}
}
default:
stderr_out ("Unsupported dump type : %d\n", desc[pos].type);
- abort ();
+ ABORT ();
};
}
}
t_frame = Vterminal_frame; Vterminal_frame = Qnil;
t_device = Vterminal_device; Vterminal_device = Qnil;
- dump_add_opaque (&lrecord_implementations_table,
+ dump_add_opaque ((void *) &lrecord_implementations_table,
lrecord_type_count * sizeof (lrecord_implementations_table[0]));
dump_add_opaque (&lrecord_markers,
lrecord_type_count * sizeof (lrecord_markers[0]));
pdump_dump_root_objects ();
fclose (pdump_out);
- close (pdump_fd);
+ /* pdump_fd is already closed by the preceding fclose call
+ close (pdump_fd); */
free (pdump_buf);
int
pdump_load (const char *argv0)
{
- char exe_path[PATH_MAX];
+ char exe_path[PATH_MAX], real_exe_path[PATH_MAX];
#ifdef WIN32_NATIVE
GetModuleFileName (NULL, exe_path, PATH_MAX);
+ /* #### urk, needed for xrealpath() below */
+ Vdirectory_sep_char = make_char ('\\');
#else /* !WIN32_NATIVE */
char *w;
const char *dir, *p;
}
strcpy (w, name);
- /* ### #$%$#^$^@%$^#%@$ ! */
-#ifdef access
-#undef access
-#endif
+ /* Check that exe_path is executable and not a directory */
+#undef access /* avoid !@#$%^& encapsulated access */
+#undef stat /* avoid !@#$%^& encapsulated stat */
+ {
+ struct stat statbuf;
+ if (access (exe_path, X_OK) == 0
+ && stat (exe_path, &statbuf) == 0
+ && ! S_ISDIR (statbuf.st_mode))
+ break;
+ }
- if (!access (exe_path, X_OK))
- break;
if (!*p)
{
/* Oh well, let's have some kind of default */
}
#endif /* WIN32_NATIVE */
- if (pdump_file_try (exe_path))
+ /* Save exe_path because pdump_file_try() modifies it */
+ strcpy(real_exe_path, exe_path);
+ if (pdump_file_try (exe_path)
+ || (xrealpath(real_exe_path, real_exe_path)
+ && pdump_file_try (real_exe_path)))
{
pdump_load_finish ();
return 1;