| @@ -231,7 +231,7 @@ static settings cfg = {0, 0, 0, 0, 0, 1, 1, 0, 0, 4}; | |||
| static struct entry *dents; | |||
| static char *pnamebuf; | |||
| static int ndents, cur, total_dents; | |||
| static int ndents, cur, total_dents = ENTRY_INCR; | |||
| static uint idle; | |||
| static uint idletimeout; | |||
| static char *player; | |||
| @@ -1224,26 +1224,25 @@ resetdircolor(mode_t mode) | |||
| * Replace escape characters in a string with '?' | |||
| * Adjust string length to maxcols if > 0; | |||
| * | |||
| * Interestingly, note that buffer points to g_buf. What happens if | |||
| * Interestingly, note that unescape() uses g_buf. What happens if | |||
| * str also points to g_buf? In this case we assume that the caller | |||
| * acknowledges that it's OK to lose the data in g_buf after this | |||
| * call to unescape(). | |||
| * The API, on its part, first converts str to multibyte (after which | |||
| * it doesn't touch str anymore). Only after that it starts modifying | |||
| * buffer. This works like a phased operation. | |||
| * g_buf. This is a phased operation. | |||
| */ | |||
| static char * | |||
| unescape(const char *str, uint maxcols) | |||
| { | |||
| static wchar_t wbuf[PATH_MAX] __attribute__ ((aligned)); | |||
| static char * const buffer = g_buf; | |||
| static wchar_t *buf; | |||
| static size_t len; | |||
| /* Convert multi-byte to wide char */ | |||
| len = mbstowcs(wbuf, str, PATH_MAX); | |||
| buffer[0] = '\0'; | |||
| g_buf[0] = '\0'; | |||
| buf = wbuf; | |||
| if (maxcols && len > maxcols) { | |||
| @@ -1261,8 +1260,8 @@ unescape(const char *str, uint maxcols) | |||
| } | |||
| /* Convert wide char to multi-byte */ | |||
| wcstombs(buffer, wbuf, PATH_MAX); | |||
| return buffer; | |||
| wcstombs(g_buf, wbuf, PATH_MAX); | |||
| return g_buf; | |||
| } | |||
| static char * | |||
| @@ -1799,27 +1798,22 @@ sum_bsizes(const char *fpath, const struct stat *sb, | |||
| } | |||
| /* | |||
| * Wrapper to realloc() to ensure 16-byte alignment | |||
| * Wrapper to realloc() | |||
| * Frees current memory if realloc() fails and returns NULL. | |||
| * | |||
| * As per the docs, the *alloc() family is supposed to be memory aligned: | |||
| * Ubuntu: http://manpages.ubuntu.com/manpages/xenial/man3/malloc.3.html | |||
| * OS X: https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/malloc.3.html | |||
| */ | |||
| static void * | |||
| aligned_realloc(void *pcur, size_t curlen, size_t newlen) | |||
| xrealloc(void *pcur, size_t len) | |||
| { | |||
| void *pmem; | |||
| static void *pmem; | |||
| pmem = realloc(pcur, newlen); | |||
| pmem = realloc(pcur, len); | |||
| if (!pmem && pcur) | |||
| free(pcur); | |||
| if (!((size_t)pmem & _ALIGNMENT_MASK)) { | |||
| pcur = aligned_alloc(_ALIGNMENT, newlen); | |||
| if (pcur) | |||
| memcpy(pcur, pmem, curlen); | |||
| free(pmem); | |||
| pmem = pcur; | |||
| } | |||
| return pmem; | |||
| } | |||
| @@ -1903,7 +1897,7 @@ dentfill(char *path, struct entry **dents, | |||
| if (n == total_dents) { | |||
| total_dents += ENTRY_INCR; | |||
| *dents = aligned_realloc(*dents, (total_dents - ENTRY_INCR) * sizeof(**dents), total_dents * sizeof(**dents)); | |||
| *dents = xrealloc(*dents, total_dents * sizeof(**dents)); | |||
| if (*dents == NULL) { | |||
| if (pnamebuf) | |||
| free(pnamebuf); | |||
| @@ -1917,7 +1911,7 @@ dentfill(char *path, struct entry **dents, | |||
| namebuflen += NAMEBUF_INCR; | |||
| pnb = pnamebuf; | |||
| pnamebuf = (char *)aligned_realloc(pnamebuf, namebuflen - NAMEBUF_INCR, namebuflen); | |||
| pnamebuf = (char *)xrealloc(pnamebuf, namebuflen); | |||
| if (pnamebuf == NULL) { | |||
| free(*dents); | |||
| errexit(); | |||
| @@ -2190,14 +2184,13 @@ browse(char *ipath, char *ifilter) | |||
| else | |||
| presel = 0; | |||
| total_dents += ENTRY_INCR; | |||
| dents = aligned_realloc(dents, 0, total_dents * sizeof(struct entry)); | |||
| dents = xrealloc(dents, total_dents * sizeof(struct entry)); | |||
| if (dents == NULL) | |||
| errexit(); | |||
| DPRINTF_P(dents); | |||
| /* Allocate buffer to hold names */ | |||
| pnamebuf = (char *)aligned_realloc(pnamebuf, 0, NAMEBUF_INCR); | |||
| pnamebuf = (char *)xrealloc(pnamebuf, NAMEBUF_INCR); | |||
| if (pnamebuf == NULL) { | |||
| free(dents); | |||
| errexit(); | |||