mirror of
https://github.com/MidnightCommander/mc
synced 2025-04-12 10:02:52 +03:00
* fish.c (fish_file_store): Check write() more carefully.
(PREFIX): Fix memory leak. (fish_##name): Likewise. (fish_chown): Likewise.
This commit is contained in:
parent
0cd8f81bdc
commit
a2bcbdb52c
@ -1,3 +1,10 @@
|
|||||||
|
2004-11-29 Andrew V. Samoilov <sav@bcs.zp.ua>
|
||||||
|
|
||||||
|
* fish.c (fish_file_store): Check write() more carefully.
|
||||||
|
(PREFIX): Fix memory leak.
|
||||||
|
(fish_##name): Likewise.
|
||||||
|
(fish_chown): Likewise.
|
||||||
|
|
||||||
2004-11-26 Andrew V. Samoilov <sav@bcs.zp.ua>
|
2004-11-26 Andrew V. Samoilov <sav@bcs.zp.ua>
|
||||||
|
|
||||||
* direntry.c (vfs_s_open): Fix memory leak.
|
* direntry.c (vfs_s_open): Fix memory leak.
|
||||||
|
50
vfs/fish.c
50
vfs/fish.c
@ -542,6 +542,7 @@ fish_file_store(struct vfs_class *me, struct vfs_s_fh *fh, char *name, char *loc
|
|||||||
total = 0;
|
total = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
int t;
|
||||||
while ((n = read(h, buffer, sizeof(buffer))) < 0) {
|
while ((n = read(h, buffer, sizeof(buffer))) < 0) {
|
||||||
if ((errno == EINTR) && got_interrupt())
|
if ((errno == EINTR) && got_interrupt())
|
||||||
continue;
|
continue;
|
||||||
@ -551,8 +552,12 @@ fish_file_store(struct vfs_class *me, struct vfs_s_fh *fh, char *name, char *loc
|
|||||||
}
|
}
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
break;
|
break;
|
||||||
while (write(SUP.sockw, buffer, n) < 0) {
|
if ((t = write (SUP.sockw, buffer, n)) != n) {
|
||||||
me->verrno = errno;
|
if (t == -1) {
|
||||||
|
me->verrno = errno
|
||||||
|
} else {
|
||||||
|
me->verrno = EIO;
|
||||||
|
}
|
||||||
goto error_return;
|
goto error_return;
|
||||||
}
|
}
|
||||||
disable_interrupt_key();
|
disable_interrupt_key();
|
||||||
@ -692,15 +697,17 @@ fish_send_command(struct vfs_class *me, struct vfs_s_super *super, const char *c
|
|||||||
|
|
||||||
#define PREFIX \
|
#define PREFIX \
|
||||||
char buf[BUF_LARGE]; \
|
char buf[BUF_LARGE]; \
|
||||||
char *rpath, *mpath; \
|
char *rpath, *mpath = g_strdup (path); \
|
||||||
struct vfs_s_super *super; \
|
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; \
|
return -1; \
|
||||||
rpath = name_quote (rpath, 0);
|
} \
|
||||||
|
rpath = name_quote (rpath, 0); \
|
||||||
|
g_free (mpath);
|
||||||
|
|
||||||
#define POSTFIX(flags) \
|
#define POSTFIX(flags) \
|
||||||
g_free (rpath); \
|
g_free (rpath); \
|
||||||
g_free (mpath); \
|
|
||||||
return fish_send_command(me, super, buf, flags);
|
return fish_send_command(me, super, buf, flags);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -721,17 +728,22 @@ static int fish_##name (struct vfs_class *me, const char *path1, const char *pat
|
|||||||
char buf[BUF_LARGE]; \
|
char buf[BUF_LARGE]; \
|
||||||
char *rpath1, *rpath2, *mpath1, *mpath2; \
|
char *rpath1, *rpath2, *mpath1, *mpath2; \
|
||||||
struct vfs_s_super *super1, *super2; \
|
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; \
|
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; \
|
return -1; \
|
||||||
|
} \
|
||||||
rpath1 = name_quote (rpath1, 0); \
|
rpath1 = name_quote (rpath1, 0); \
|
||||||
|
g_free (mpath1); \
|
||||||
rpath2 = name_quote (rpath2, 0); \
|
rpath2 = name_quote (rpath2, 0); \
|
||||||
|
g_free (mpath2); \
|
||||||
g_snprintf(buf, sizeof(buf), string "\n", rpath1, rpath2, rpath1, rpath2); \
|
g_snprintf(buf, sizeof(buf), string "\n", rpath1, rpath2, rpath1, rpath2); \
|
||||||
g_free (rpath1); \
|
g_free (rpath1); \
|
||||||
g_free (rpath2); \
|
g_free (rpath2); \
|
||||||
g_free (mpath1); \
|
|
||||||
g_free (mpath2); \
|
|
||||||
return fish_send_command(me, super2, buf, OPT_FLUSH); \
|
return fish_send_command(me, super2, buf, OPT_FLUSH); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -763,7 +775,6 @@ fish_chown (struct vfs_class *me, const char *path, int owner, int group)
|
|||||||
char *sowner, *sgroup;
|
char *sowner, *sgroup;
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
struct group *gr;
|
struct group *gr;
|
||||||
PREFIX
|
|
||||||
|
|
||||||
if ((pw = getpwuid (owner)) == NULL)
|
if ((pw = getpwuid (owner)) == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
@ -773,22 +784,25 @@ fish_chown (struct vfs_class *me, const char *path, int owner, int group)
|
|||||||
|
|
||||||
sowner = pw->pw_name;
|
sowner = pw->pw_name;
|
||||||
sgroup = gr->gr_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"
|
"chown %s /%s 2>/dev/null\n"
|
||||||
"echo '### 000'\n",
|
"echo '### 000'\n",
|
||||||
sowner, rpath,
|
sowner, rpath,
|
||||||
sowner, rpath);
|
sowner, rpath);
|
||||||
fish_send_command(me, super, buf, OPT_FLUSH);
|
fish_send_command (me, super, buf, OPT_FLUSH);
|
||||||
/* FIXME: what should we report if chgrp succeeds but chown fails? */
|
/* FIXME: what should we report if chgrp succeeds but chown fails? */
|
||||||
g_snprintf(buf, sizeof(buf),
|
g_snprintf (buf, sizeof(buf),
|
||||||
"#CHGRP /%s /%s\n"
|
"#CHGRP /%s /%s\n"
|
||||||
"chgrp %s /%s 2>/dev/null\n"
|
"chgrp %s /%s 2>/dev/null\n"
|
||||||
"echo '### 000'\n",
|
"echo '### 000'\n",
|
||||||
sgroup, rpath,
|
sgroup, rpath,
|
||||||
sgroup, rpath);
|
sgroup, rpath);
|
||||||
/* fish_send_command(me, super, buf, OPT_FLUSH); */
|
/* fish_send_command(me, super, buf, OPT_FLUSH); */
|
||||||
POSTFIX(OPT_FLUSH)
|
POSTFIX (OPT_FLUSH)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fish_unlink (struct vfs_class *me, const char *path)
|
static int fish_unlink (struct vfs_class *me, const char *path)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user