diff options
author | 2019-11-30 03:51:29 +0530 | |
---|---|---|
committer | 2019-11-30 03:51:29 +0530 | |
commit | ef88a31a7ce632f35b538ff64466489902076883 (patch) | |
tree | 09f580855704332ff2cc0cb5676077e5865b2e54 | |
parent | f231c35ef90b5e2124e94a79fe784be97d442d16 (diff) | |
download | nnn-ef88a31a7ce632f35b538ff64466489902076883.tar.gz |
Do not access invalid lastdir
-rw-r--r-- | src/nnn.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -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()) { |