diff --git a/nnn.c b/nnn.c index 99b54142..cccecc29 100644 --- a/nnn.c +++ b/nnn.c @@ -188,11 +188,11 @@ typedef unsigned char uchar; /* Directory entry */ typedef struct entry { - char name[NAME_MAX]; - mode_t mode; + char name[NAME_MAX + 1]; time_t t; off_t size; blkcnt_t blocks; /* number of 512B blocks allocated */ + mode_t mode; } *pEntry; /* Bookmark */ @@ -348,7 +348,7 @@ xstrlen(const char *s) static size_t xstrlcpy(char *dest, const char *src, size_t n) { - static size_t len, blocks; + static size_t len, blocks, lsize = sizeof(ulong); static const uint _WSHIFT = (sizeof(ulong) == 8) ? 3 : 2; if (!src || !dest) @@ -361,8 +361,11 @@ xstrlcpy(char *dest, const char *src, size_t n) /* Save total number of bytes to copy in len */ len = n; - blocks = n >> _WSHIFT; - n -= (blocks << _WSHIFT); + if (n >= lsize) { + blocks = n >> _WSHIFT; + n -= (blocks << _WSHIFT); + } else + blocks = 0; if (blocks) { static ulong *s, *d; @@ -872,12 +875,11 @@ static void fill(struct entry **dents, int (*filter)(regex_t *, char *), regex_t *re) { static int count; + static struct entry _dent, *dentp1, *dentp2; for (count = 0; count < ndents; ++count) { if (filter(re, (*dents)[count].name) == 0) { if (count != --ndents) { - static struct entry _dent, *dentp1, *dentp2; - dentp1 = &(*dents)[count]; dentp2 = &(*dents)[ndents];