aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2019-11-30 03:51:29 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2019-11-30 03:51:29 +0530
commitef88a31a7ce632f35b538ff64466489902076883 (patch)
tree09f580855704332ff2cc0cb5676077e5865b2e54
parentf231c35ef90b5e2124e94a79fe784be97d442d16 (diff)
downloadnnn-ef88a31a7ce632f35b538ff64466489902076883.tar.gz
Do not access invalid lastdir
-rw-r--r--src/nnn.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/nnn.c b/src/nnn.c
index 72ab596..af53254 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -4132,6 +4132,7 @@ static void browse(char *ipath, const char *session)
char rundir[PATH_MAX] __attribute__ ((aligned));
char runfile[NAME_MAX + 1] __attribute__ ((aligned));
uchar opener_flags = (cfg.cliopener ? F_CLI : (F_NOTRACE | F_NOWAIT));
+ uint utmp;
int r = -1, fd, presel, selstartid = 0, selendid = 0;
ino_t inode = 0;
enum action sel;
@@ -4172,7 +4173,7 @@ static void browse(char *ipath, const char *session)
errexit();
begin:
- if (cfg.selmode && nselected)
+ if (cfg.selmode && nselected && lastdir[0])
updateselbuf(lastdir, newpath);
#ifdef LINUX_INOTIFY
@@ -4804,6 +4805,16 @@ nochange:
if (rangesel)
rangesel = FALSE;
+ /* Write the path to selection file to avoid flush */
+ if (!(dents[cur].flags & FILE_SELECTED)) {
+ utmp = selbufpos;
+ appendfpath(newpath, mkpath(path, dents[cur].name, newpath));
+ writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
+ spawn(copier, NULL, NULL, NULL, F_NOTRACE);
+ selbufpos = utmp;
+ }
+
+ /* Toggle selection status */
dents[cur].flags ^= FILE_SELECTED;
dents[cur].flags ? ++nselected : --nselected;
@@ -4862,11 +4873,24 @@ nochange:
selendid = ndents - 1;
}
+ /* Remember current selection buffer position */
+ utmp = selbufpos;
+
for (r = selstartid; r <= selendid; ++r)
if (!(dents[r].flags & FILE_SELECTED)) {
+ /* Write the path to selection file to avoid flush */
+ appendfpath(newpath, mkpath(path, dents[r].name, newpath));
+
dents[r].flags |= FILE_SELECTED;
++nselected;
}
+
+ if (selbufpos != utmp) {
+ writesel(pselbuf, selbufpos - 1); /* Truncate NULL from end */
+ spawn(copier, NULL, NULL, NULL, F_NOTRACE);
+ /* Restore current selection buffer position */
+ selbufpos = utmp;
+ }
continue;
case SEL_SELLIST:
if (listselbuf(path, newpath) || listselfile()) {