[#290] — Florian Frank <flori@...>
Hi all,
5 messages
2002/08/03
[#297] GC longjmp macros — Michal Rokos <m.rokos@...>
Hi,
5 messages
2002/08/05
[#308] Q: OSSL in std. distr? — Michal Rokos <m.rokos@...>
Hi,
4 messages
2002/08/08
[#326] Implications of a #force_free method in Object? — Matthew Bloch <mattbee@...>
Hello;
8 messages
2002/08/19
[#328] Int vs Long — Michal Rokos <m.rokos@...>
Hi,
7 messages
2002/08/21
[#337] Int vs Long (2nd part) — Michal Rokos <m.rokos@...>
Hi,
7 messages
2002/08/22
[#340] Int vs Long #3 — Michal Rokos <m.rokos@...>
Hi,
9 messages
2002/08/22
[#344] Re: [Cleanup] Int vs Long #3
— nobu.nokada@...
2002/08/22
Hi,
[#348] Re: [Cleanup] Int vs Long #3
— Michal Rokos <m.rokos@...>
2002/08/23
Hello,
[#353] File (struct stat handling) — Michal Rokos <m.rokos@...>
Hello,
6 messages
2002/08/23
[#358] node.h for eval.c — Michal Rokos <m.rokos@...>
Hi,
5 messages
2002/08/23
[#372] rb_class_path — Michal Rokos <m.rokos@...>
Hello,
7 messages
2002/08/27
[#382] Port match to new dup, clone framework — Michal Rokos <m.rokos@...>
Hi,
5 messages
2002/08/28
[#393] in dln.c — Michal Rokos <m.rokos@...>
Hi,
14 messages
2002/08/30
[#398] Re: [MemLeak] in dln.c
— nobu.nokada@...
2002/08/31
Hi,
[#403] Re: [MemLeak] in dln.c
— Michal Rokos <m.rokos@...>
2002/09/02
Hello,
Re: [MemLeak] in dln.c
From:
nobu.nokada@...
Date:
2002-08-31 00:01:00 UTC
List:
ruby-core #398
Hi,
At Fri, 30 Aug 2002 23:38:27 +0900,
Michal Rokos wrote:
> if ((init_fct = (void(*)())GetProcAddress(handle, buf)) == NULL) {
> - rb_loaderror("%s - %s\n%s", dln_strerror(), buf, file);
> + rb_loaderror("%s - %s\n%s", dln_strerror(), buf, file); /* FIXME: MEMLEAK for buf */
> }
> free(buf);
This looks tiresome.
Which do you prefer?
(1) copy it to ALLOCAed string if necessary.
diff -u -2 -p -r1.38 dln.c
--- dln.c 25 Jun 2002 09:44:57 -0000 1.38
+++ dln.c 30 Aug 2002 23:56:30 -0000
@@ -1236,4 +1236,6 @@ aix_loaderror(const char *pathname)
#endif
+#define ASTRDUP(s) do {char *tmp = strcpy(ALLOCA_N(char, strlen(s) + 1)), free(s), (s) = tmp} while (0)
+
void*
dln_load(file)
@@ -1265,4 +1267,5 @@ dln_load(file)
if ((init_fct = (void(*)())GetProcAddress(handle, buf)) == NULL) {
+ ASTRDUP(buf);
rb_loaderror("%s - %s\n%s", dln_strerror(), buf, file);
}
@@ -1473,5 +1476,5 @@ dln_load(file)
char errmsg[] = "Internal of BeOS version. %.200s (symbol_name = %s)";
unload_add_on(img_id);
- free(buf);
+ ASTRDUP(buf);
rb_loaderror(errmsg, strerror(err_stat), buf);
}
(2) always copy it to ALLOCAed string and remove all free(buf)
lines.
diff -u -2 -p -r1.38 dln.c
--- dln.c 25 Jun 2002 09:44:57 -0000 1.38
+++ dln.c 30 Aug 2002 23:39:55 -0000
@@ -105,5 +105,5 @@ int eaccess();
static void
-init_funcname(buf, file)
+init_funcname_len(buf, file)
char **buf;
char *file;
@@ -132,5 +132,12 @@ init_funcname(buf, file)
}
}
+ return p - *buf;
}
+#define init_funcname(buf, file) do { \
+ int len = init_funcname_len(buf, file); \
+ char *tmp = strcpy(ALLOCA(char, len+1), (*buf)); \
+ free(*buf); \
+ *(buf) = tmp; \
+} while (0)
#ifdef USE_DLN_A_OUT
(3) make init_funcname() to return VALUE and caller to hold it,
and remove all free(buf) lines.
diff -u -2 -p -r1.38 dln.c
--- dln.c 25 Jun 2002 09:44:57 -0000 1.38
+++ dln.c 30 Aug 2002 23:42:40 -0000
@@ -104,6 +104,6 @@ int eaccess();
#endif
-static void
-init_funcname(buf, file)
+static VALUE
+init_funcname(file)
char **buf;
char *file;
@@ -132,4 +132,5 @@ init_funcname(buf, file)
}
}
+ return Data_Wrap_Struct(rb_cData, 0, -1, *buf);
}
--
Nobu Nakada