fish memory leaks
Andrew V. Samoilov
samoilov at fromru.com
Mon Nov 29 12:04:33 UTC 2004
Hi!
--
Regards,
Andrew V. Samoilov
-------------- next part --------------
vfs/ChangeLog:
* fish.c (fish_file_store): Check write() more carefully.
(PREFIX): Fix memory leak.
(fish_##name): Likewise.
(fish_chown): Likewise.
--- fish.c.sav Fri Oct 29 09:30:07 2004
+++ fish.c Mon Nov 29 13:42:47 2004
@@ -542,6 +542,7 @@ fish_file_store(struct vfs_class *me, st
total = 0;
while (1) {
+ int t;
while ((n = read(h, buffer, sizeof(buffer))) < 0) {
if ((errno == EINTR) && got_interrupt())
continue;
@@ -551,8 +552,12 @@ fish_file_store(struct vfs_class *me, st
}
if (n == 0)
break;
- while (write(SUP.sockw, buffer, n) < 0) {
- me->verrno = errno;
+ if ((t = write (SUP.sockw, buffer, n)) != n) {
+ if (t == -1) {
+ me->verrno = errno
+ } else {
+ me->verrno = EIO;
+ }
goto error_return;
}
disable_interrupt_key();
@@ -692,15 +697,17 @@ fish_send_command(struct vfs_class *me,
#define PREFIX \
char buf[BUF_LARGE]; \
- char *rpath, *mpath; \
+ char *rpath, *mpath = g_strdup (path); \
struct vfs_s_super *super; \
- if (!(rpath = vfs_s_get_path_mangle(me, mpath = g_strdup(path), &super, 0))) \
+ if (!(rpath = vfs_s_get_path_mangle (me, mpath, &super, 0))) { \
+ g_free (mpath); \
return -1; \
- rpath = name_quote (rpath, 0);
+ } \
+ rpath = name_quote (rpath, 0); \
+ g_free (mpath);
#define POSTFIX(flags) \
g_free (rpath); \
- g_free (mpath); \
return fish_send_command(me, super, buf, flags);
static int
@@ -721,17 +728,22 @@ static int fish_##name (struct vfs_class
char buf[BUF_LARGE]; \
char *rpath1, *rpath2, *mpath1, *mpath2; \
struct vfs_s_super *super1, *super2; \
- if (!(rpath1 = vfs_s_get_path_mangle(me, mpath1 = g_strdup(path1), &super1, 0))) \
+ if (!(rpath1 = vfs_s_get_path_mangle (me, mpath1 = g_strdup(path1), &super1, 0))) { \
+ g_free (mpath1); \
return -1; \
- if (!(rpath2 = vfs_s_get_path_mangle(me, mpath2 = g_strdup(path2), &super2, 0))) \
+ } \
+ if (!(rpath2 = vfs_s_get_path_mangle (me, mpath2 = g_strdup(path2), &super2, 0))) { \
+ g_free (mpath1); \
+ g_free (mpath2); \
return -1; \
+ } \
rpath1 = name_quote (rpath1, 0); \
+ g_free (mpath1); \
rpath2 = name_quote (rpath2, 0); \
+ g_free (mpath2); \
g_snprintf(buf, sizeof(buf), string "\n", rpath1, rpath2, rpath1, rpath2); \
g_free (rpath1); \
g_free (rpath2); \
- g_free (mpath1); \
- g_free (mpath2); \
return fish_send_command(me, super2, buf, OPT_FLUSH); \
}
@@ -763,7 +775,6 @@ fish_chown (struct vfs_class *me, const
char *sowner, *sgroup;
struct passwd *pw;
struct group *gr;
- PREFIX
if ((pw = getpwuid (owner)) == NULL)
return 0;
@@ -773,22 +784,25 @@ fish_chown (struct vfs_class *me, const
sowner = pw->pw_name;
sgroup = gr->gr_name;
- g_snprintf(buf, sizeof(buf),
- "#CHOWN /%s /%s\n"
+ {
+ PREFIX
+ g_snprintf (buf, sizeof(buf),
+ "#CHOWN /%s /%s\n"
"chown %s /%s 2>/dev/null\n"
"echo '### 000'\n",
sowner, rpath,
sowner, rpath);
- fish_send_command(me, super, buf, OPT_FLUSH);
- /* FIXME: what should we report if chgrp succeeds but chown fails? */
- g_snprintf(buf, sizeof(buf),
+ fish_send_command (me, super, buf, OPT_FLUSH);
+ /* FIXME: what should we report if chgrp succeeds but chown fails? */
+ g_snprintf (buf, sizeof(buf),
"#CHGRP /%s /%s\n"
"chgrp %s /%s 2>/dev/null\n"
"echo '### 000'\n",
sgroup, rpath,
sgroup, rpath);
- /* fish_send_command(me, super, buf, OPT_FLUSH); */
- POSTFIX(OPT_FLUSH)
+ /* fish_send_command(me, super, buf, OPT_FLUSH); */
+ POSTFIX (OPT_FLUSH)
+ }
}
static int fish_unlink (struct vfs_class *me, const char *path)
More information about the mc-devel
mailing list